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

[AVR][C] przerwanie od timera - cwiczenie

coolpablos 10 Kwi 2011 17:50 2891 12
REKLAMA
  • #1 9383910
    coolpablos
    Poziom 10  
    Witam, program ktory ma naprzemian zapalac portb i portd wykonuje obsluge timera1 tylko raz. Prosze o pomoc dla laika :) oto kod programu:
    
    uint8_t volatile counter = 0;
    uint8_t volatile flaga = 1;
    int main(void)	{
    
    sei();
    DDRB = 0xFF;
    DDRD = 0xFF;
    PORTD = 0xFF;
    PORTB = 0x00;
    
    TCCR1B |= (1<<WGM12);
    TCCR1B |= (1<<CS12) | (1<<CS10);
    OCR1B = 2000;
    TIMSK |=(1<<OCIE1B);
    
    while(1)	{
    
    if(flaga)
    {
    PORTD = ~PORTD;
    PORTB = ~PORTB;
    flaga = 0;
    }
    
    }
    }
    ISR(TIMER1_COMPB_vect)	{
    flaga = 1;
    }
    
  • REKLAMA
  • #2 9383932
    _Robak_
    Poziom 33  
    Kolego, proszę się najierw zapoznać z podstawami. Nie ma w ogóle funkcji main...
  • REKLAMA
  • #3 9383959
    tadzik85
    Poziom 38  
    No robak kolego:!:

    Zły tryb pracy licznika stosujesz przerwania compb a timer ustawiasz w tryb CTC
  • REKLAMA
  • #4 9383989
    _Robak_
    Poziom 33  
    Ok main jest, kod tak sformatowany że nic nie widać...

    tadzik85 napisał:
    No robak kolego:!:

    Zły tryb pracy licznika stosujesz przerwania compb a timer ustawiasz w tryb CTC

    Przecież to przerwanie jest dla trybu CTC.
  • #5 9384344
    tadzik85
    Poziom 38  
    Robak timer ze względu na wartości początkowe nigdy nie osiągnie wartości choćby 1 więc jakim cudem ma być zgłoszone przerwanie od porównania B? a wykonuje się raz bo flaga jest na początku ustawiana tak ze warunek jest spełniony.

    I to błąd tego programu.
  • Pomocny post
    #6 9384383
    _Robak_
    Poziom 33  
    tadzik85 napisał:
    Robak timer ze względu na wartości początkowe nigdy nie osiągnie wartości choćby 1 więc jakim cudem ma być zgłoszone przerwanie od porównania B? a wykonuje się raz bo flaga jest na początku ustawiana tak ze warunek jest spełniony.

    I to błąd tego programu.

    Wcześniej piszesz że przerwanie jest inne a tryb inny.
    Druga sprawa to skoro jest tryb CTC i włączony licznik (ustawione bibt CS) to coś zliczać będzie, prawda?
    Nie wnikam w poprawne umiejscowienie bitów bo nawet nie wiadomo co to dokładnie za procesor.
  • #7 9384408
    coolpablos
    Poziom 10  
    Procesor to Atmega16. Zauważyłem, że przy włączeniu zasilania układu przerwanie zostaje wykonane 4 razy; po resecie tylko raz.
  • Pomocny post
    #8 9384409
    tadzik85
    Poziom 38  
    tryb CTC zerowany licznik jest po porównaniu z jakim rejestrem??

    COMPA !!

    Jaką ma wartość początkową? 0

    TCNT jaka ma wartość początkową? 0

    efekt? ciągłe zero..

    kiedy licznik będzie miał wartość 2000? NIGDY

    DO kolegi coolpablos:

    W tym przypadku bezsensowne jest ustawienie licznika w tryb CTC i korzystanie wyłącznie z porównania B, tym bardziej ze nie ustalasz wartości COMPA po porównaniu z która licznik jest zerowany. Więc ustal tą wartość a najlepiej przejdź na porównanie A.
  • #9 9384434
    coolpablos
    Poziom 10  
    Cytat:
    tryb CTC zerowany licznik jest po porównaniu z jakim rejestrem??

    COMPA !!

    może i jestem laikiem, ale licznik w trybie CTC zerowany jest po zrownaniu z wartoscią zapisaną w rejestrze OCR.
    Cytat:

    TCNT jaka ma wartość początkową? 0


    TCNT używany jest do normalnej pracy licznika[/quote]
  • Pomocny post
    #10 9384474
    tadzik85
    Poziom 38  
    coolpablos napisał:
    Cytat:
    tryb CTC zerowany licznik jest po porównaniu z jakim rejestrem??

    COMPA !!

    może i jestem laikiem, ale licznik w trybie CTC zerowany jest po zrownaniu z wartoscią zapisaną w rejestrze OCR.

    OCRA będąc dokładnym nie dowolnym OCR
    coolpablos napisał:

    Cytat:

    TCNT jaka ma wartość początkową? 0


    TCNT używany jest do normalnej pracy licznika

    TCNT używane jest zawsze nie wiem skąd pomysł, że nie. Ale tryby pracy licznika wymyślono po to by czasem nie martwić się zawartością licznika np. właśnie tryb CTC.

    Dodano po 22 [minuty]:

    _Robak_ napisał:
    tadzik85 napisał:
    Robak timer ze względu na wartości początkowe nigdy nie osiągnie wartości choćby 1 więc jakim cudem ma być zgłoszone przerwanie od porównania B? a wykonuje się raz bo flaga jest na początku ustawiana tak ze warunek jest spełniony.

    I to błąd tego programu.

    Wcześniej piszesz że przerwanie jest inne a tryb inny.
    Druga sprawa to skoro jest tryb CTC i włączony licznik (ustawione bibt CS) to coś zliczać będzie, prawda?
    Nie wnikam w poprawne umiejscowienie bitów bo nawet nie wiadomo co to dokładnie za procesor.


    Prawda będzie pozorował zliczanie bo w tym szczególnym przypadku licznik zawsze będzie znajdował się w stanie resetu.
  • REKLAMA
  • Pomocny post
    #11 9384711
    _Robak_
    Poziom 33  
    Błąd jest dlatego że OCR1B musi być zawsze mniejszy jak OCR1A. U Ciebie, co tadzik85 wspomina, OCR1A jest 0. Jeśli chcesz użyć dokładnie kanału B ustaw OCR1A na wartość co najmniej równą OCR1B. Będzie działać wtedy na pewno.
  • #12 9385106
    coolpablos
    Poziom 10  
    O tym w ksiazce nie ma ani slowa. Program rzeczywiscie dziala :) Dziekuje wszystkim za pomoc :)
  • #13 9385123
    tadzik85
    Poziom 38  
    Książka dobra rzecz ale zawsze warto doczytać i uzupełnić swoją wiedzę przeglądając datasheet.
REKLAMA