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.

Atmega 8 - Licznik do14, Kod C jak wyzerować licznik pierwszym impulsem?

sp5gbw 23 Sty 2016 17:45 1272 11
  • #1 23 Sty 2016 17:45
    sp5gbw
    Poziom 17  

    Witam.
    Napisałem programik na licznik do 14-stu. Korzystając z WinAVR i USBasp program działa. Jednak ponieważ licznik jest sterowany przez łącze radiowe i ma zliczać za każdym razem od początku paczki impulsów przesyłane np. co 10 sekund, to pomyślałem, że pierwszy impuls mógłby być zerującym.
    Jeśli to niekonieczne wolałbym, aby nie wykorzystywać Timerów. Proszę o pomoc jak można by rozwiązać ten problem?
    Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 11
  • #2 23 Sty 2016 19:13
    Kuniarz
    Moderator Projektowanie

    Musiałbyś dodać zmienną, która będzie służyła do odmierzania czasu bez impulsów, tzw. "timeout". Jeśli przez okres ponad 10 s nie przyjdzie żaden impuls, to n=0.
    Wbrew pozorom, liczenie timeoutów najłatwiej zrealizować w przerwaniu :)

    Dodano po 1 [godziny] 18 [minuty]:

    fragmenty kodu:

    inicjalizacja przerwań (akurat dla Atmega32)

    Kod: c
    Zaloguj się, aby zobaczyć kod



    obsługa tego przerwania :

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Wartości wpisywane w licznik musisz sobie oczywiście dobrać, tak samo nazwy zmiennych. To tylko przykład zarysowujący temat.

    0
  • #3 23 Sty 2016 22:56
    Fredy
    Poziom 27  

    Straszny ten kod jest.
    Przykładowo - po co jest coś takiego:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    albo to:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zastanów sie czy ten delay ma jakiś wpływ na drgania.
    Czy nie lepiej po tym delayu raz jeszcze dać ifa?

    0
  • #4 24 Sty 2016 10:11
    sp5gbw
    Poziom 17  

    Dziękuję za uwagi odnośnie kodu, rzeczywiście for(;;) nie jest potrzebny. Sorry za moje pytanie: delay jest w kodzie tylko wtedy, gdy PIN realizuję przyciskiem mechanicznym podczas testowania kodu; a pytanie - co oznacza "ifa"?

    0
  • #5 24 Sty 2016 10:17
    Kuniarz
    Moderator Projektowanie

    Ech... Kolego, daleka droga jeszcze Cię czeka :)
    _delay to pauza, więc w prawidłowej obsłudze przycisku powinno to wyglądać tak:
    - jeśli wciśnięto to:
    - czekaj 25ms
    - znów sprawdź, czy przycisk nadal jest wciśnięty (to ten brakujący "if")
    - jeśli tak to wykonaj obsługę przycisku

    "ifa" nie istnieje, to takie spolszczenie "if" :)

    0
  • #6 24 Sty 2016 10:24
    sp5gbw
    Poziom 17  

    Dziękuję koledze "Kuniarz". Z inicjalizacją dla Atmega8 to myślę, że sobie gdzieś doczytam, tylko gdzie w moim kodzie, inicjalizację oraz obsługę przerwania umieścić.
    PS. może zna kolega jakąś stronę (link) z informacjami o timerach w dla "opornych" w C?

    0
  • #7 24 Sty 2016 10:35
    Kuniarz
    Moderator Projektowanie

    No tu google musi pomóc, pierwszy lepszy link : http://www.robotyka.net.pl/mikrokontrolery-avr-czesc-5-przerwania/

    ...chciałem coś w tym sofcie skrobnąć, ale jak wkleiłem to w Atmel Studio i chciałem uporządkować nawiasy, to tam chyba jest coś zdrowo poryte - to się w ogóle kompiluje ?
    Po drobnej edycji mam tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    ale w tym przypadku n będzie rosło w nieskończoność, a wyświetlacz zmieni wartość tylko powyżej n>9.

    0
  • #8 24 Sty 2016 11:27
    sp5gbw
    Poziom 17  

    Tak, działa to u mnie dobrze, tyle tylko, że po osiągnięciu "14", wyświetlane są dziwne znaki.
    Natomiast w ostatniej wersji kolegi, code 2.

    0
  • #10 24 Sty 2016 18:50
    sp5gbw
    Poziom 17  

    Dzięki za uwagi, rzeczywiście kod działa bez nawiasu po n+1; oto wersja, po poprawkach kompilująca się również w AS 6:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ciekaw jestem czy u kolegi też się kompiluje?
    Pozdrawiam.

    0
  • #12 26 Sty 2016 18:55
    sp5gbw
    Poziom 17  

    Rozumiem, Umieściłem zgodnie z pierwszą sugestią konfigurację timera, program nadal działa lecz inaczej; teraz po naciśnięciu PIND, licznik liczy b. szybko chyba się przepełnia i tak dookoła. Gdy próbowałem wkleić obsługę przerwania - brak kompilacji. Czy można wydłużyć jeszcze czas timera(np. do testów)? no i gdzie umieścić obsługę przerwania aby chciało to się kompilować? A jeśli "timeout " to jak to napisać?
    Oto kod po przeróbkach:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Delay musiałem zawiesić bo nic się nie działo...

    0