Skocz do zawartości

Pomoc przy pisaniu pierwszych programów


Tolo

Pomocna odpowiedź

Witam wszystkich !

Chciałbym was prosić o pomoc w napisaniu pierwszego programu do robota typu Line-Follower

oczywiście nie liczę na gotowca chciałbym raczej stworzyć coś w rodzaju relacji z pisania programu ,tak abyście mogli mi pomóc lub naprowadzić na bierząco.Jakby co przeczytałem dokładnie kur Boscoma który znajduje się na tym portalu oraz parę innych kursów w sieci a w miedzy czasie pisałem trochę w C++ Builderze więc można powiedzieć ,że jakieś pojęcie mam chodzi mi raczej o pomoc w razie napotkania jakiś "kruczków" które skutecznie uprzykrzają życie a są to na przykład jakieś biblioteki o których początkujący nawet nie wie że istnieję itp.

A i od razu mówię ta płytka którą złożyłem jest 100% sprawna gdyż testowałem ją gotowymi programami i działała więc chciałbym się w tym temacie skupić tylko i wyłącznie na kwesti programowania a nie zimnych lutów itp.

Zacznę może od wstawienia schematu elektrycznego płytki:

Tak więc napisałem pierwszy program a ponieważ nie zrobiłem modułu czujników postanowiłem ,że napisze jakiś program w boscomie w zasadzie jest to przeróbka tego który znajduje się w kursie boscoma na tym portalu jednak musiałem go odrobinę przerobić

A wygląda on tak :

$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował


Config Portb = &B00010000                                   'piny 0-3wyjscia pin4 jako wejściae
      Portb = &B00000000                                   'wszędzie stan spoczynkowy-0


Do                                                         'pętla nieskończona

  If Pinb.3 = 1 Then                                       'jeżeli przycisk 1 wciśnięty
  Toggle Portb.2                                           'zmień stan wyprowadzenia
  End If                                                   'koniec bloku warunkowego

Loop                                                       'koniec pętli

End                                                         'koniec programu

No i cóż niby program prosty ale po skąpilowaniu i wgraniu do procesora nie za bardzo chce działać (w zasadzi nic się nie dzieje ) i prawdę mówiac nie za bardzo mam pojęcie co jest nie tak ... 😥

Link do komentarza
Share on other sites

-Nie zabezpieczyłeś się przed drganiem styków - proponuję się zapoznać z instrukcją debonuce.

(drgania styków - gdy naciskasz przycisk miedzy stanami "wciśnięty" a "puszczony" (I odwrotnie) następuje seria bardzo krótkich przeskoków tam i z powrotem. Na tyle szybkie że człowiek ich nie widzi, ale na tyle wolne że procesor traktuje je jako naciśnięcia. Metody są dwie:

-kondensator filtrujący

-opóźnienie (samemu, lub poprzez debonuce:

-czekasz na naciśnięcie

-po wykryciu czekasz powiedzmy 30 mili sekund

-sprawdzasz czy przycisk jest nadal naciśnięty i jeśli tak to każesz procesorowi wykonywać to co chcesz (można też tu dodać jakieś opóźnienie 1-2 sekundy)

)

Link do komentarza
Share on other sites

hmm no tak ale chyba drganie styków nie sprawia że cały program nie działa 😉 najwyżej zakłuca jego prace ,a u mnie jest zero reakcji myślę raczej że powodem może być złę skonfigurowanie portów ale w takim razie jak je skonfigurować ?

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Dzięki zaraz zobacze...

Heh zmieniłem na cus takiego ;

$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował


Config Portb = &B11101111                                  
      Portb = &B00000000                                   'wszędzie stan spoczynkowy-0


Do                                                         'pętla nieskończona

  If Pinb.3 = 1 Then                                       'jeżeli przycisk 1 wciśnięty
  Toggle Portb.2                                           'zmień stan wyprowadzenia
  End If                                                   'koniec bloku warunkowego

Loop                                                       'koniec pętli

End                                                         'koniec programu

i teraz dioda świeci się non stop ;-)niezależnie od przycisku

a jeszcze jedno pytanie jak nie używam jakiś portów to ustawiać je na wejscie czy wyjscie bo według mnie to bez znaczenia ale co ja tam wiem...

Link do komentarza
Share on other sites

A i jeszcze najpierw słusznie zauważasz, przy konfiguracji, że piny liczą się od 0 i piszesz w komentarzu, że 4, a w instrukcji warunkowej masz Pinb.3

$regfile = "m16def.dat"                                     'najpierw określamy typ proca 
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował 


Config Portb = &B11101111                                   'port b  jako wejścia 
      Portb = &B00000000                                   'wszędzie stan spoczynkowy-0 


Do                                                         'pętla nieskończona 

  If Pinb.4 = 1 Then                                       'jeżeli przycisk 1 wciśnięty 
  Toggle Portb.2                                           'zmień stan wyprowadzenia 
  Wait 2
  End If                                                   'koniec bloku warunkowego 

Loop                                                       'koniec pętli 

End                                                         'koniec programu 
Link do komentarza
Share on other sites

skompilowałem to co napisałeś i dioda dalej non stop się świeci...

chyba to powinno jedna kwyglądać tak


$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował


Config Portb = &B11101111                                   'port b  jako wejścia
      Portb = &B00000000                                   'wszędzie stan spoczynkowy-0


Do                                                         'pętla nieskończona

  If Pinb.3 = 1 Then                                       'jeżeli przycisk 1 wciśnięty
  Toggle Portb.2                                           'zmień stan wyprowadzenia
  Wait 2
  End If                                                   'koniec bloku warunkowego

Loop                                                       'koniec pętli

End                                                         'koniec programu

