Skocz do zawartości

Pierwszy program do linefollowera


jarasssss

Pomocna odpowiedź

Bascom znam na poziomie raczej podstawowym, ale napisałem prosty programik do linefollowera i tu pojawia się problem. Podczas kompilacji wszystko jest ok ale jak spróbuje uruchomić (na płytce testowej EvB 4.3 - Switche jako czujniki, dwie diody jako silniczki 😅 - improwizuje (na razie jestem do tego zmuszony bo czekam na części) ) to nie działa. Zastanawia mnie czy to wina programu czy sposobu w jaki testuje? (Jeśli wina programu to gdzie jest błąd bo nie mogę znaleźć?)

$regfile = "m16def.dat" 
$crystal = 16000000
Config Portc = &B1111100
Config Pind.4 = Output
Config Pind.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Set Portc.0
Set Portc.1
Set Portc.2
Set Portc.3
Set Portc.4
Dim A(5) As Word
Dim X As Byte
Dim Y As Byte
Dim Lineflag As Byte
Const Full = 255
Const Half = 127
Const Null = 0
Const Color = 500
Do
  For Y = 1 To 5
  Reset A(y) 
  Next Y
  Start Adc
  For X = 0 To 4
  A(x + 1) = Getadc(x) 
  Next X
  If A(1) < Color Then Lineflag.0 = 0 Else Lineflag.0 = 1
  If A(2) < Color Then Lineflag.1 = 0 Else Lineflag.1 = 1
  If A(3) < Color Then Lineflag.2 = 0 Else Lineflag.2 = 1
  If A(4) < Color Then Lineflag.3 = 0 Else Lineflag.3 = 1
  If A(5) < Color Then Lineflag.4 = 0 Else Lineflag.4 = 1
  Waitms 25

  Select Case Lineflag
  Case &B00001

  Pwm1a = Null
  Pwm1b = Full

  Case &B00010

  Pwm1a = Half
  Pwm1b = Null

  Case &B00100

  Pwm1a = Full
  Pwm1b = Full

  Case &B01000

  Pwm1a = Full
  Pwm1b = Half

  Case &B10000

  Pwm1a = Full
  Pwm1b = Null

  End Select

  Waitms 100
Loop
End

Poniżej schemat diod na płytce EvB4.3

Link do komentarza
Share on other sites

pierwsze co mi się rzuciło w oczy, to nie zamknięte bloki instrukcji if -> then ->else -> end if, czyli na końcu bloku musisz wstawić tyle "end if'ów", ile jest if'ów.

Link do komentarza
Share on other sites

Program bez "end if" kompiluje się bez problemu. Podczas gdy dodam "end if" pojawiają się błędy. (Problem chyba raczej dotyczy czegoś innego chyba że się mylę.)

[ Dodano: 01 Wrz 09 05:32 ]

Znalazłem błąd oto poprawiony kod (niektóre błędy są tak oczywiste a niemożna ich znaleźć 😖 )

$regfile = "m16def.dat" 
$crystal = 16000000
Config Porta = &B0000000
Config Pind.4 = Output
Config Pind.5 = Output
Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Set Porta.0
Set Porta.1
Set Porta.2
Set Porta.3
Set Porta.4
Dim A(5) As Word
Dim X As Byte
Dim Y As Byte
Dim Lineflag As Byte
Const Full = 255
Const Half = 127
Const Null = 0
Const Color = 500
Do
  For Y = 1 To 5
  Reset A(y) 
  Next Y
  Start Adc
  For X = 0 To 4
  A(x + 1) = Getadc(x) 
  Next X
  If A(1) < Color Then Lineflag.0 = 0 Else Lineflag.0 = 1
  If A(2) < Color Then Lineflag.1 = 0 Else Lineflag.1 = 1
  If A(3) < Color Then Lineflag.2 = 0 Else Lineflag.2 = 1
  If A(4) < Color Then Lineflag.3 = 0 Else Lineflag.3 = 1
  If A(5) < Color Then Lineflag.4 = 0 Else Lineflag.4 = 1
  Waitms 25

  Select Case Lineflag
  Case &B11110

  Pwm1a = Null
  Pwm1b = Full

  Case &B11101

  Pwm1a = Half
  Pwm1b = Full

  Case &B11011

  Pwm1a = Full
  Pwm1b = Full

  Case &B10111

  Pwm1a = Full
  Pwm1b = Half

  Case &B01111

  Pwm1a = Full
  Pwm1b = Null


  End Select

  Waitms 100
Loop
End

Temat do zamknięcia.

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.