aixI Napisano Sierpień 25, 2012 Udostępnij Napisano Sierpień 25, 2012 Cześć, przy napisaniu tego kodu wzorowałem się na innych kodach i dla swoich potrzeb pozmieniałem. Proszę abyście zobaczyli czy czegoś nie brakuje i ewentualne poprawki. Kod: $regfile = "attiny2313def.dat" $crystal = 1000000 'Konfiguracja sterowania PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up 'Konfiguracja portów Config Portd = Output Config Portb = Output Silnik_lewy_a Alias Portd.2 Silnik_lewy_b Alias Portd.5 Silnik_prawy_b Alias Portd.3 Silnik_prawy_a Alias Portd.4 Dioda Alias Portd.0 'Granica reagowania na linię Const Granica = 455 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Gosub Wczytaj_stany_przetwornikow If Czujnik_srodkowy > Granica Then 'Silnik lewy - maksymalna prędkość Pwm1a = 255 'Silnik prawy - maksymalna prędkość Pwm1b = 255 Elseif Czujnik_lewy > Granica Then Pwm1a = 0 Pwm1b = 255 Elseif Czujnik_prawy > Granica Then Pwm1a = 255 Pwm1b = 0 Else Pwm1a = 255 Pwm1b = 255 End If Loop End Phil napisał, że używam komparatorów więc stała "Granica" jest u mnie zbędna i to, że If'y powinny być inne, bo inaczej odczytuje dane z czujników. I jeszcze żebym usuną Gosub Wczytaj_stany_przetwornikow https://www.forbot.pl/forum/topics38/attiny2313-l293d-line-follower-vt7327,25.htm <---- tutaj to pisze. AixI.
sosnus Sierpień 25, 2012 Udostępnij Sierpień 25, 2012 Phil napisał, że używam komparatorów więc stała "Granica" jest u mnie zbędna i to, że If'y powinny być inne, bo inaczej odczytuje dane z czujników. I jeszcze żebym usuną Gosub Wczytaj_stany_przetwornikow https://www.forbot.pl/forum/topics38/attiny2313-l293d-line-follower-vt7327,25.htm <---- tutaj to pisze. AixI. Podstawowe pytanie: Wiesz czym się różni wykrywanie linii za pomocą wewnętrznego przetwornika ADC od komparatorów? Od tego zależy działanie Twojego programu. Spójrz tutaj: http://leksykon.forbot.pl/ADC_(A/D),123.htm http://leksykon.forbot.pl/Komparator_analogowy,76.htm Jak to przeczytasz, może będziesz wiedział jakie zadanie ma stałą "granica" przy odczycie z ADC
aixI Sierpień 25, 2012 Autor tematu Udostępnij Sierpień 25, 2012 Przeczytałem o ADC i komparatorze. Czy teraz będzie kody wyglądał tak? $regfile = "2313def.dat" $crystal = 1000000 'Konfiguracja sterowania PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up 'Konfiguracja portów Config Portd = Output Config Portb = Output Silnik_lewy_a Alias Portd.2 Silnik_lewy_b Alias Portd.5 Silnik_prawy_b Alias Portd.3 Silnik_prawy_a Alias Portd.4 Dioda Alias Portd.0 'Granica reagowania na linię Const Granica = 355 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Set Led_blue If Sensor1 = 0 Then If Sensor3 = 1 Then Gosub Skrecaj_w_lewo Else Gosub Jedz_prosto End If Elseif Sensor3 = 0 Then If Sensor1 = 1 Then Gosub Skrecaj_w_prawo Else Gosub Jedz_prosto End If Else Gosub Jedz_prosto End If Loop End Edit: kompilator pokazuje 3 errory: Error : 31 Line : 34 Invalid datatype [[0006]] , in File : C\Documents and Settings\... Error : 31 Line : 35 Invalid datatype [[0006]] , in File : C\Documents and Settings\... Error : 124 Line : 0 LOOP expected , in File
sosnus Sierpień 25, 2012 Udostępnij Sierpień 25, 2012 Nie potrzebujesz stałej "granica" ponieważ rolę tego pełni u Ciebie potencjometr. Przekręcając go, działa to tak, jak zmiana wartości stałej "granica". Z komparatora do procesora wychodzi sygnał 0V lub 5V, Ty za pomocą programu musisz sprawdzić, czy na pinie jest sygnał (1) czy nie (0)
aixI Sierpień 25, 2012 Autor tematu Udostępnij Sierpień 25, 2012 Nie potrzebujesz stałej "granica" ponieważ rolę tego pełni u Ciebie potencjometr. Przekręcając go, działa to tak, jak zmiana wartości stałej "granica". Czyli muszę z kodu usunąć: 'Granica reagowania na linię Const Granica = 355
Ksawery Sierpień 26, 2012 Udostępnij Sierpień 26, 2012 Edit: kompilator pokazuje 3 errory: Error : 31 Line : 34 Invalid datatype [[0006]] , in File : C\Documents and Settings\... Error : 31 Line : 35 Invalid datatype [[0006]] , in File : C\Documents and Settings\... Error : 124 Line : 0 LOOP expected , in File Błędy pokazują się, bo nie zdefiniowałeś zmiennych i podprogramów.
aixI Sierpień 26, 2012 Autor tematu Udostępnij Sierpień 26, 2012 K.G. dzięki za odp. ale nie mogę sobie z tym poradzić ;/ Kod: $regfile = "2313def.dat" $crystal = 1000000 'Konfiguracja sterowania PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up 'Konfiguracja portów Config Portd = Output Config Portb = Output 'Opis prtów 'Enable1 - silnik lewy - Portb.4 (PWM1A) 'Enable2 - silnik prawy - PortB.3 (PWM1B) 'Input1 - Silnik lewy A - PortD.2 'Input2 - Silnik lewy B - PortD.5 'Input3 - Silnik prawy A - PortD.3 'Input4 - Silnik prawy B - PortD.4 'Dioda - PortD.0 Sensor_1 Alias Portb.5 Sensor_2 Alias Portb.6 Sensor_3 Alias Portb.7 Silnik_lewy_a Alias Portd.2 Silnik_lewy_b Alias Portd.5 Silnik_prawy_b Alias Portd.3 Silnik_prawy_a Alias Portd.4 Led Alias Portd.00 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Set Led_blue If Sensor_1 = 0 Then If Sensor_3 = 1 Then Gosub Skrecaj_w_lewo Else Gosub Jedz_prosto End If Elseif Sensor_3 = 0 Then If Sensor_1 = 1 Then Gosub Skrecaj_w_prawo Else Gosub Jedz_prosto End If Else Gosub Jedz_prosto End If Loop End
Ksawery Sierpień 26, 2012 Udostępnij Sierpień 26, 2012 W tym programie jest wiele błędów, więc chociaż te poprawisz pojawią się kolejne. Na pierwszy rzut oka: - nadal brakuje podprogramów sterującymi silnikami - nigdzie nie definiujesz aliasów Dioda i Led_blue - definicja aliasu zawiera błąd (dwa zera): Led Alias Portd.00
aixI Sierpień 26, 2012 Autor tematu Udostępnij Sierpień 26, 2012 definicja aliasu zawiera błąd (dwa zera): Poprawiłem. nigdzie nie definiujesz aliasów Dioda i Led_blue To jak mam Set Dioda to mam napisać Set Dioda portd.0 ? I tak samo z Led_blue na Led_blue portd.0 ?? nadal brakuje podprogramów sterującymi silnikami Znalazłem na necie i zmieniłem dla swoich potrzeb. Kod: $regfile = "2313def.dat" $crystal = 1000000 'Konfiguracja sterowania PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up 'Konfiguracja portów Config Portd = Output Config Portb = Output 'Opis prtów 'Enable1 - silnik lewy - Portb.4 (PWM1A) 'Enable2 - silnik prawy - PortB.3 (PWM1B) 'Input1 - Silnik lewy A - PortD.2 'Input2 - Silnik lewy B - PortD.5 'Input3 - Silnik prawy A - PortD.3 'Input4 - Silnik prawy B - PortD.4 'Dioda - PortD.0 Sensor_1 Alias Portb.5 Sensor_2 Alias Portb.6 Sensor_3 Alias Portb.7 Silnik_lewy_a Alias Portd.2 Silnik_lewy_b Alias Portd.5 Silnik_prawy_a Alias Portd.4 Silnik_prawy_b Alias Portd.3 Led Alias Portd.0 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Set Led_blue If Sensor_1 = 0 Then If Sensor_3 = 1 Then Gosub Skrecaj_w_lewo Else Gosub Jedz_prosto End If Elseif Sensor_3 = 0 Then If Sensor_1 = 1 Then Gosub Skrecaj_w_prawo Else Gosub Jedz_prosto End If Else Gosub Jedz_prosto End If Wend Loop End 'end program Jedz_prosto: Set Silnik_lewy_a Set Silnik_lewy_b Reset Silnik_prawy_a Reset Silnik_prawy_b Return Skrecaj_w_prawo: Set Silnik_lewy_a Reset Silnik_lewy_b Reset Silnik_prawy_a Reset Silnik_prawy_b Waitms 10 Return Skrecaj_w_lewo: Set Silnik_prawy_a Reset Silnik_prawy_b Reset Silnik_lewy_a Reset Silnik_lewy_b Waitms 10 Return
Ksawery Sierpień 26, 2012 Udostępnij Sierpień 26, 2012 Set Dioda Powyższe polecenie ustawia logiczną jedynkę zmiennej bitowej o nazwie Dioda lub ustawia stan wysoki na port, dla którego zdefiniowałeś ten alias, aby go zdefiniować musisz napisać: Dioda Alias PORTD.0
aixI Sierpień 26, 2012 Autor tematu Udostępnij Sierpień 26, 2012 Aha. W kodzie mam Led Alias Portd.0 , a mi chodzi o tę diodę czyli muszę zmienić nazwę "Led" na "Dioda"?
aixI Sierpień 27, 2012 Autor tematu Udostępnij Sierpień 27, 2012 Ok. Teraz sprawdziłem kod i po skompilowaniu jest jeden błąd mianowicie: Error : 3 Line : 62 WHILE expected , in File : C:\Documents and... I czerwona linia pokazuje się na "Wend" Kod: $regfile = "2313def.dat" $crystal = 1000000 'Konfiguracja sterowania PWM Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up 'Konfiguracja portów Config Portd = Output Config Portb = Output 'Opis prtów 'Enable1 - silnik lewy - PortB.4 (PWM1A) 'Enable2 - silnik prawy - PortB.3 (PWM1B) 'Input1 - Silnik lewy A - PortD.2 'Input2 - Silnik lewy B - PortD.5 'Input3 - Silnik prawy A - PortD.3 'Input4 - Silnik prawy B - PortD.4 'Dioda - PortD.0 Sensor_1 Alias Portb.5 Sensor_2 Alias Portb.6 Sensor_3 Alias Portb.7 Silnik_lewy_a Alias Portd.2 Silnik_lewy_b Alias Portd.5 Silnik_prawy_a Alias Portd.4 Silnik_prawy_b Alias Portd.3 Dioda Alias Portd.0 'Deklaracje zmiennych Dim Czujnik_lewy As Single Dim Czujnik_srodkowy As Single Dim Czujnik_prawy As Single Dim W As Word 'Blok instrukcji Set Dioda Set Silnik_lewy_a Reset Silnik_lewy_b Set Silnik_prawy_a Reset Silnik_prawy_b Do Set Dioda If Sensor_1 = 0 Then If Sensor_3 = 1 Then Gosub Skrecaj_w_lewo Else Gosub Jedz_prosto End If Elseif Sensor_3 = 0 Then If Sensor_1 = 1 Then Gosub Skrecaj_w_prawo Else Gosub Jedz_prosto End If Else Gosub Jedz_prosto End If Wend Loop End 'end program Jedz_prosto: Set Silnik_lewy_a Set Silnik_lewy_b Reset Silnik_prawy_a Reset Silnik_prawy_b Return Skrecaj_w_prawo: Set Silnik_lewy_a Reset Silnik_lewy_b Reset Silnik_prawy_a Reset Silnik_prawy_b Waitms 10 Return Skrecaj_w_lewo: Set Silnik_prawy_a Reset Silnik_prawy_b Reset Silnik_lewy_a Reset Silnik_lewy_b Waitms 10 Return
Mars Sierpień 27, 2012 Udostępnij Sierpień 27, 2012 A po co to Wend tam jest? Wywal to, bo nigdzie nie zaczynasz pętli While. Masz tam pętlę Do...Loop, co już wskazuje na wymagane przez nią słowa kluczowe. Wend jest od While. 1
aixI Sierpień 27, 2012 Autor tematu Udostępnij Sierpień 27, 2012 Ok. kompilator nie pokazuje żadnych błędów jak wywaliłem "Wend". Jak koła wyschną to załaduję kod do procka i zobaczę jak działa.
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »