Atmega168 / Atmega8 Timer Interrupt

Gast #1134193
Lesenswert?

hallo
ich habe folgendes problem mit einem atmega8.

diese isr läuft auf einem atmega8 nicht.
*********************************************
ISR (TIMER1_COMPA_vect)
{
    LCD_update();
}

void Timer_io_init (void)
{
    TCCR1A |= (1 << WGM11) | (0 << WGM10) ;
    TCCR1B |= (1 << CS10) | (1 << CS11) | (1 << CS12);
    //CLOCKSOURCE;
    // Start timer 1.
#if defined(TIMER1_SETUP_HOOK)
    TIMER1_SETUP_HOOK();
#endif
    // Clear TIMER1 on compare match, CK/1024
    OCR1A = 7;
    MCUCR = (1 << SE);   // TCNT1 Compare Match IRQ app. 60 Hz using 
1MHz
    TIMSK = (1 << OCIE1A);
    sei ();
}

diese routine läuft auf einem atmega168 ohne probleme.
******************************************************
ISR (TIMER0_COMPA_vect)
{
    LCD_update();
}

void Timer_io_init (void)
{
    TCCR0A = (1 << WGM01);
    /*CLOCKSOURCE;*/
    TCCR0B =(1 << CS00) | (1 << CS02);

     /*
     * Start timer 1.
     */
#if defined(TIMER0_SETUP_HOOK)
    TIMER0_SETUP_HOOK();
#endif MCUCR = (1 << SE);   // TCNT1 Compare Match IRQ app. 60 Hz using 
1MHz

    OCR0A = 7;
    MCUCR = (1 << SE);   // TCNT1 Compare Match IRQ app. 60 Hz using 
1MHz clock
    TIMSK0 = (1 << OCIE0A);
    sei ();
}

kann mir einer verraten wieso die routine auf dem einen atmega168 läuft 
und auf dem atmega8 nicht.

habe timer1/2 ausprobiert, aber es will kein timer laufen.
die fuses sind wie werkseinstellung.fhb:0xd9 flb:0xe1

für eure hilfe schon mal im voraus vielen dank
Gast #1134235
Lesenswert?

>#endif MCUCR = (1 << SE);   // TCNT1 Compare Match IRQ app. 60 Hz using

Immer wieder die gleichen Fehler.
Copy und paste von irgendeinem Code der
so nicht funktioniert.

Ps: Lern erst mal deine Muttersprache.
Gast #1135237
Lesenswert?

lieber holger
bevor du andere berichtigst solltet du erstmal genau lesen.
der fehler ist im oberen teil des source code und nicht im unteren.
die stelle auf die du anspielst ist mir beim copieren in diesen
beitrag entstanden.
wie gesagt die untere routine läuft.

ps. erst genau lesen, dann schreiben.
Gast #1135431
Lesenswert?

hallo Stefan

zu diesem abschnitt:

>    TCCR1B |= (1 << CS10) | (1 << CS11) | (1 << CS12);
>...
>    // Clear TIMER1 on compare match, CK/1024
                                       ^^^^^^^

Passt nicht. Siehe Table 40 im Atmega8 Datenblatt

ich habe schon alle kombinationen von CS10-CS12 ausprobiert.
das problem ist, das die isr überhaupt nicht angesprungen wird.
wie schon oben geschrieben, auf einem atmega168 läuft die routine 
entsprechend abgeändert.
ich vermute das ich ein register-bit beim wechsel vom atmega168 zum 
atmega8 übersehen habe.
die beschreibungen (erklärungen) im source code sind nicht aktuell.
deshalb beachtet sie einfach nicht, ich hätte sie besser gelöscht.
mich interessiert nur wie bei einem atmega8 der timer mit einem
compare interrupt läuft. ich benötige auch keinen externen pin (OC1A).
nur die isr routine soll bei einem compare angesprungen werden.
ich habe auch schon die routine auf einen overflow interrupt gesetzt, 
geht aber auch nicht.
im moment habe ich so den eindruck als das bei einem atmega8 gar kein 
timer
funktioniert.ich habe schon einen atmega16, atmega168 mit timer 
programmiert und liefen ohne probleme.
aber mit dem atmega8 fällt mir nichts mehr ein.
Gast #1139092
Lesenswert?

erstmal danke für eure hilfe.
habe das problem gefunden.
beim compilieren wurde eine datei nicht neu mit compiliert.
in der war die funktion, die in der isr aufgerufen wurde.
ich hatte beim suchen des fehlers in der datei eine änderung 
vorgenommen,
dadurch wurde sie neu compiliert und alles lief.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren