Skocz do zawartości

Problem BASCOM


Pomocna odpowiedź

Napisano

Witam, jest to mój pierwszy post więc się przedstawię, nazywam się Filip i jestem w początkującym elektronikiem. Więc Proszę was o pomoc, bo nie wiem jaki jest błąd w programie do mojego pierwszego robota robota(LineFollowera):

' LineFollower 1.00

Dim One As Byte
Config Portb = Output
      Portb = &B11111111
Config Portd = Input
      Portd = &B1111111

If Portd = &B1000011 Then One = 1                           '0
If Portd = &B1000111 Then One = 2                           '1
If Portd = &B1001011 Then One = 4                           '2
If Portd = &B1001111 Then One = 2                           '3
If Portd = &B1010011 Then One = 4                           '4
If Portd = &B1010111 Then One = 1                           '5
If Portd = &B1011011 Then One = 4                           '6
If Portd = &B1011111 Then One = 1                           '7
If Portd = &B1100011 Then One = 3                           '8
If Portd = &B1100111 Then One = 1                           '9
If Portd = &B1101011 Then One = 1                           '10
If Portd = &B1101111 Then One = 1                           '11
If Portd = &B1110011 Then One = 3                           '12
If Portd = &B1110111 Then One = 1                           '13
If Portd = &B1111011 Then One = 1                           '14
If Portd = &B1111111 Then One = 1                           '15

Select Case One
Case 1: 
  Portb = &B11111111                                       'Robot stoi
Case 2: 
  Portb = &B10111111                                       'Robot w lewo
Case 3: 
  Portb = &B11101111                                       'Robot w prawo
Case 4: 
  Portb = &B10101111                                       'Robot jedzie do przodu
End Select
Return

End

Program jest napisany dla uC AT90S2313 PB.7, 6, 5, 4 to wyjścia do scalonego mostka H(L293D), a PD.2, 3, 4, 5 to wejścia do czujnika linii.

Z góry wielkie dzięki 🙂

Najprawdopodobniej jeżeli zapiszesz te instrukcje warunkowe w ten sposub to będzie działało.

If Portd = &B1000011 Then 
One = 1                           '0
If Portd = &B1000111 Then 
One = 2                           '1
If Portd = &B1001011 Then
One = 4                           '2
If Portd = &B1001111 Then 
One = 2                           '3
If Portd = &B1010011 Then
One = 4                           '4
If Portd = &B1010111 Then 
One = 1                           '5
If Portd = &B1011011 Then 
One = 4                           '6
If Portd = &B1011111 Then 
One = 1                           '7
If Portd = &B1100011 Then 
One = 3                           '8
If Portd = &B1100111 Then 
One = 1                           '9
If Portd = &B1101011 Then
One = 1                           '10
If Portd = &B1101111 Then 
One = 1                           '11
If Portd = &B1110011 Then 
One = 3                           '12
If Portd = &B1110111 Then 
One = 1                           '13
If Portd = &B1111011 Then
One = 1                           '14
If Portd = &B1111111 Then 
One = 1                           '15 

Bascom ma trochę "upośledzony" kompilator więc wymaga odpowiedniej formy zapisu kodu, w innym przypadku jest dla niego nieczytelny.

  • Lubię! 1

Jedyna rzecz jaką zauważyłem to brak pętli (Do...Loop). pawel, tamten sposób też jest dobry, są to proste warunki, tylko z jedną instrukcją.

Felipe, testowałeś już ten program w swoim robocie?

Tak, testowałem go w moim robocie i żadnej reakcji silników. Teraz gdy wgrałem nowy program zrobiłem pomiary multimetrem i sygnał z czujnika dochodzi( stan 0 = 1,76V, stan 1 = 5,26V ), a już na wyjściu do mostka H nie ma żadnej zmiany wszystkie bity mają stan 1, może powinienem użyć rezystorów podciągających??

Podstawowa sprawa - nie If portd...., tylko If pind!

Pytanie - czy skopiowałeś tutaj cały blok programu? Bo brakuje paru rzeczy, jak chociażby wspomniane Do...Loop. Zmylił mnie też return, jaką on pełni tam funkcję?

