Skocz do zawartości

[bascom] spr. kodu do lf'a


Pomocna odpowiedź

Napisano

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.

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

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

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)

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

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.

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

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
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
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

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

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

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.

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...