trzeba pomysleć czemu ta dioda się non stop świeci skoro ma stan spoczynkowy 0 ?

zmieniłem na coś takiego


$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował


Config Portb = &B11101111                                   'port b  jako wejścia
      Portb = &B00001000                                   'wszędzie stan spoczynkowy-0


Do                                                         'pętla nieskończona

  If Pinb.3 = 1 Then                                       'jeżeli przycisk 1 wciśnięty
  Toggle Portb.2                                           'zmień stan wyprowadzenia
  Wait 2
  End If                                                   'koniec bloku warunkowego

Loop                                                       'koniec pętli

End                                                         'koniec programu

teraz dioda miga co dwie sekundy ...

kurcze to kwestia ustawienia pinów ale ja już nic z tego nie rozumiem 😉

Link do komentarza
Share on other sites

faktycznie tak jest katoda idzie do pinu ...heh to dziwne ale ona i przy tym i przy tym stanie spoczynkowym się świeci ;-)kurde ale zastanawiał bym się nad tą pętlą no bo tak on wejdzie w pętle If jeśli PinB.3 bendzie miał jeden no to jeśli go wciskam tzn włącznik który jest podłączony do portu to robi stan 1 ? jak wejdzie w pętle do zmieni stan portub 2 na przeciwny nieważne w jakim stanie jest teraz ? wniosek;"kurcze czemu to nie działa ;-)" przecież formalnie to czy ta dioda świeci się w stanie spoczynku czy nie to tylko kwestia estetyczna można powiedzieć gdyż on w ta pętle i tak czy siak powinien wejść i zminić stan na przeciwny ?

chyba jestem coraz bardziej przekonany że to włącznik jest zepsuty bo kiedy zmienie stan spoczynkowy portu 3 na stan wysoki to wszystko jest OK zaraz to sprawdze...

Link do komentarza
Share on other sites

Led na schemacie odwrotnie.

- Poprawie skonfiguruj porty- dioda jako wyjście, switch jako wejście, stan początkowy na switchu = 1

- Zrób jakieś opóźnienia, bo w tej postaci program nie ma sensu-przy każdym przyciśnięciu stan wyjścia zmieni się kilkadziesiąt tysięcy razy.

Swich zwiera pin do masy, więc wszystko działa jak trzeba. Chyba, że chcesz, żeby stan zmieniał się po wciśnięciu przycisku, wtedy musisz zmienić na:

 If Pinb.3 = 0 Then  
Link do komentarza
Share on other sites


$regfile = "m16def.dat"                                     'najpierw określamy typ proca
$crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował


Config Pinb.0 = Input                                       
Config Pinb.1 = Input                                       
Config Pinb.2 = Output                                      
Config Pinb.3 = Input                                     
Config Pinb.4 = Output                                      
Config Pinb.5 = Output                                      
Config Pinb.6 = Output                                      

Portb.0 = 0                                                
Portb.1 = 0                                                
Portb.2 = 0                                              
Portb.3 = 1                                                
Portb.4 = 0                                                 
Portb.5 = 0                                              
Portb.6 = 0                                                

Dioda Alias Pinb.2
Przycisk Alias Pinb.3

Do                                                         'pętla nieskończona

  If Przycisk = 0 Then                                     'jeżeli przycisk 1 wciśnięty
  Toggle Dioda                                             'zmień stan wyprowadzenia
  Wait 2
  End If                                                   'koniec bloku warunkowego

Loop                                                       'koniec pętli

End                                                         'koniec programu


tak to powinno wyglądać? dioda cały czas mi ga w rytmi 2 sekundowym

Link do komentarza
Share on other sites

Dioda miga cały czas czy tylko jak jest przycisk naciśnięty?

Jeśli tylko jak naciśnięty to znaczy że program działa.

@nanab

po to dodałem opóźnienie 2 sekundy, żeby dało się sprawdzić czy działa przy jak najprostrzym kodzie. Dzięki temu po przyciśnięciu przez ten czas drgania styków nie mają wpływu. Wad takiego rozwiązania jest wiele, ale na początek przecież starcza...

Link do komentarza
Share on other sites

w zasadzie teraz to wogóle nie miga tylko się świeci ale w cześniej migała niezależnie od przycisku

no dobra na dzisiaj koniec runda druga jutro 😉

Link do komentarza
Share on other sites

Spróbuj z takim kodem:

Do                                                         'pętla nieskończona
 If Przycisk = 0 Then
    waitms 200
    If Przycisk = 0 Then                                     'jeżeli przycisk 1 wciśnięty
       Toggle Dioda                                             'zmień stan wyprowadzenia
       wait 1
    End If                                                   'koniec bloku warunkowego
 End if
Loop 

Przy czym pierwszy "waitms" dobierz doświadczalnie, żeby wyeliminować wpływ drgań zestyków i jednocześnie żeby przycisk reagował przy krótkich naciśnięciach (myślę, że 200ms będzie optymalnie), drugi jest na wypadek zbyt długiego trzymania wciśniętego przycisku (żeby dioda nie migała z częstotliwością większą niż 2Hz, zjawisko będzie dobrze widoczne).

"Dioda Alias Pinb.2" trzeba chyba zmienić na "Dioda Alias Portb.2 ", ale głowy sobie uciąć nie dam - przerzuciłem się na C 😉

Link do komentarza
Share on other sites

"Dioda Alias Pinb.2" trzeba chyba zmienić na "Dioda Alias Portb.2 "

Tutaj się zgadzam. Musi być "Dioda Alias Portb.2" ponieważ Portb.2 jest ustawiony jak O, jeżeli byłby ustawiony jako I to wtedy byłoby Pinb.2

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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