Skocz do zawartości

Pomocna odpowiedź

Projekt powoli posuwa się do przodu mam dwie płytki - jedną z megą w SMD drugą - THT. Teraz muszę poczekać aż elementy będą dostępne kupić i polutować.

Skleciłem na szybko program na stykówkę:

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

Config Portc = Output
Config Portb = Input

Dioda1 Alias Portc.5
Dioda2 Alias Portc.4
Sharp Alias Pinb.0

Dim A As Byte

Do

  If Sharp = 1 Then
  A = A + 1
  End If
  Waitms 25
  If A = 0 Then
  Dioda1 = 0
  Dioda2 = 0
  End If
  Waitms 25
  If A = 1 Then
  Dioda1 = 1
  Dioda2 = 0
  End If
  Waitms 25
  If A = 2 Then
  Dioda1 = 0
  Dioda2 = 1
  End If
  Waitms 25
  If A = 3 Then
  A = 0
  End If

Loop

End

Nie wiem czy powinno to tak wyglądać ale działa.

Niby program od czapy ale to była próba do zrobienia do ms kilku wariantów walki na dwóch przyciskach (w programie wyżej tylko jeden jako Sharp) - jeden miałby zmieniać podprogram do wyboru drugi zatwierdzać wybór. I mówiąc szczerze trochę wolno to dział., Na ile mógłby zmniejszyć wait'y by nie łapało 'podwójnie' jedynki?

[ Dodano: 06-04-2012, 21:39 ]

I jeszcze jedno, co mam zrobić jak Bascom nie przyjmuje nazwy portu "A"? I przy kompilacji wyrzuca błędy w tych miejscach.

I jeszcze jedno, co mam zrobić jak Bascom nie przyjmuje nazwy portu "A"? I przy kompilacji wyrzuca błędy w tych miejscach.

Przecież mega8 nie ma portu A.

Edit:

Napisałeś głupotę a ją powtórzyłem, mega8 nie ma portu A, tak jak wyżej napisałem, ale tu nie chodzi o nazwę portu, tylko nazwę zmiennej. Wklej tu błędy jakie wyrzuca kompilator.

Carpe Diem, nie wiem jaki masz problem z tym kodem, ale on kompiluje się poprawnie.
Nie wiem czy powinno to tak wyglądać ale działa.

Problemu nie mam ale pisząc go wymyślałem, nie wiedząc jak to się robi 🙂

  • 2 tygodnie później...

Mam już zrobioną płytkę i biorę się za uruchamianie.

Napisałem pierwszy program obsługujący Ktiry i LEDy.

Pierwsze wrażenie - działa, lecz nie do końca jednak. Działa, ale tylko na pewnej odległości od podłoża (+-6mm). Gdy przybliżę trochę czujniki widzą czarny jak biały.

Da się to jakoś programowo poprawić by mieć większy margines błędu jeżeli chodzi o odległość od podłoża?

[ Dodano: 18-04-2012, 19:50 ]

https://www.youtube.com/watch?v=-M_tHvF2RkU

Czy mi się wydaje, czy widzę "tonę" nieusuniętej kalafonii na płytce? 😋

Rozumiem, że kombinowałeś z progiem wykrywania linii? Poza tym 6mm to nie jest mało. Zawsze można wzmocnić sygnał z czujnika jakimś wzmacniaczem operacyjnym, ale jak to będzie działało to nie wiem.

Czy mi się wydaje, czy widzę "tonę" nieusuniętej kalafonii na płytce?

Tak, została jeszcze po lutowaniu.

Rozumiem, że kombinowałeś z progiem wykrywania linii?

Coś próbowałem ale nie za bardzo wiem, jak to powinno wyglądać bo nawet na forum ciężko znaleźć na tyle dobrze opisaną konstrukcję.

Mógłbyś coś dopowiedzieć, na ten temat?

Poza tym 6mm to nie jest mało.

To nie jest mało tylko jak dam na wysokości 5mm nad czarny to wykrywa białą linie. A mnie interesowałoby, żeby działał powiedzmy w odległości 2/3-4/5mm + jakiś margines.

