Hallo, ich arbeite gerade an einer Schaltung auf einem attiny 45 unter avr-gcc die mit mehreren Interrupts arbeitet. Zum Einen habe ich den Software-Uart eingebaut und nutze dazu den Timer 1. Das Compareregister A (OCR1A) löst dabei ja zyklisch einen Interrupt aus, den man zum senden nutzen kann. Das klappt soweit super. Aber jetzt kommt's: Ein anderer Teil der Schaltung empfängt über den Pin PB2 (INT0) Daten aus einem zweiten Bus. Für Timeoutzwecke nutze ich hier den Timer 0. Wenn das Programm jetzt gerade den Interrupt (INT0) vom Pin PB2 verarbeitet und ich hier das compare match flag mit TIFR |= ( 1 << OCF0A ); lösche, scheint auch das Flag vom Timer 1 gelöscht zu werden, wenn der Match genau in dieser Zeit stattfindet! Der Aufruf der Interruptroutine wird jedenfalls nicht nachgeholt. Lasse ich das TIFR |= ( 1 << OCF0A ); weg - klappt alles wir gewollt und der Timer1 Interrupt wird abgearbeitet. Hat jemand schon mal ein ähnliches Problem gehabt? Ich konnte bei der Suche nichts finden. Hier noch ein paar Code-Schnipsel zur Verdeutlichung: ------------------------------------------------------------- #include <avr/io.h> #include <avr/interrupt.h> #ifndef SIGNAL #include <avr/signal.h> #endif // SIGNAL void uart_init() { ... SUART_TXD_PORT |= (1 << PB3); // Testausgabe auf PB3 SUART_TXD_DDR |= (1 << PB3); // Testausgabe auf PB3 // Clear Counter wenn TCNT1 == OCR1C TCCR1 = ( ( 1 << CS12 ) | ( 1 << CS11 ) ) | ( 1 << CTC1 ); OCR1C = 104; TIFR |= (1 << OCF1A); // Reset Timer1 Overflow Flag ... } ISR(TIM1_COMPA_vect) { ... SUART_TXD_PORT ^= (1 << PB3); // Testausgabe auf PB3 ... } ISR(INT0_vect) { ... for( tmp=0; tmp<100; tmp++ ) // Verzügerung für den Test { if(len > 88) stat=44; } TIFR |= ( 1 << OCF0A ); // clear compare match flag. ... } ---------------------------------------------------------- Für Anregungen wäre ich sehr dankbar.
In TIFR steht drinnen (1 << OCF1A) | (1 << OCIE0). Dann heist TIFR |= ( 1 << OCF0A ) also TIFR = TIFR or ((1 << OCF0A) or (1 << OCF1A) or (1 << OCIE0)) Nimm einfach TIFR = (1 << OCF0A); und lasse das ODER weg. Beim Löschen von Bits in TIFR haben nur gesetzte Bits im Wert eine Wirkung, 0 Bits verändern an den TIFR Flags nichts. Gruß Hagen
Klasse, vielen Dank für die schnelle Hilfe. An das Oder habe ich gar nicht mehr gedacht. Hat sich irgendwie eingeschlichen und ich habe das gar nicht mehr in Betracht gezogen. Besten Dank FMaili
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.