Skocz do zawartości

[Bascom] Błędny program dla Linefollowera


Pomocna odpowiedź

Napisano

Witam, nie działa mi poprawnie program napisany w BASCOMIE =/ Docelowo ma być dla line followera, jednak przerobiłem go na prosty, bo nawet taki mi nie działa. W czym może być problem?

$regfile = "m8def.dat"

$crystal = 1000000

Portc = &B11111111

Portd = &B00000000

DDRc = &B11111111

Ddrd = &B00000000

'lp - lewy przód, lt - lewy tył, pp - prawy przód, pt - lewy tył

Motor_lt Alias Portc.3

P1 Alias Pind.0

'Polecenia wydawane na podstawie stanów wejściowych:

Do

If P1 = 1 Then

Gosub Prosto

Elseif P1 = 0 Then

Gosub Tyl

End If

Loop

Return

Prosto: 'Tryby pracy silników dla poszczególnych ruchów

Motor_lt = 1

Return

Tyl:

Motor_lt = 0

Return

$regfile = "m8def.dat"

$crystal = 8000000

Config Portd = Input

Portd = &B00000000

Config Portc = Output

Portc = &B000000

Do

If Pind.0 = 1 Then

Portc.3 = 1

Elseif Pind.1 = 0 Then

Portc.3 = 0

End If

Loop

End

Teraz powinno być dobrze ale niestety nic nie reaguje =/

[ Dodano: 05-03-2011, 14:16 ]

Dodam tylko że programując w C prosty program mrugajacej diody wszystko działa, więc to nie wina układu.

sashir, &B0 = &B00...000, tak samo jak 123 = 0...0123 🙂

Sugerowałbym włączenie pullupa wewnętrznego na pinie od przycisku (Portd.0=1).

Ok, działa i teraz do programu do robota wystarczy dopisać to samo tylko na piny od czujników?

[ Dodano: 06-03-2011, 21:08 ]

PS. Pytam profilaktycznie bo bede to mógł sprawdzić dopiero jak mi dojdzie układ L293D z allegro bo ten co mialem to sie przepalił 🙂

Kangurek, możesz wpisywać też bezpośrednio jakby: np. PORTD.110101. Jest to wymagane, jeśli pin miałby wisieć w powietrzu, często inne czujniki wystawiają prawdziwe 1 (vcc, a nie odpięcie od gnd). Ale ogólnie to prawie na pewno nie zaszkodzi.

Czyli tak powinien wygladać wstęp do programu??

$regfile = "m8def.dat"

$crystal = 8000000

Config Portd = Input

Portd = &B00000000

PORTD =11111111

Config Portb = Input

Portb = &B00000000

PORTB=11111111

Config Portc = Output

Portc = &B000000

'lp - lewy przód, lt - lewy tył, pp - prawy przód, pt - lewy tył

Motor_lp Alias Portc.4

Motor_lt Alias Portc.3

Motor_pp Alias Portc.2

Motor_pt Alias Portc.1

Sensor_prawy2 Alias Pind.5

Sensor_prawy1 Alias Pind.6

Sensor_srodkowy Alias Pind.7

Sensor_przedni Alias Pinb.0

Sensor_lewy1 Alias Pinb.1

Sensor_lewy2 Alias Pinb.2

P1 Alias Pind.0

P2 Alias Pind.1

P3 Alias Pind.2

P4 Alias Pind.3

Config Portd = Input

Portd = &B00000000

PORTD =11111111

Rozumiem, że chodzi o ustawienie wszystkich portów jako input i podłączenie pull-up'a?

W takim razie wystarczy:

config portd = input '(opcjonalnie config portd = &B00000000)

portd = &B11111111

Ten program działa

$regfile = "m8def.dat"

$crystal = 8000000

Config Portd = Input

Portd.0 = 1

Config Portc = Output

Portc = &B000000

Do

If Pind.0 = 1 Then

Portc.3 = 1

Elseif Pind.1 = 0 Then

Portc.3 = 0

End If

Loop

End

Natomiast ten już nie =/

$regfile = "m8def.dat"

$crystal = 8000000

Config Portd = Input

Portd = &B11111111

Config Portc = Output

Portc = &B000000

Do

If Pind.0 = 1 Then

Portc.3 = 1

Elseif Pind.1 = 0 Then

Portc.3 = 0

End If

Loop

End

I żadne inne ustawienia portów nie działają. Tzn dopiszę

Portd.1 = 1

albo

Portd = &B10000000

To już program zaczyna wariować. Tzn silniczek się kręci, ale jak naciskam przyciski to zero reakcji.

Kangurek, w ogóle w dziwny sposób używasz polecenia Elseif. Według mnie dotyczyć ono powinno tego samego pinu, a ty w Elseif chcesz sprawdzać zupełnie inny pin, najpierw sprawdzasz Pind.0 (w pierwszym If'ie) za to w Elseif sprawdzasz już Pind.1 a powinieneś sprawdzać zgodnie z logiką Pind.0.

Na sprawdzanie różnych pinów powinieneś używać wielokrotnego If'a.

Moja wiedza jest zaczerpnięta z kursu bascoma na tej stronie, tam jest używane elseif (z reszta to właściwie kopia programu z tego kursu). Ale jak programuje na 4 przyciski (bo niestety nie mam czujników bo sie zepsuły) tzn kod wygląda tak:

If P1 = 1 and P2 = 0 and P3 = 0 and P4 =0 Then 
Gosub Prosto
elseif P1 = 0 and P2 = 1 and P3 = 0 and P4 =0 Then 
Gosub Tyl

I tak dalej, to też mi to nie działa =/

[ Dodano: 10-03-2011, 20:38 ]

Ok, już doszedłem do sedna sprawy. Nie działa mi P4, przez co zaprogramowany program działał źle a właściwie to nie działał. Teraz wszystko śmiga jak należy, i przy okazji dowiedziałem się paru różnych rzeczy na temat programowania. Też myślałem że w komendzie PORTD = &B11111111 od lewej liczy od PD0 a jest dokładnie na odwrót i od prawej jest PD0 itd.

Oto kod programu jakby ktoś miał podobne problemy:

$regfile = "m8def.dat"
$crystal = 8000000

Config Portd = Input
Portd = &B00000111
Config Portc = Output
Portc = &B000000

Motor_lp Alias Portc.4
Motor_lt Alias Portc.3
Motor_pp Alias Portc.2
Motor_pt Alias Portc.1
P1 Alias Pind.0
P2 Alias Pind.1
P3 Alias Pind.2

Do

If P1 = 0 And P2 = 1 And P3 = 1 Then
Gosub Prosto
Elseif P1 = 1 And P2 = 0 And P3 = 1 Then
Gosub Tyl
Elseif P1 = 1 And P2 = 1 And P3 = 1 Then
Gosub Stoj
End If

Loop

Return
Prosto:                                                     'Tryby pracy silników dla poszczególnych ruchów
Motor_lt = 1
Motor_pt = 1
Motor_lp = 0
Motor_pp = 0
Return
Tyl:
Motor_lt = 0
Motor_pt = 0
Motor_lp = 1
Motor_pp = 1

Return
Prawo:
Motor_lt = 0
Motor_pt = 1
Motor_lp = 0
Motor_pp = 0
Return
Lewo:
Motor_lt = 1
Motor_pt = 0
Motor_lp = 0
Motor_pp = 0
Return
Stoj:
Motor_lt = 0
Motor_pt = 0
Motor_lp = 0
Motor_pp = 0
Return

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