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

[Rozwiązano] Przerwania atmega2560 jak włączyć przerwania TIMER1/3/4/5_COMPB/C_vect

atnerun 16 Gru 2022 18:09 363 4
REKLAMA
  • #1 20338199
    atnerun
    Poziom 9  
    16 bitowe timery w tym modelu mają trzy rejestry OCRxA/B/C i są dostępne trzy przerwania w trybie CTC nazywające się ISR(TIMER4_COMPA/B/C_vect){

    Ale z noty katalogowej wynika że tryb CTC porównuje liczbę zliczeń z wartością zapisaną w OCRxA i tego nie da się zmienić więc jak wykorzystać pozostałe dwie funkcje wywołujące przerwanie (TIMER4_COMPB_vect i TIMER4_COMPC_vect)?

    Czy rejestry OCRxB i OCRxC istnieją tylko żeby generować sygnał PWM na dodatkowych pinach? W takim razie po co są te nazwy przerwań TIMER4_COMPB/C_vect ?

    To jest działający kod dla rejestru A, jak coś takiego napisać dla np. ISR(TIMER4_COMPB_vect){? Sama zamiana liter A na B w odpowiednich rejestrach nie działa
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 20338284
    tmf
    VIP Zasłużony dla elektroda
    W trybie CTC porównywane jest cnt z ICR lub OCR i w wyniku porównania generowane jest przerwanie over/underflow oraz zerowany jest cnt. I tylko o oto chodzi. Zawartości pozostałych rejestrów OCR są porównywane ale nie ma ją wpływu na wartość cnt. Jednak możesz odblokować pochodzące od nich przerwania.
    Najłatwiej jest sobie poćwiczyć i przesymulować to w symulatorze wbudowanym np. w Microchip studio.
  • REKLAMA
  • Pomocny post
    #3 20338305
    Michal_Swiderski
    Poziom 4  
    Najprostszy przykład jaki mi przychodzi do głowy to wykorzystanie tych dwóch dodatkowych funkcji do wygenerowania przerwania które nastąpią po przerwaniu A po czasie zadeklarowanym w rejestrach OCRxB/C
    W twoim kodzie będzie to coś takiego
    void setup(){
    DDRB |= (1<<PB7); // ustawienie pinu 13 jako wyjscie
    PORTB &= ~(1<<PB7);// ustawienie stanu niskiego
    DDRH |= (1<<PH4); // ustawienie pinu 7 jako wyjscie
    PORTH &= ~(1<<PH4);// ustawienie stanu niskiego
    DDRH |= (1<<PH3); // ustawienie pinu 6 jako wyjscie
    PORTH &= ~(1<<PH3);// ustawienie stanu niskiego
    
    cli();//stop interrupts
    //set timer4 interrupt at 1Hz
     TCCR4A = 0;// set entire TCCR1A register to 0
     TCCR4B = 0;// same for TCCR1B
     TCNT4  = 0;//initialize counter value to 0
     // set compare match register for 1hz increments
     int n = 15624;
     OCR4A = 15624;//15624/10;// = (16*10^6)fIC / (1*1024)(prescaler TCCRnB |= CSn2/1/0) = 15625-1 minus 1 bo porownuje od 0  == 1s (must be <65536)(max 16b val)
     OCR4B = 15624/10; //czas o jaki będzie przesuniete wykowywanie polecenia ISR(TIMER4_COMPB_vect){ wzgledem ISR(TIMER4_COMPA_vect){
     OCR4C = 15624/5;
     TCCR4B |= (1 << WGM42);// turn on CTC mode
     TCCR4B |= (1 << CS42) | (1 << CS40);// Set CS12 and CS10 bits for 1024 prescaler
     TIMSK4 |= (1 << OCIE4A);// enable timer compare interrupt
     TIMSK4 |= (1 << OCIE4B);// enable timer compare interrupt
     TIMSK4 |= (1 << OCIE4C);// enable timer compare interrupt
    sei();//allow interrupts
    }//end setup
    
    ISR(TIMER4_COMPA_vect){
     PORTB ^=(1<<PB7);// pin 13 mega2560
     PORTB ^=(1<<PB7);// pin 13 mega2560
    }
    ISR(TIMER4_COMPB_vect){ //wykona się po ISR(TIMER4_COMPA_vect){ o czas zadeklarowany w OCR4B
     PORTH ^=(1<<PH4);// pin 7 mega2560
     PORTH ^=(1<<PH4);// pin 7 mega2560
    }
    ISR(TIMER4_COMPC_vect){//wykona się po ISR(TIMER4_COMPA_vect){ o czas zadeklarowany w OCR4C
     PORTH ^=(1<<PH3);// pin 6 mega2560
     PORTH ^=(1<<PH3);// pin 6 mega2560
    }
    void loop(){
    }


    i otrzymasz taki wynik na wyjściach
    Przerwania atmega2560 jak włączyć przerwania TIMER1/3/4/5_COMPB/C_vect
  • REKLAMA
  • #4 20339677
    atnerun
    Poziom 9  
    Faktycznie @michalswiderski, teraz jednym timerem mogę uruchomić trzy różne przerwania
  • #5 20339684
    Michal_Swiderski
    Poziom 4  
    @atnerun tylko korzystając z tego wszystkie trzy przerwania będą wykonywane w takim samym odstępie czasu jedynie przesunięte względem siebie będą.
REKLAMA