OK, chciało mi się - ja to widzę tak:

$regfile = "2313def.dat" 
$crystal = 1000000

Dim One As Byte
Config Portb = Output
Portb = &B11111111
Config Portd = Input

Do

If Pind = &B0000011 Then
One = 1
Elseif Pind = &B0000111 Then
One = 2
Elseif Pind = &B0001011 Then
One = 4
Elseif Pind = &B0001111 Then
One = 2
Elseif Pind = &B0010011 Then
One = 4
Elseif Pind = &B0010111 Then
One = 1
Elseif Pind = &B0011011 Then
One = 4
Elseif Pind = &B0011111 Then
One = 1
Elseif Pind = &B0100011 Then
One = 3
Elseif Pind = &B0100111 Then
One = 1
Elseif Pind = &B0101011 Then
One = 1
Elseif Pind = &B0101111 Then
One = 1
Elseif Pind = &B0110011 Then
One = 3
Elseif Pind = &B0110111 Then
One = 1
Elseif Pind = &B0111011 Then
One = 1
Elseif Pind = &B0111111 Then
One = 1
End if

Select Case One
Case 1: 
  Portb = &B11111111                                       'Robot stoi
Case 2: 
  Portb = &B10111111                                       'Robot w lewo
Case 3: 
  Portb = &B11101111                                       'Robot w prawo
Case 4: 
  Portb = &B10101111                                       'Robot jedzie do przodu
Case Else: 
  Portb = &B10101111                                       'Robot jedzie do przodu
End Select

Loop
End

Zobacz czy działa, kompiluje się bez błędu.

XX.rar

  • Lubię! 1

Działa!!! 😃

Nawyk, miałeś racje to wina tego, że zamiast PIND dawałem PORTD.

I tak mi się wcześniej nie chciało skompilować bez END IF.

Teraz program wygląda tak:

' LineFollower 1.00

Dim One As Byte
Config Portb = Output
      Portb = &B11111111
Config Portd = Input
      Portd = &B1111111
Do
If Pind = &B1000011 Then
One = 1                                                    '0
End If
If Pind = &B1000111 Then
One = 2                                                    '1
End If
If Pind = &B1001011 Then
One = 4                                                    '2
End If
If Pind = &B1001111 Then
One = 2                                                    '3
End If
If Pind = &B1010011 Then
One = 4                                                    '4
End If
If Pind = &B1010111 Then
One = 1                                                    '5
End If
If Pind = &B1011011 Then
One = 4                                                    '6
End If
If Pind = &B1011111 Then
One = 1                                                    '7
End If
If Pind = &B1100011 Then
One = 3                                                    '8
End If
If Pind = &B1100111 Then
One = 1                                                    '9
End If
If Pind = &B1101011 Then
One = 1                                                    '10
End If
If Pind = &B1101111 Then
One = 1                                                    '11
End If
If Pind = &B1110011 Then
One = 3                                                    '12
End If
If Pind = &B1110111 Then
One = 1                                                    '13
End If
If Pind = &B1111011 Then
One = 1                                                    '14
End If
If Pind = &B1111111 Then
One = 1                                                    '15
End If

Select Case One
Case 1: 
  Portb = &B11111111                                       'Robot stoi
Case 2: 
  Portb = &B10111111                                       'Robot w lewo
Case 3: 
  Portb = &B11101111                                       'Robot w prawo
Case 4: 
  Portb = &B10101111                                       'Robot jedzie do przodu
End Select
Loop

End

Jak go skończę to zamieszczę go na forum.

Wielkie dzięki bardzo mi pomogliście 🙂😃😅

Trochę w tym czasie "apdejtowałem" mój post, sprawdź z ciekawości czy mój kod śmiga, bo i tak dziwne wydają mi się te braki deklaracji procka, zegara itd...

Twój program nie działa silniki kręcą się niezależnie od czujnika. A propo tych deklaracji to wszystko można ustawić w opcjach Menu>Options>Compiler>Chip. 😃

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