A możesz pokazać twój program? Ogólnie chodzi o porównywanie wartości z twoją ustaloną z góry granicą (np Const Granica = 300). Zawsze możesz spróbować napisać autokalibrację, ale to już chyba wyższa szkoła jazdy (z tego co się orientuję Sabre ma w swoich LF'ach właśnie to rozwiązanie).

Przy zbyt niskiej/wysokiej (zależy od programu) granicy ( o której mówił Piotreks-89) czujniki odbiciowe zaczynają działać jak wykrywacze przeszkody ( dają stan wysoki przy obojętnie jakiej powierzchni znajdującej się przed nimi ). Wystarczy doświadczalnie ją dobrać.

'---------------Podprogramy---------------'



'------------------Walki------------------'


'-----------------F1-----------------'

F1:

  Do
     Dioda1 = 0
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 1

     If Ktirl = 0 Then
     Gosub Fight1
     End If

     If Ktirp = 0 Then
     Gosub Fight2
     End If

     If Ktirl = 0 And Ktirp = 0 Then
     Gosub Fight3
     End If




     'Program walki

  Loop

Return




'---------------Fight1---------------'
Fight1:
  Do

     Dioda2 = 0

  Loop Until Ktirl = 1 Or Ktirp = 0
Dioda2 = 1
Return


'---------------Fight2---------------'
Fight2:
  Do

     Dioda3 = 0

  Loop Until Ktirp = 1 Or Ktirl = 0
Dioda3 = 1
Return



'---------------Fight3---------------'
Fight3:
  Do

     Dioda4 = 0

  Loop Until Ktirp = 1 Or Ktirl = 1
Dioda4 = 1
Return

uzyj ADC do odczytu stanu czujników. Wtedy możesz dowolnie dobrać granicę wykrywalności. właszcza, że na schemacie masz je podpięte pod przetwornik adc

Wymyśliłem coś takiego:

'--------------Definicja--------------'


$regfile = "m32def.DAT"
$crystal = 8000000


'----------------Porty----------------'



'-----------Diody-----------'
Config Porta.7 = Output
Config Porta.6 = Output
Config Porta.5 = Output
Config Porta.4 = Output


'-----------Sharp-----------'
Config Pina.3 = Input
Config Pina.0 = Input

Config Pinb.4 = Input
Config Pinb.3 = Input
Config Pinb.2 = Input


'-----------Ktiry-----------'
Config Pina.2 = Input
Config Pina.1 = Input


'----------Switchs----------'
Config Pinb.0 = Input
Config Pinb.1 = Input



'---------------Alias'y---------------'



'-----------Diody-----------'
Dioda1 Alias Porta.4
Dioda2 Alias Porta.5
Dioda3 Alias Porta.6
Dioda4 Alias Porta.7


'-----------Sharp-----------'
Sharpp2 Alias Pina.3
Sharpp1 Alias Pina.0

Sharp1 Alias Pinb.3

Sharpl1 Alias Pinb.2
Sharpl2 Alias Pinb.4

'-----------Ktiry-----------'
Ktirp Alias Pina.2
Ktirl Alias Pina.1


'----------Switchs----------'
Switch1 Alias Pinb.0
Switch2 Alias Pinb.1



'---------------Zmienna---------------'

Dim A As Byte
Dim Wart_ac As Word


Const Granica = 130

Config Adc = Single
  Prescaler = Auto
  Reference = Avcc


'---------------Program---------------'

  Start Adc
Do

  If A = 0 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 1 Then
  Dioda1 = 0
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 2 Then
  Dioda1 = 1
  Dioda2 = 0
  Dioda3 = 1
  Dioda4 = 1
  End If

  If A = 3 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 0
  Dioda4 = 1
  End If

  If A = 4 Then
  Dioda1 = 1
  Dioda2 = 1
  Dioda3 = 1
  Dioda4 = 0
  End If


  If Switch1 = 0 Then
  A = A + 1
  End If

  Waitms 10

  If A = 1 And Switch2 = 0 Then
  Gosub F1
  End If


  If A = 5 Then
  A = 0
  End If

Loop

End


'---------------Podprogramy---------------'



'------------------Walki------------------'


'-----------------F1-----------------'

F1:

  Do
     Dioda1 = 0
     Dioda2 = 1
     Dioda3 = 1
     Dioda4 = 1

     Wart_ac = Getadc(1)

     If Ktirl < Granica Then
     Gosub Fight1
     End If

     Wart_ac = Getadc(2)

     If Ktirp < Granica Then
     Gosub Fight2
     End If

     If Ktirl < Granica And Ktirp < Granica Then
     Gosub Fight3
     End If




     'Program walki

  Loop

Return




'---------------Fight1---------------'
Fight1:
  Do

     Dioda2 = 0

  Loop Until Ktirl > Granica Or Ktirp < Granica
Dioda2 = 1
Return


'---------------Fight2---------------'
Fight2:
  Do

     Dioda3 = 0

  Loop Until Ktirp > Granica Or Ktirl < Granica
Dioda3 = 1
Return



'---------------Fight3---------------'
Fight3:
  Do

     Dioda4 = 0

  Loop Until Ktirp > Granica Or Ktirl > Granica
Dioda4 = 1
Return

Tylko Bascom wyrzuca mi błąd przy kompilacji w miejscu Config ADC = Single.

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