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

ATmega8 - Timer w trybie CTC i wykorzystanie przerwań.

albert.pracz 11 Sty 2014 11:36 6759 9
  • #1 13163621
    albert.pracz
    Poziom 10  
    Witam mam problem, próbuję zrobić proste miganie diodą LED przy pomocy Timer'a w trybie CTC z preskalerem i wykorzystaniem przerwań. To samo udaje mi się wykonać przy pomocy flag, ale przerwania jakoś mi nie idą. Wstawiam tu mój kod i proszę was o pomoc.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #4 13163972
    eleproject

    Poziom 17  
    Kiedyś napisałem prosty przykład użycia Timera w trybie CTC dla AVR w AVR Studio w języku C.
    W załączniku znajduje się ten gotowy kompletny program powodujący przerwanie od porównania (Compare) co około 250 ms i generujący przy okazji falę prostokątną na wyjściu OC0A. Otrzymujemy w ten sposób przebieg prostokątny na tej nóżce o okresie 2 Hz (2x250 ms = 500 ms -> 2Hz, podpinając diodę LED z rezystorem można zaobserwować tą częstotliwość).
    W pliku znajduje się pełny opis konfiguracji rejestrów.
    Załączniki:
  • #5 13164247
    albert.pracz
    Poziom 10  
    Nie używam atmel studio więc nie mogę zrobić symulacji, mógłbyś mi to jakoś dondu wytłumaczyć?
  • Pomocny post
    #6 13164303
    dondu
    Moderator na urlopie...
    Dlatego, że nie używasz AS masz problem z ustaleniem przyczyny. Wystarczy uruchomić symulator, by zobaczyć, że Twój program wpada w zabezpieczenie dodawane przez kompilator polegające na wyłączeniu przerwań globalnych i zapętleniu się w specjalnie dodanej pętli.

    Symulator na początku zabawy z mikrokontrolerami, to podstawowe i bezpłatne narzędzie - korzystaj z niego.

    Konsekwencją jest brak przerwań, a to skutkuje brakiem zmian stanu pinu, który w funkcji przerwania realizujesz.

    Podglądnijmy więc Twój plik .lss.
    Szukaj znaków <------- dodałem komentarze.

    Kod: text
    Zaloguj się, aby zobaczyć kod


    Dodaj więc na końcu funkcji main() pętlę główną:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 13166469
    albert.pracz
    Poziom 10  
    Tak więc zrobiłem jak mówisz, nawet pobrałem sobie AS. Dodałem pętlę o której mówiłeś, nic nadal się nie dzieje.
    Tutaj nowy kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #8 13166575
    olelek
    Poziom 24  
    Nie wiem czy mój poprzedni post był widoczny, więc się powtórzę:
    Nie rozumię kiedy ma się wydarzyć przepełnienie licznika, skoro jest zerowany w momencie dojścia do wartości OCR1A, i wtedy ew. następuje przerwanie "TIMER1 COMPA Timer/Counter1 Compare Match A".

    Chyba że źle rozumiem działanie trybu CTC, ale znalazłem taki wykres:
    ATmega8 - Timer w trybie CTC i wykorzystanie przerwań.
  • Pomocny post
    #9 13166665
    Konto nie istnieje
    Poziom 1  
  • #10 13167544
    albert.pracz
    Poziom 10  
    Problem rozwiązany, zmieniłem tylko przerwanie które muszę włączyć, na compare i wektor do niego. Dzięki za pomoc :) Wstawiam tu kod, jeśli ktoś miałby taki problem jak ja, to może dojdzie co zrobić po kolei aby zadziałało ;) Czas jaki led ma migać ustawiłem programowo na wypełnienie 10% co daje jedno mignięcie 200ms i 1800ms przerwy.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA