_cyna_PL Napisano Sierpień 8, 2008 Udostępnij Napisano Sierpień 8, 2008 Witam Na pewno każdy z was jeździ bądź jeździł rowerem ;/ O podstawowym wyposażeniu roweru każdy wie a ja wspomnę o tylnym świetle, ponieważ zacząłem zabawę z procesorami postanowiłem zrobić tylna lampkę rowerowa z 7 opcjami [coś takiego jak ze sklepu za 4 zł]. Wiec przejdźmy do rzeczy: - program na atmega8 [procesor i programator mam] - programik napisałem ale nie wiem czy będzie działał wiec podaje go tutaj [nie zwracajcie uwagi na komentarze do komend to dla ułatwienia mi nauki]: ' program sterujacy funkcjami czterech diod [test] ' przejscie do podprogramu $regfile = "m8def.dat" ' dzialanie na atemega8 $crystal = 8000000 '8 MHz na wewnętrznym oscylatorze Config Portd = Output 'cały port d jako wyjście Config Portb = Input 'caly port b jako wejscie Portb = &B00000000 'wszystko stan = 0 Portd = &B00000000 'wszystko stan =0 Do 'petla nieskonczona If Pinb.0 = 1 Then ' przycisk S1 Gosub Prog_1 Elseif Pinb.1 = 1 Then ' przycisk S2 Gosub Prog_2 Elseif Pinb.2 = 1 Then ' przycisk S3 Gosub Prog_3 Elseif Pinb.3 = 1 Then ' przycisk S4 Gosub Prog_4 Elseif Pinb.4 = 1 Then ' przycisk S5 Gosub Prog_5 Elseif Pinb.5 = 1 Then ' przycisk S6 Gosub Prog_6 Elseif Pinb.6 = 1 Then ' przycisk S7 Gosub Prog_7 End If 'koniec bloku warunkowego Loop Prog_1: Set Portd.0 Set Portd.3 Wait 2 'czekaj 2 s ' Return 'wykonuje powrot do programu glownego Prog_2: Set Portd.1 Set Portd.2 Wait 2 'czekaj 2 s ' Return 'wykonuje powrot do programu glownego Prog_3: Set Portd.0 Set Portd.2 Wait 2 'czekaj 2 s Return 'wykonuje powrot do programu glownego Prog_4: Set Portd.1 Set Portd.3 Wait 2 'czekaj 2 s ' Return 'wykonuje powrot do programu glownego Prog_5: Set Portd.0 Set Portd.1 Wait 2 'czekaj 2 s Return 'wykonuje powrot do programu glownego Prog_6: Set Portd.2 Set Portd.3 Wait 2 'czekaj 2 s ' Return 'wykonuje powrot do programu glownego Prog_7: Set Portd.0 Set Portd.1 Set Portd.2 Set Portd.3 Wait 2 'czekaj 2 s Reset Portd.0 Reset Portd.1 Reset Portd.2 Reset Portd.3 Waitms 500 'czekaj 0.5 s Set Portd.0 Set Portd.1 Set Portd.2 Set Portd.3 Waitms 1500 'czekaj 1.5 s ' Return 'wykonuje powrot do programu glownego End Oczywiście żaden program nie bedzie bez schematu : wiec proszę o sprawdzenie zarówno programu jak i schematu;p A jeszcze jedno co do języka bascom. Jaka komenda przenosi do podprogramu i z niego nie wychodzi aż do odpowiedniego wydarzenia?? ps: mam nadzieje ze temat nie poleci do kosza w razie czego pytać to wytłumaczę bo nie wiem czy ........... Komentarz dodany przez: treker: Co to ma wspólnego z robotyką? Przenosze.
pawel Sierpień 8, 2008 Udostępnij Sierpień 8, 2008 Program dobrze, schemat też. W BASCOMIe do programu wchodzisz poleceniem Gosub, a żeby wyjść z podprogramu pod pewnym warunku to umieszczasz polecenie Return w instrukcji warunkowej.
Decado Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 A ja tu widze mały błąd. Bo popatrz naciśniesz S1 a potem S2 to będziesz miał zapalone segmenty z S1 i z S2. Dodaj w programie zerowanie wyjśc(na diody) przy naciśnięciu następnego przycisku a potem dopiero ustawienie jego podporgramu.
_cyna_PL Sierpień 9, 2008 Autor tematu Udostępnij Sierpień 9, 2008 Co to ma wspólnego z robotyką? Z robotyka nic ale z programowaniem owszem. W BASCOMIe do programu wchodzisz poleceniem Gosub, a żeby wyjść z podprogramu pod pewnym warunku to umieszczasz polecenie Return w instrukcji warunkowej. a mógłbyś podać przykład [chodzi mi o takie coś ze jednym przyciskiem wchodzę do podprogramu a drugim wychodzę do głównego programu [nie umiem niczego takiego znaleźć ;/] Dodaj w programie zerowanie wyjśc(na diody) przy naciśnięciu następnego przycisku czy chodzi a cos takiego Prog_1: Set Portd.0 Reset Portd.1 Reset Portd.2 Set Portd.3 Return Komentarz dodany przez: treker: Z robotyka nic ale z programowaniem owszem. To co robiło w dziale Robotyka - Programowanie
Decado Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 nie do każdego dodaj Portd.0 = 0 portd.1 = 0 portd.2 = 0 portd.3 = 0 Wtedy będzie dobrze działac
pawel Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 Jeśli chodzi o to wychodzenie to chodzi o coś takiego: podprogram: Do If pin0.b=0 Then Return End If Loop
Decado Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 pawel wprowadzasz w błąd. Taki podprogram będzie w rzeczywistości pętlą nieskończoną. Cyna dobrze napisał podprogramy.
_cyna_PL Sierpień 9, 2008 Autor tematu Udostępnij Sierpień 9, 2008 Właśnie tez tak myślałem ;/ Ale nie wiem jak zrobić aby wychodzić z podprogramu gdy zastanie nacisniety przycisk ;/ Portd.0 = 0 portd.1 = 0 portd.2 = 0 portd.3 = 0 gdzie ?? bo nie rozumiem przekopiuj większy kawałem programu
Decado Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 Pisze teraz tak prowizorycznie bo niemam czasu musze zakonczyc do jutra swój projekt z którym mam troszke pracy. Prog_2: Reset Portd.0 Reset Portd.1 Reset Portd.2 Reset Portd.3 Set Portd.1 Set Portd.2 Wait 2 'czekaj 2 s ' Return 'wykonuje powrot do programu glownego Gdyby procke chodził bardzo wolno(20Hz) było by widac migotanie ale powyżej 50 podobno już nie widac a więc nie powinno byc problemu. Pozdrawiam
pawel Sierpień 9, 2008 Udostępnij Sierpień 9, 2008 Wydaje mi się że teki mój kod jest dobry ale jeszcze dodam tam kilka żeczy. podprogram: 'instrukcje zawarte w podprogramie Do If pin0.b=0 Then Return End If Loop Return
_cyna_PL Sierpień 10, 2008 Autor tematu Udostępnij Sierpień 10, 2008 Oki już zrozumiałem błąd . Ale jeszcze co do tych podprogramów : Do If Pinb.0 = 1 Then Gosub Program1 ' przycisk 1 End If Loop Program1: Do If Pinb.1 = 1 Then Return ' przycisk 2 End If Portd.0 = 1 Portd.1 = 1 Loop Czy takie coś będzie działać ?? można użyć dwóch nieskończonych pętli ?? 1 przycisk wchodzi do podprogramu 2 przycisk wychodzi z niego ?? pozdro )
mictronic Sierpień 10, 2008 Udostępnij Sierpień 10, 2008 Nie nie może być dwóch pętli : D Niedokońca rozumiem jaki jest problem ale napisze cos : P Jesli zrobisz tak: Do If Pinb.0 = 1 Then gosub program1 waitms 50 Loop Program1: If Pinb.1 = 1 Then Return waitms 50 Portd.0 = 1 Portd.1 = 1 end sub Program poleci tam tylko wtedy gdy pinb.0 będzie w stanie wysokim,jeśli chcesz się tam zatrzymać gdy tylko raz przyciśniesz przycisk musisz policzyć kliknięcia...Coś takiego: dim licznik as byte Do If Pinb.0 = 1 Then incr licznik if licznik =1 then gosub program 1 'program skacze tam z każdym cyklem zegara do czasu gdy zmienna przyjmie inna wartość. waitms 50 Loop Program1: If licznik=2 Then Return licznik=0 'zerujemy bo inaczej musiałbyś naciskać 253 razy... end if Portd.0 = 1 'główny program podprogramu : P Portd.1 = 1 waitms 50 end sub To tyle, powinno działać ale różnie to jest... Pozdrawiam Mictronic!
Pomocna odpowiedź
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ę »