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

[ATmega16][C] Przerwania od timerów

marianpl 26 Sty 2010 15:12 1223 3
REKLAMA
  • #1 7594751
    marianpl
    Poziom 10  
    Witam, mam pytanie: jak przejść z jednego przerwania TIMER2 do TIMER0 po wykonaniu operacji w pętli przerwania TIMER2???

    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/sleep.h>
    #include <avr/pgmspace.h>
    #include "font.h"


    static char dd;

    unsigned char PROGMEM Fnt[]= Font;
    int n=21,k,posun,jj,d,c,pp=0,l,d,riadok;
    char Buffer[160];

    ISR (TIMER2_OVF_vect)
    {
    for (jj=1;jj<20;jj++)
    {Buffer[(jj)*8+(d+1)] =(pgm_read_byte(&Fnt[(jj)*8+(d+1)]));

    jj++;
    }

    d++;

    if (d==7)
    d=0;
    }

    ISR (TIMER0_OVF_vect)
    { unsigned char j;
    PORTB = 0;
    for (j=1;j<20;j++)
    {riadok=j-1+posun;
    if (riadok>=20) riadok=riadok-20;
    PORTD =(Buffer[(riadok)*8+(dd+1)]);
    PORTB =j;}
    PORTB=(dd<<4);
    dd++;
    if (dd==7) {dd=0;pp++;}
    if (pp==200) {pp=0;posun++;}
    if (posun==20) posun=0;
    PORTB |= 0x80;
    }





    void ioinit (void)
    { DDRB = 255;
    DDRD = 255;
    dd = 255;
    // TIMSK = 0x41;
    TIMSK = _BV(TOIE0); // włącz obsługę przerwań T/C1
    // TCNT0 = 0xFF;
    TIMSK = _BV(TOIE2); // włącz obsługę przerwań T/C1
    // TCNT2 = 0xFF;
    TCCR2=1;
    TCCR0=1;
    sei ();
    }
    int main (void)
    {
    ioinit ();
    while(1)
    {
    // lcd_goto(4);
    //lcd_writebyte(dd);
    }
    return 0;


    }
  • REKLAMA
  • #2 7594774
    rodzio
    Poziom 12  
    Tak w sumie skoro TIMER2 ma być zawsze wykonany po TIMER0 to po co w osobnych przerwaniach?
  • REKLAMA
  • #3 7594857
    marianpl
    Poziom 10  
    chodzi o zmiane predkosci wykonywania tych przerwan, zeby jedno przerwanie trwalo dluzej od drugiego
  • #4 7594889
    rodzio
    Poziom 12  
    Taka brzydką metodą mogłoby być wpisanie wartości granicznej TIMER0 w przerwaniu TIMER2, od razu po zakończeniu przerwania wskoczyło by do drugiego.
REKLAMA