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.

atmega162 - break, ustawianie flagi przyciskiem, i inne pytania

Gorylov 06 Wrz 2013 18:06 1308 6
  • #1 06 Wrz 2013 18:06
    Gorylov
    Poziom 6  

    Witam, uczę się języka C na płytce kursu AVT3505 z atmegą162 i wyświetlaczem LED.
    Moim celem jest stworzenie programu który zlicza od pierwotnej wartości i do zera, a następnie przerywa program i zmienia stan czwartego pinu portu D na przeciwny.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Oczywiście, program nie działa w 100% tak jakbym sobie tego życzył, mianowicie:

    1.z niewiadomych mi przyczyn(prawdopodobnie niedopatrzenie) nie potrafię zaprzęgnąć przycisków (PORTE 0 i 2 są zwierane przyciśnięciem S1 i S2 do masy), po naciśnięciu zainicjowana ma zostać sekwencja odliczania

    2.gdy usunę przerwanie i wrzucę jego instrukcję do main(void), uC po prostu nie zlicza i na wyświetlaczu wyświetla się ósemka, czyli nic się nie dzieje, jeśli już miałoby być przerwanie, to chciałbym aby było ono wywoływane przez naciśnięcie przycisku

    3.mimo że umieściłem break w instrukcji, gdy timer odliczy do zera, odliczanie dalej trwa, czy to może być spowodowane przerwaniem CTC?


    Proszę o porady dotyczące tego, jak poprawnie napisać kod dla powyższych wymagań, a także o piętnowanie, wyśmiewanie i wypominanie błędów(oczywiście z wyjaśnieniem co i dlaczego) :)
    Przepraszam, jeśli piszę niezrozumiale, w razie wątpliwości wyjaśnię o co mi chodziło. Z góry dziękuję za pomoc :)
    Zamieszczam też film pokazujący działanie programu

    Link

    0 6
  • #2 06 Wrz 2013 19:23
    tmf
    Moderator Mikrokontrolery Projektowanie

    Przede wszystkim nie stosuj zapisu typu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Chyba, że działasz w systemie szesnastkowym i taki zapis jest dla ciebie oczywisty. Przejrzyściej jest stosować definicje pinów, lub zapis binarny:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Wtedy od razu widać, który pin jest wejściem, a który wyjściem.
    Poza tym, w handlerze przerwania nigdy nie stosuj _delay_xx - są wyjątki od tej reguły, ale na początek po prostu przyjmij, że tak się nie robi.
    Zauważ też, że brak niewiele zmienia - kończy pętlę, ale co z tego, skoro natychmiast wywoływane jest kolejne przerwanie timera i wszystko zaczyna się od nowa?

    0
  • #3 06 Wrz 2013 20:17
    Gorylov
    Poziom 6  

    Faktycznie, czytałem że przerwania mają być jak najkrótsze i najlepiej, żeby tylko ustawiały flagi, która potem ze słowem warunkowym if(flaga == 1) wykonuje instrukcje w moim przypadku odliczania, mam rację?

    Spróbuję wrzucić te instrukcje w main(void) i wywalić przerwanie timera, miałem z tym problemy ale w końcu do tego dojdę :)

    0
  • #4 06 Wrz 2013 20:46
    tmf
    Moderator Mikrokontrolery Projektowanie

    Nie do końca tak, obsługa przerwań powinna być możliwie krótka, ale realizować założone zadanie. Same ustawienie flagi i pooling w main jest tak samo złym podejściem jak delay w przerwaniu. Ale nie komplikujmy :) Jeśli masz odliczać co 1 sekundę, to dlaczego po prostu przerwanie timera nie zrobisz co sekundę, przy każdym przerwaniu dekrementujesz licznik i wyświetlasz cyfrę na LCD. Odpada delay, odpadają flagi, masz to co chciałeś.

    0
  • #5 08 Wrz 2013 10:50
    Gorylov
    Poziom 6  

    Zmodyfikowałem kod i wywaliłem delay z przerwania:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ..ale gdy program zostaje załadowany, na wyświetlaczu pokazuje się tylko 0 i nic nie chce ruszyć, nie mam za bardzo pomysłu o co teraz chodzi

    0
  • #6 08 Wrz 2013 10:53
    tmf
    Moderator Mikrokontrolery Projektowanie

    Masz pętlę for, która b. szybko wyświetla elementy tablicy liczba, kończy się zawsze wyświetlając element o indeksie 0. Wyrzuć tą pętlę, i uczyś zmienną statyczną, wywołuj przerwanie np. co sekundę, czy co ile tam chcesz i wyświetlaj kolejne wartości z tablicy.

    0
  • #7 08 Wrz 2013 11:16
    Gorylov
    Poziom 6  

    Właśnie wpisałem do przerwania diodę, która mruga więc to faktycznie wina for, będę teraz majstrował, dzięki za pomoc :D

    0