Gast
#1965056
Hallo liebes Forum, ich habe ein Problem mit dem PORT B und dem Timer0 beim AT90CAN128 auf dem STK500 und hoffe auf hilfreiche Antworten. Der Timer hat ein OC0A Ausgang und liefert an diesem ein Rechtecksignal, das gleiche Rechtecksignal möchte ich in der ISR auch erzeugen. Das Problem bei unten stehendem Code ist, dass das Bit PORTB1 relativ häufig beim verlassen der ISR nochmal toggelt, d.h. es kommen entweder kurze Impulse oder ein high bzw. low Pegel, der doppelt so lange ist. Das Problem kann man beheben, indem man in der main vor dem Port-Zugriff den globalen Interrupt deaktiviert und danach wieder aktiviert oder man im AVR-Studio die Code-Optimierung auf -Os stellt. Hat jemand eine Lösung unter der Voraussetzung, dass ich den Interrupt in der main nicht deaktivieren möchte und die Code-Optimierung auf -O0 lasse? Dass ich keine Tastenentprellung habe ist mir bewusst, ändert aber an dem Phänomen nichts. Besten Dank für Eure Hilfe <c> #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER0_COMP_vect) { PORTB ^= (1<<PB4); } int main(void) { // Port B - LED´s, STK500 PORTB = 0x00; // Output Low DDRB = 0xff; // Output // Port E - Taster, STK500 PORTE = 0xff; // Pull-up DDRE = 0x00; // Input // Timer0 TCCR0A = 0x51; TCNT0 = 0; OCR0A = 0xFF; TIMSK0 |= (1<<OCIE0A); TIFR0 |= (1<<OCF0A); sei(); // Globaler Interrupt Enable while(1) { if(PINE & (1<<PB0)) PORTB |= (1<<PB1); else PORTB &= ~(1<<PB1); } return(0); } </c>
