soban Napisano Marzec 8, 2012 Udostępnij Napisano Marzec 8, 2012 Witam wszystkich. Mam mały problem odnośnie programu w C. Może to głupie ale uczę się dopiero tego języka i nie mogę znaleźć odp. na moje pytanie. Jak narazie doszedłem do programu który na przemian zapala dwie diody w określonym czasie: /* * main.c * * Created on: 2012-03-07 * Autor: Maciej Sobański * Migacz */ #include <avr/io.h> #include <util/delay.h> // definicje dla preprocesora // dioda LED #define LED1_PIN (1<<PC7) // definicja pinu do którego podłączona jest dioda #define LED2_PIN (1<<PC5) // definicja pinu do którego podłączona jest dioda #define LED1_TOG PORTC ^= LED1_PIN // makrodefinicja – zmiana stanu diody #define LED2_TOG PORTC ^= LED2_PIN // makrodefinicja – zmiana stanu diody // ********************************************************* 1-sza wersja int main(void) { // ****** inicjalizacja ********* DDRC |= LED1_PIN; // kierunek pinu PC7 – wyjściowy DDRC |= LED2_PIN; // kierunek pinu PC5 – wyjściowy // ****** pętla główna programu ********* ;while(1) { LED1_TOG; //Gasi Diode 1 _delay_ms(200); //Czeka 1s LED1_TOG; //Zapala Diode 1 LED2_TOG; //Gasi Diode 2 _delay_ms(200); //Czeka 1s LED2_TOG; //Zapala Diode 2 } } Chodzi o to żeby program działał na zasadzie lampki rowerowej czyli, za pomocą jednego przycisku (np podpiętego pod PD0) zmieniał funkcję świecenia się diod. Dajmy na to przykład. Wciskam raz świeci się jedna dioda, wciskam drugi raz świecą się dwie, wciskam jeszcze raz i świecą się na przemian jak w programie wyżej. Bardzo proszę o pomoc. Link do komentarza Share on other sites More sharing options...
MirekCz Marzec 8, 2012 Udostępnij Marzec 8, 2012 Robisz coś takiego: int main(void) { ... //inicjalizacja ... char stan =0; while(1) { if (Nacisnietoklawisz()) { stan++; if (stan>2) stan=0; //czyli stan może przyjąć wartość 0,1 lub 2 } if (stan==0) { //tutaj co ma sie dziac przy stanie 0 - bez naciśnięcia klawisza lub co trzecie.. } else if (stan==1) { //tutaj co ma sie dziac przy stanie 1 -po jednym naciśnięciu klawisza } else { // w pozostalych przypadkach - gdy stan jest 2 - po dwóch naciśnięciach klawisza } } } Czyli klawiszem ustawiasz kolejne stany zmiennej stan, a potem w pętli sprawdzasz jaki masz stan i odpowiednio regulujesz świecenie diod 1 Link do komentarza Share on other sites More sharing options...
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 Mirek nie pokazał co ma w funkcji Nacisnietoklawisz(). A to bardzo istotne ze względu na: Drgania styków przycisku tym bardziej, że nie piszesz, abyś miał eliminację sprzętową. Link do komentarza Share on other sites More sharing options...
soban Marzec 8, 2012 Autor tematu Udostępnij Marzec 8, 2012 stan++; Co to oznacza? Bo w programie wyskakuje mi przez to błąd? Mirek nie pokazał co ma w funkcji Nacisnietoklawisz(). A to bardzo istotne ze względu na: Drgania styków przycisku tym bardziej, że nie piszesz, abyś miał eliminację sprzętową. Miałem kiedyś (na swojej płytce - początki programowania BASCOM) z tym problem i właśnie zastanawiałem się nad tym. Teraz pracuję z płytką EvB 4.3 firmy And-Tech bo postanowiłem NAUCZYĆ SIĘ języka C, no i powiem Ci, że choć nie widzę tam niczego takiego jak w twoim linku, to dioda pracuje jak najbardziej poprawnie bez żadnych problemów. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 To zwiększenie zmiennej STAN o 1. Pokaż jaki błąd. [ Dodano: 08-03-2012, 15:55 ] ... no i powiem Ci, że choć nie widzę tam niczego takiego jak w twoim linku, to dioda pracuje jak najbardziej poprawnie bez żadnych problemów. Magiczny BASCOM załatwiał pewnie ten problem za Ciebie ... fizyki nie da się przeskoczyć 🙂 W C masz pełną kontrolę nad prawie wszystkim, ale za to nieco więcej obowiązków. Link do komentarza Share on other sites More sharing options...
soban Marzec 8, 2012 Autor tematu Udostępnij Marzec 8, 2012 dondu - jest napisane takie coś : 'stan' undeclared (first use in the function), Line breakpoint: main.c [line: 33] [ Dodano: 08-03-2012, 15:58 ] Magiczny BASCOM załatwiał pewnie ten problem za Ciebie ... fizyki nie da się przeskoczyć 🙂 Jak pracowałem z BASCOM'em to właśnie wyskakiwał "ten błąd", teraz programuję w C i nic takiego nie ma ;] Link do komentarza Share on other sites More sharing options...
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 Oj, musisz łyknąć jakąś książkę lub kurs. http://mikrokontrolery.blogspot.com/p/ksiazki-dla-ciebie.html http://kursc.forbot.pl/ To oznacza, że masz nie zadeklarowaną zmienną - w kodzie Mirka jest ona zadeklarowana: char stan =0; [ Dodano: 08-03-2012, 16:00 ] ... teraz programuję w C i nic takiego nie ma ;] Ten cud (a właściwie jego brak) objawi się i niechybnie Ciebie zaskoczy jeżeli się nie zabezpieczysz - link podałem - filmik jest, algorytmy itp także - nic tylko czytać i stosować 🙂 Link do komentarza Share on other sites More sharing options...
soban Marzec 8, 2012 Autor tematu Udostępnij Marzec 8, 2012 Korzystam z książki : ) MIKROKONTROLERY AVR JĘZYK C - PODSTAWY PROGRAMOWANIA Mirosław Kardaś Wystarczyło dodać do prgramu taką linijkę : while(1) { if( KEY_DOWN ) //klawisz wciśnięty? { _delay_ms(80); //czas drgania styków if( KEY_DOWN ) //klawisz nadal wciśnięty? { LED1_TOG; //zmiana stanu diody LED _delay_ms(200); //pauza 200ms } } } Przy okazji po co dodano to 200ms na końcu programu?? Link do komentarza Share on other sites More sharing options...
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 Wystarczyło dodać do prgramu taką linijkę : .... _delay_ms(80); //czas drgania styków .... } } Oczywiście to załatwia problem i w Twoim przypadku prawdopodobnie Ci wystarczy. Jak już dojdziesz do programów, gdzie delay() nie będziesz mógł stosować zaglądnij tutaj: EPP: Drgania styków - zmora początkujących [ Dodano: 08-03-2012, 16:07 ] Przy okazji po co dodano to 200ms na końcu programu?? Zastanów się co będzie się działo z LEDem, gdy tego opóźnienia nie będzie. Link do komentarza Share on other sites More sharing options...
soban Marzec 8, 2012 Autor tematu Udostępnij Marzec 8, 2012 Usunąłem i powiem że przycisk zaczął działać jak chce coś w stylu drgania tych styków Link do komentarza Share on other sites More sharing options...
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 Usunąłem i powiem że przycisk zaczął działać jak chce coś w stylu drgania tych styków I jaki z tego wniosek? Link do komentarza Share on other sites More sharing options...
soban Marzec 8, 2012 Autor tematu Udostępnij Marzec 8, 2012 Ma czekać 200ms aby nie wiem? Odczekać to drganie styków podczas puszczania przycisku? Link do komentarza Share on other sites More sharing options...
dondu Marzec 8, 2012 Udostępnij Marzec 8, 2012 Ma czekać 200ms aby nie wiem? Odczekać to drganie styków podczas puszczania przycisku? W tym algorytmie eliminację drgań styków załatwia _delay_ms(80). Ten drugi delay(200) jest do tego abyś mógł zaobserwować zmiany LED na przeciwny. Mam wrażenie, że nie czytasz ani książki, ani tego artykułu z linku który Ci podałem. To dobra książka więc sugeruję, żebyś zamiast się spieszyć czytał dokładnie i powoli źródła wiedzy, by z każdym drobiazgiem na forum tematu nie zakładać. Powodzenia! 🙂 1 Link do komentarza Share on other sites More sharing options...
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ę »