Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Atmega644/Bascom - Zmiana z paru przycisków na jeden

byblue 03 Sty 2013 02:20 2277 12
  • #1 03 Sty 2013 02:20
    byblue
    Poziom 12  

    Witam.
    Proszę o pomoc w zmianie sterowania z tych paru przycisków na jeden.
    Dokładnie chodzi o to, żeby można było zmieniać podprogramy jednym przyciskiem i żeby nie trzeba było czekać na zakończenie podprogramu lub resetować.
    Z góry dziękuje.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0 12
  • #2 03 Sty 2013 02:51
    Ilmarinen
    Poziom 12  

    Można to zrealizować w pętli głównej programu. Deklarujesz zmienna "nr_programu". Dla każdego podprogramu wstawiasz instrukcje warunkową która w zależności od wartości zmiennej "nr_programu" realizuje odpowiednią sekwencje czyli dla
    nr_programu = 1 -> program 1
    nr_programu = 2 -> program 2
    nr_programu = 5 -> program 5
    itd..

    Zostawiasz 1 przycisk którym kolejno zwiększasz "nr programu" instrukcją "incr nr_programu" dodatkowo wstawiasz warunek że po dojściu do nr_programu = 21(na przykład) z powrotem zaczynasz zmiany programu od 1.

    To jest jakieś rozwiązanie ale przy tak zbudowanym programie będzie problem z reakcją na naciśniecie przycisku a to przez to że instrukcja wait wstrzymuje działanie procesora.

    Najlepszym wyjściem było by odmierzanie odcinków czasu za pomocą Timera.
    Można by wtedy praktycznie cały program umieści c w podprogramie obsługi przerwania timera.

    Można tez wykorzystać instrukcje rotate lub shift do załączania odpowiednich schodków przy założeniu że zmiany występują w stałych odcinkach czasu np. co 1 sekundę.

    0
  • #3 03 Sty 2013 11:41
    byblue
    Poziom 12  

    Dziękuję za info. w końcu to jakoś zrozumiałem (mniej więcej...)
    Jako, że stawiam pierwsze kroki czy mógłbym prosić o przykład jak to wygląda...
    Jak się deklaruje zmienną itd... bo jakoś czytam o tym i nie potrafię złożyć tego logicznie.
    Pozdrawiam

    0
  • #4 03 Sty 2013 13:23
    Ilmarinen
    Poziom 12  

    No niestety jak dopiero zaczynasz zabawę z programowaniem to sie nie dogadamy musisz opanować jakieś sensowne podstawy. Musiał bym w tym wątku zrobić kurs programowania. Mogę polecić Ci "Mikroprocesorowa oślą łączkę" Góreckiego (do znalezienia w internecie)tam masz łopatologicznie wyłożone podstawy z obszernym komentarzem. Ewentualnie "Programowanie mikrokontrolerów AVR w języku BASCOM" Wiązani. Algorytm z grubsza Ci podałem teraz musisz opanować programowanie na tyle żeby go zrozumieć i zaimplementować, inaczej sie nie da.

    Jak będziesz miał konkretne pytania to pisz spróbuje pomóc.

    0
  • #5 03 Sty 2013 15:20
    byblue
    Poziom 12  

    Mam P.Górecki "Mikrokontrolery dla początkujących" ale jakoś nie ogarniam... Na przykładach mi się lepiej uczy bo chociaż mogę po ćwiczyć, a budowa programu od podstaw no niestety jest jeszcze dla mnie ciężka... Ale i tak dziękuję za chęci.
    Pozdrawiam.

    0
  • #6 03 Sty 2013 17:19
    Rokita1993
    Poziom 19  

    Mogę się mylić, ale można zrobić przejścia do innych podprogramow z podprogramu obsługi przerwań, a dany przycisk podpiąć pod wejście Int0.

    Dodano po 1 [godziny] 17 [minuty]:

    Mogę ci trochę z tym pomóc, trochę doradzić, coś wytłumaczyć.

    0
  • #7 03 Sty 2013 19:25
    byblue
    Poziom 12  

    Oczywiście bardzo chętnie spróbuje wszystkich porad.
    Powiedz co mam zrobić czy napisać...
    Pozdrawiam

    0
  • #8 03 Sty 2013 19:33
    Rokita1993
    Poziom 19  

    Znasz obsługe przerwań?
    Konkretnie to przerwania zewnętrznego Int0?
    Pod ten pin musisz podłączyć przycisk.
    Następnie w podprogramie obsługi tego przerwania piszesz instrukcje zwiększania jakiejś zmiennej. Po czym w tym podprogramie sprawdzasz wartość tej zmiennej w kilku przypadkach i zależności od tego przechodzisz do odpowiedniego podprogramu, w którym będą wykonywane twoje zapalania diod itp.


    W razie czegoś (problemów z programem, schematem, lub jeszcze coś innego) pytaj tutaj albo na PW.

    0
  • #9 03 Sty 2013 21:22
    byblue
    Poziom 12  

    Wlaśnie przestudiowałem przerwania INT0 i INT1 no i wychodzi na to, że raczej nie da się tak zrobić jak chciałem. Ponieważ moje pod programy są w pętli, a przerwanie czeka na zakończenie podprogramu...

    0
  • #10 03 Sty 2013 21:27
    Rokita1993
    Poziom 19  

    a moglbys podesłać listing (kod) twojego programu?
    coś zaradzimy.

    0
  • #11 10 Sty 2013 22:45
    byblue
    Poziom 12  

    Już nie mam więcej pomysłów...po prostu nie ogarniam tego.
    Czytam o zmiennych i jakoś nic mi z tego nie wychodzi a to przecież taki prosty programik do zrobienia.
    Pomóżcie koledzy ! Czego mi TU brakuje, że nic nie działa ?!

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #12 11 Sty 2013 01:47
    Ilmarinen
    Poziom 12  

    Cześć,
    musisz wiedzieć jak mikrokontroler wykonuje program żeby to zrozumieć.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mikrokontroler wykonuje program linia po linii, czyli najpierw konfigurujesz port a(linia 1.) potem go ustawiasz(linia 2.). W linii 7. definiujesz zmienną a w linii 8. nadajesz jej wartość. Do tej pory idzie gładko mikrokontroler linia po linii wykonuje twoje polecenia.
    Zabawa zaczyna sie gdy wchodzisz w pętlę do loop linia 9. i 12..

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mikrokontroler dalej wykonuje program linia po linii
    przechodzi przez 9. czyli początek pętli,
    wykonuje polecenia debounce 10. , 11,
    i teraz najważniejsze, gdy mikrokontroler napotka polecenie loop program przeskakuje do linii 9. (do) czyli początku pętli
    następnie wykonuje jeszcze raz polecenia debounce
    i znów skacze do początku pętli i tak w nieskończoność.

    Program wpadł w pętlę główną programu i wykonuje polecenia w niej zawarte. Ty akurat masz w niej tylko sprawdzanie naciśnięcia przycisków.


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    W momencie naciśnięcia przycisku pind.0 program skacze do linii w której jest etykieta zwiększ 14., później wykonuje sie znów linii po linii (od 14. do 16.)dopóki nie napotka polecenia return 16. która powraca do linii w której wywołany był podprogram "zwieksz" czyli do linii 10. i dalej wykonuje sie linia po linii (10. 11. 12. .. itd).

    Instrukcje warunkowe i instrukcje select case daleś za podprogramami "zwieksz", "zmniejsz" i za poleceniem loop dlatego nie maja prawa się wykonać.

    Wszystko co ma robić mikrokontroler powinno zawierać się w głównej pętli programu.(!upraszczam!)

    Podprogramy umieszcza sie na końcu programu do przeskoczenia do nich używa sie polecenia gosub poszukaj polskiej pomocy do bascoma tam masz wszystkie zagadnienia wyjaśnione z przykładami.

    0
  • #13 08 Cze 2014 13:20
    byblue
    Poziom 12  

    Temat rozwiązany. Dziękuję za info.
    Pozdrawiam

    0