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

[ATmega32][ASM] dioda led przerwanie od timera0

22 Paź 2011 11:04 2498 8
REKLAMA
  • #1 10052851
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #2 10053113
    zumek
    Poziom 39  
    Kod: text
    Zaloguj się, aby zobaczyć kod

    A po co Ci te 2 instrukcje :?:

    Poza tym, wszędzie gdzie się da, używaj nazw symbolicznych.
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 10055028
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #4 10056200
    Andrzej__S
    Poziom 28  
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #5 10056850
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #6 10057258
    Andrzej__S
    Poziom 28  
    Cytat:

    Ale jeśli mniejsze, to już po 1 takcie zliczania powinno wyskoczyć z przerwania a tak nie jest.

    Taktowanie timera to 16MHz/1024 = 15625Hz.
    Pojemność timera to 256, więc przerwanie pojawia się z częstotliwością 15625/256 = ~61Hz.
    Aby uzyskać opóźnienie ok. 1 sekundy przerwanie musi pojawić się 61 razy i dopiero za 62 zapalić lub zgasić diodę. I tak się właśnie dzieje. Zmienna (rejestr) 'counter' zwiększa się o 1 po każdym wejściu w przerwanie. Instrukcja brlo powoduje przeskakiwanie do etykiety 'koniec_przerwania' (omijanie instrukcji cbi PORTB, 0) do momentu, kiedy zawartość rejestru 'counter' osiągnie 62 (procedura obsługi przerwania została uruchomiona 62-gi raz), i dopiero wtedy instrukcja cbi PORTB, 0 zostaje wykonana (zapali lub zgasi diodę, w zależności od tego, jak masz ją podłączoną).

    Miganie mogłoby wyglądać mniej więcej tak (przeróbka Twojego kodu - jedno z wielu możliwych rozwiązań):
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • #7 10057656
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • Pomocny post
    #8 10058812
    Andrzej__S
    Poziom 28  
    Jak już napisałem, można kombinować różnie. W tym przypadku po prostu po 62 przerwaniach zapalasz diodę, a po 124 gasisz (lub odwrotnie). W tym przypadku czas zapalenia (62 przerwania) i czas zgaszenia (124 - 62 = 62 przerwania) są równe, ale nie muszą być. Poza tym w takim rozwiązaniu znasz stan sterowanego pinu, kiedy jest w stanie niskim (pierwsze 62 przerwania), a kiedy ma stan wysoki (następne 62 przerwania).

    Jak wyzerujesz licznik (zmienną 'counter') po 62 przerwaniach, to później będziesz musiał wiedzieć (po następnych 62 przerwaniach), w jakim stanie jest sterowany pin portu, czyli będziesz musiał odczytać jego stan, zmienić na przeciwny i zapisać z powrotem. Wybór rozwiązania zależy od Ciebie.
  • #9 10070726
    Konto nie istnieje
    Poziom 1  
REKLAMA