Skocz do zawartości

[bascom] spr. kodu do lf'a


aixI

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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)

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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
Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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.

  • Lubię! 1
Link do komentarza
Share on other sites

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ę »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.