logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Obsługa przycisków w C - Przyciski i diody atmega32

szegerege1 27 Lip 2015 17:43 3264 18
  • #1 14879329
    szegerege1
    Poziom 7  
    Witam szanowne forum. Zaczynam uczyć się programowania mikrokontrolerów w C. Jak zawsze, początki nie są łatwe. Proszę o pomoc i naprowadzenie mnie na dobry kierunek. Jestem na etapie obsługi pinów procesora,tz. w założeniu jest tak, że mam 4 przyciski podłączone do portu. Port jest ustawiony, jako wejście i podciągnięty do vcc. Do innych 4 pinów podłączone są 4 diody. Port ustawiony, jako wyjście i podciągnięty do vcc. Napisałem prosty programik, gdzie po wciśnięciu przycisku zapala się dioda, ale kiedy zwolnię przycisk, to dioda gaśnie. Nie mogę natomiast zaskoczyć, jak zrobić, a żeby np. po wciśnięciu przycisku i zwolnieniu go diodka nadal świeciła. Po naciścięciu kolejnego przycisku poprzednia diodka zgasła i zapaliła się kolejna, przypisana do przycisku nr2. Po naciśnięciu przycisku nr3 zgasła diodka nr2 i zaświeciła nr3, itd...Coś,jak przekaźnik z podtrzymaniem. Oczywiście szukałem w necie, ale na taki akurat temat nie natrafiłem. Jest to mój pierwszy post na Tym Forum, a więc proszę o wyrozumiałość. Byłbym wdzięczny za wszelką pomoc. Dziękuję i czekam na pomoc. Szegerege1.
  • #2 14879355
    Tomasz Gutewicz
    Poziom 12  
    Potrzebujesz wprowadzić dodatkowe zmienne tzw. flagi. Niech przy starcie programu mają wartość 0, w pętli badaj stan przycisku i jeżeli wciśnięty zostanie przycisk pierwszy zmień stan flagi pierwszej na przeciwny, później sprawdzaj stan flag. Jeśli flaga jest równa zero gaś diody w przeciwnym razie zapal diode - analogicznie dla kolejnych przycisków i diód.
  • #3 14879435
    szegerege1
    Poziom 7  
    Witam Tomaszu. Dziękuję za tak szybką odpowiedź. Jeśli chodzi o flagę, to wielokrotnie się z tym spotkałem przy okazji poznawania np. wyświetlacza lcd i przy opisach innych projektów, ale szczerze pisząc, to nie rozumiem tej kwestii na tym etapie. Zadawałem pytania w google i gdzie się da, ale nic mi to nie wniosło do mojej wiedzy. Droga będzie trudna :cry: . Gdybyś mógł jakoś prościej, albo napisać coś dla jednego przycisku i diody i co najważniejsze dobrze opisać, a żebym zrozumiał cały zapis. Nie chodzi mi o kopiowanie i wklejanie, tylko o wiedzę. Mam książkę BB i zestaw uruchomieniowy ATB, ale nigdy się o tym nie uczyłem i po prostu cała ta terminologia i słownictwo do mnie nie dociera. Dlatego tak ciężko idzie. To dokładnie, jak kiedyś ktoś powiedział "kliknij myszką i zainstaluj program". Dzisiaj się z tego śmieję, ale wtedy nie było do śmiechu tak, jak teraz :D . Proszę o cierpliwość i jeszcze raz dzięki za zainteresowanie.
  • #4 14879599
    dondu
    Moderator na urlopie...
    Przede wszystkim witamy i prosimy byś pokazał swój program :)
    To zawsze jest podstawa do analizowania Twojego problemu. Schemat także bywa istotny, ale w tym przypadku sobie go na razie odpuścimy.

    Musisz jeszcze wiedzieć, że styki w przyciskach drgają: http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html
    więc musisz to uwzględnić w swoim programie.
  • Pomocny post
    #5 14879679
    Tomasz Gutewicz
    Poziom 12  
    Dawno nic nie skrobałem dla AVR, poniżej kod który skompilował się lecz nie ma jak przetestować. Do sprawdzania wciśnięcia klawiszy powinieneś napisać funkcję, która będzie to robić zamiast ciągłego wstawiania prawie tego samego kodu.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 14879718
    BlueDraco
    Specjalista - Mikrokontrolery
    Fajny przykład jak nie pisać programu reagującego na przyciski... ;) Trzy zbędne znaczniki, zbyt długie oczekiwanie itd. Przecież wystarczy w jednej linijce kodu wywoływanego w przerwaniu timera wykryć zmianę stanu przycisku przy pomocy jednej dodatkowej zmiennej, a pod if() umieścić całą reakcję na przycisk. Kod wklejam tu mniej-więcej raz na miesiąc, więc proponuję przeszukanie forum. ;)
  • #7 14879733
    Tomasz Gutewicz
    Poziom 12  
    @BlueDraco: tak timer + jeszcze bitowe testowanie jednej zmiennej = autor tematu leży i kwiczy
  • #8 14879811
    szegerege1
    Poziom 7  
    Bardzo dziękuję Tomaszu za pomoc i poświęcony czas. Potrenuję dzisiaj z tym kodem
    i dam znać, jak się zachowuje. Dzisiaj już nie będę odpisyał, ale się odezwę.
    Witam dondu i dziękuję za powitanie i chęć pomocy. Programik, który testowałem, jest zaczerpnięty z Atnel forum i na podstawie BB.
    Na razie robiłem to z jednym przyciskiem i jedną diodą, ale w zamyślę ma być ich kilka. Oczywiście znalazłem różne metody pisania programu do sterowania pinami,
    ale akurat użyłem tego. Jest tu wiele makr i nie wiem, czy akurat ten sposób jest
    właściwy przy moim pomyśle. Przepraszam, jeśli piszę głupoty.
    Schemat mogę namalować, ale jest on "typowy". Cztery piny wybranego portu do przycisków i cztery kolejne piny do diod (docelowo przekaźniczki) . Pomijam temat prawidłowego zasilania,mas,filtracji...itd.Temat jest mi znany.
    Dziękuję za link o drganiach.Ten temat równierz wałkuję.
    Wkleję kod i komentarze, które dopisałem. Staram się je pisać jak najwięcej, gdyż pomagają one mi w nauce i zrozumieniu zapisu. Jeśli gdzieś napisałem głupoty, to proszę mnie poprawić.Ciekawy jestem, czy uda mi się umieścić listing w moim poście. I najważniejsze, proszę mi odpowiedzieć, czy aby nie robię gafy zamieszczając ten kod w moim poście. Nie jest on mój, ale ogólnie dostępny i nadmieniłem, skąd zaczerpnąłem te informacje. Dziękuję i pozdrawiam. szegerege1


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Moderowany przez dondu:

    SYNTAX poprawiłem. Następnym razem po prostu edytuj post zamiast wklejać nowy post poniżej.

  • #9 14879884
    BlueDraco
    Specjalista - Mikrokontrolery
    Bez pprzerwania timera w praktyce nie da się zrobić prawie nic, co by działało, więc idąc taką ścieżką za chwilę wpadniesz w problemy typu "dlaczego urzdzenie nie reaguje na cośtam?"
  • #10 14879930
    Tomasz Gutewicz
    Poziom 12  
    Owszem bez timera bardziej zawarowanego projektu nie napisze lecz jak widać kolega jest początkujący, więc nie ma co mu teraz mieszać w głowie.

    szegerege1 napisał:

    Coś nie wyszło z wysłaniem kodu. Wybrałem syntax c++. Nie widzę możliwości wybrania koloru czcionki.Co robię źle???

    Przy wklejaniu kodu przesunęła się klamra ] ustaw ją w odpowiednie miejsce.
  • #11 14880312
    szegerege1
    Poziom 7  
    Witam Tomaszu.
    Bardzo dziękuję za pomoc. Twój program działa bardzo dobrze.Troszkę zmieniłem litery portów, ponieważ akurat inaczej miałem podłączone kabelki w zestawie uruchomieniowym.

    Był jeden error w linijce "zapal diodę 2, zgaś diody 1 i 3". Usunąłem zbędny nawias z prawej strony i kompilacja przebiegła prawidłowo. Oczywiście kliknołem "pomógł" i jeszcze raz dziękuję. Temat uznaję za zamknięty, ale dziękuję równierz pozostałym kolegom za chęć pomocy i jeśli zechcieliby przedstawić inną metodę do osiągnięcia mojego celu, to będę wdzięczny. Jak napisałem wcześniej, nie zależy mi na skopiowaniu czyjejś pracy (rezultat przecież już mam) , a na nauce. Następnym krokiem pewnie będzie zgłębienie tajników przerwań. Proszę o wyjaśnienie tematu flagi, najprościej dla topornych :D . Dziękuję i pozdrawiam. szegerege1
  • #12 14880946
    dondu
    Moderator na urlopie...
    szegerege1 napisał:
    Proszę o wyjaśnienie tematu flagi, najprościej dla topornych :D


    Właściwe wyjaśnił to kol:

    Tomasz Gutewicz napisał:
    Potrzebujesz wprowadzić dodatkowe zmienne tzw. flagi. Niech przy starcie programu mają wartość 0, w pętli badaj stan przycisku i jeżeli wciśnięty zostanie przycisk pierwszy zmień stan flagi pierwszej na przeciwny, później sprawdzaj stan flag. Jeśli flaga jest równa zero gaś diody w przeciwnym razie zapal diode - analogicznie dla kolejnych przycisków i diód.

    De facto w tak prostym przypadku nie trzeba żadnej dodatkowej zmiennej, gdyż flagą jest po prostu stan bitu danego pinu w danym porcie, do którego LED jest podłączony.

    Jeśli więc włączasz diodę np. tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to o stanie diody możesz w każdej chwili dowiedzieć się tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poćwicz przykłady z kursu AVR: http://mikrokontrolery.blogspot.com/2011/03/drzaskowy-pamietnik-wstep.html
    oraz operacje bitowe:
    http://mikrokontrolery.blogspot.com/2011/04/problemy-c-ustawianie-i-zerowanie-bitow.html
    http://mikrokontrolery.blogspot.com/2011/02/kurs-jezyka-c-spis-tresci.html

    Przerwań natomiast ucz się szybko, bo uwaga BlueDraco jest bardzo istotna :)
  • #14 14883175
    w1941s
    Poziom 14  
    Jeśli kolega nigdy nie programował, to polecam popisać na pc, jakieś proste programy, zawsze to mniejsze ryzyko, że gdy coś nie śmiga nie trzeba podejrzewać elektroniki. Polecam poczytać ANSI C Kernighan Brian W., Ritchie Dennis M. Naprawdę potem człowiek siada przed avr i dużo łatwiej zacząć, zrozumieć. Tak przynajmniej było ze mną. ;)
  • #15 14883581
    szegerege1
    Poziom 7  
    Witam kolegę w1941s i dziękuję za wskazówki i sugestie.
    Dla mnie każda informacja jest cenna.Tak, jak jestem wdzięczny koledze Tomasz Gutewicz, ponieważ dzięki jego postowi z napisanym kodem zrozumiałem temat flagi, a przynajmniej tak mi się wydaje.Po przeanalizowaniu programu doszedłem do wniosku, że jest to coś, jakby taka pomocnicza zmienna, którą sobie tworzymy, i która pomaga nam wykonać pewne określone i założone przez nas działania.
    Oczywiście dużo czytam, ale czasami sposób podania informacji nie zawsze dociera do ludzi na początku.
    Nieraz wystarczą dwa słowa i zapala się żarówka w głowie i nagle następuje olśnienie :D . Przecież to takie proste.Ale tak , jak piszę, cała ta pisanina dziwnych nazw, słownictwo programistyczne jest po prostu mało zrozumiałe i stąd problemy dla ludzi początkujących.Zapewne wiele osób miało, bądź ma z tym problem.
    Inaczej, jeśli jest się młodym, uczą wykładowcy itd... Natomiast samouk w podeszłym wieku zawsze będzie miał ciężej.
    Ale dzięki Bogu i internetu i forum można coś osiągnąć. Gdyby nie to, zapewne bym się poddał :D .
    Nigdy nie korzystałem z terminala. Przydało by się parę informacji.Podobno są też symulatory do sprawdzania programu. Ja korzystam z Eclipse i tam nic takiego nie ma. Może kolega zna jakiś dobry symulator do tych celów ?. Wiem, że np. WinAVR posiada, ale nie chciał bym teraz zmieniać środowiska, bo akurat w Eclipse mam już jakieś minimalne osiągnięcia. Może potem.
    Wszelkie sugestie i podpowiedzi mile widziane.Pozdrawiam. szegerege1.

    Ps.

    Czy mój tok rozumowania odnośnie tematu flagi jest właściwy ?.
  • #16 14883655
    dondu
    Moderator na urlopie...
    szegerege1 napisał:
    Nigdy nie korzystałem z terminala. Przydało by się parę informacji.

    Wpisz słowo terminal w wyszukiwarce na stronie, którą Ci wskazałem i korzystaj :)

    szegerege1 napisał:
    Podobno są też symulatory do sprawdzania programu. Ja korzystam z Eclipse i tam nic takiego nie ma. Może kolega zna jakiś dobry symulator do tych celów ?.

    Dlatego zawsze będę powtarzał, że wykorzystanie Eclipse przez początkujących jest błędem.

    szegerege1 napisał:
    ... bo akurat w Eclipse mam już jakieś minimalne osiągnięcia. Może potem.

    A jakie to ma znaczenie? Zmieniasz środowisko i tyle - pisany program jest ten sam (bo kompilator i toolchain jest ten sam) więc tylko skopiujesz pliki. Korzystaj z oryginalnego środowiska Atmela, czyli aktualnie Atmel Studio 6.2 który zawiera symulator: http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-spis-tresci.html

    szegerege1 napisał:
    Czy mój tok rozumowania odnośnie tematu flagi jest właściwy ?.

    Tak można to określić - po prostu poćwicz na mikrokontrolerze i/lub w symulatorze.
  • #17 14883718
    szegerege1
    Poziom 7  
    Wielkie dzięki dondu za podpowiedzi. Myślę, że dobrym rozwiązaniem będzie doinstalowanie Atmel Studio 6.2 i pomału przejść na ten drugi program. Korzystać z oryginalnego Atmel Studio 6.2, tzn. zakupić oryginał, czy pobrać np, ze strony:

    http://www.atmel.com/tools/atmelstudio.aspx

    Sorry za dziwne pytania. Pozdrawiam.szegerege1.
REKLAMA