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.

[AVR GCC] Obsługa przerwania timer0

adampyndzel 01 Lip 2012 21:22 1946 10
  • #1 01 Lip 2012 21:22
    adampyndzel
    Poziom 16  

    Witam.

    Założenia były proste, dioda podłączona do portu PC7 miała migać. wszystko miało być obsługiwane przez timer0 ale coś nie działa.

    Kod: cpp
    Zaloguj się, aby zobaczyć kod


    nie miejcie mi nic za złe ale dopiero się uczę w C a w bascomie takie coś to działało :)

    Pozdrawiam.

    0 10
  • #2 01 Lip 2012 21:46
    Fredy
    Poziom 27  

    zmienną licznik zrób jako volatile.

    0
  • #3 01 Lip 2012 22:05
    adampyndzel
    Poziom 16  

    niestety nic nie pomogło dioda świeci cały czas i nie chce mrugnąć. Ma ktoś jakiś inny pomysł??

    0
  • #4 01 Lip 2012 22:15
    mirekk36
    Poziom 42  

    Ale tutaj volatile nie jest potrzebne ponieważ zmienna licznik jest wykorzystywana tylko w przerwaniu a nie w przerwaniu i programie głównym, dlatego to nic ci nie zmieniło.

    Za to mogę ci powiedzieć ze 100% pewnością że program napisałeś poprawnie i na 100% działa - a ty co najwyżej źle podłączyłeś diodę LED ;) ... sprawdź i będzie po kłopocie ;)

    Tzn jedyny błąd jaki robisz to ta definicja w kodzie:

    #define F_CPU 16000000L

    ale pewnie męczysz się w tym najnowszym kocim AVR Studio 5 albo 6 więc się nie dziwię, że ten typowy błąd popełniasz albo powielasz. Z tym że on nie wpływa akurat tutaj na to że ci coś nie działa tzn dioda nie miga. Z kłopotami definiowania tego w kodzie spotkasz się boleśnie później, chyba że zaczniesz korzystać z porządnego Eclipse ;) Link

    0
  • #5 01 Lip 2012 22:42
    adampyndzel
    Poziom 16  

    No właśnie korzystam z eclipse, a dioda podłączona dobrze i już nawet zmieniałem port. A przykład to takie kawałki pozbierane z książki którą chyba dobrze znasz, a dokładnie to kawałki kodu pozbierane z wyświetlacza 7 segm.

    0
  • #6 01 Lip 2012 22:55
    excray
    Poziom 39  

    W czasie kompilacji tworzy się plik *.lss Wklej tutaj jego zawartość.

    0
  • #7 01 Lip 2012 22:56
    Fredy
    Poziom 27  

    Rzeczywiście nie zauważyłem że zmienna " Licznik " jest tylko w przerwaniu.
    Nie wiem jakiego procka używasz ale czy czasem nie blokuje ci tego wyjścia Jtag? Wyłącz go w fusach.

    0
  • #8 01 Lip 2012 23:01
    tplewa
    Poziom 37  

    Fredy napisał:
    Rzeczywiście nie zauważyłem że zmienna " Licznik " jest tylko w przerwaniu.
    Zatem stawiam na to że masz włączony Jtag - wyłącz go w fusach.


    Lepiej tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #9 01 Lip 2012 23:03
    adampyndzel
    Poziom 16  

    rozwiązałem problem.

    polegał na tym że w ustawieniach properties>target hardware miałem ustawione na atmega16 i zegar na 16000000Hz, po zmianie na atmega32 i 1000000Hz program działa poprawnie. Nasuwa mi się pytanie po co w pierwszej linijce kodu #define F_CPU 16000000L skoro niema to wpływu na jakąkolwiek pracę??

    0
  • #10 01 Lip 2012 23:07
    mirekk36
    Poziom 42  

    No ale teraz powiedz skąd ty wziąłeś ten pomysł na tą linijkę kodu ??? ;) skoro:

    a. piszesz w Eclipse
    b. masz na myśli książkę, którą ja dobrze znam ;)

    a dodatkowo ja wszędzie gdzie mogę - to podpowiadam, żeby w kodzie nie stosować tego #define F_CPU

    Bo zastosować w kodzie możesz - czemu nie ? i będzie to miało wpływ - tylko że zgubny dla ciebie.

    0
  • #11 01 Lip 2012 23:24
    adampyndzel
    Poziom 16  

    Właściwie nie wiem skąd, no zapewne gdzieś w internecie się z tym spotkałem. Kolejny przykład że w necie to sobie każdy może pisać co chce. Dziękuje wszystkim za udzieloną pomoc, a temat uważam za zamknięty.

    0