Hallo, ich bin neu hier, habe aber vor der Anmeldung schon viel aus Euren Beiträgen gelernt. Dafür erstemal Danke. Seit einigen Wochen versuche ich mich an µC. Über die ersten Hürden, LED an/aus, bin ich drüber. Jetzt sitze ich aber seit einigen Nächten an folgendem Problem. Google und die Beiträge hier haben mir nicht weiter geholfen. Ich will mit dem Code unten das DCF77-Signal auswerten. Timer0 soll nach 150ms das Signal auf Low/High prüfen. Dauert die Senke 200ms gibt es eine 0, dauert die Senke 100ms gibts eine 1. Timer0 soll in seiner ISR den Timer2 für 900ms starten und der soll das DCF77-Signal wieder testen. Da er das 150ms+900ms=1050ms nach Auslösen des ersten Interups und 50ms nach dem zweiten Interrupt, macht stellt er jedes Low des DCF77- Signals fest. Wenn kein Low kommt ist damit die 59. Sekunde erkannt. Zum Test für den Code unten benutze ich ein laufendes Signal (200ms Low/800ms High)von einem µC. Im Sekundentakt kommt an Int0 eine fallende Flanke an. ISR (INT0_vect) schaltet LED ein und startet Timer0 mit Startwert und Prescaler. Timer0 startet in ISR(TIMER0_OVF_vect) Timer2 und stoppt Timer0. Timer2 schaltet in ISR(TIMER2_OVF_vect) LED aus und stoppt Timer2. Das geht gut. Verschiedene Startwerte zeigen berechenbares Verhalten. Wenn ich versuche die LED nicht in ISR(INT0_vect) sondern in ISR(TIMER0_OVF_vect) einzuschalten geht das nicht und ich bekomme am Oszilloskop (Hm203-7) ein undefiniertes Signal. Folgender Code läuft auf Atmega8, 1MHz, LED an PB0, Die Zeiten für das Auswerten des DCF77 stimmen nicht. Es geht hier um das Zusammenspiel der Timer 0/2 #include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000UL // 1 MHz //******************************************* ISR (INT0_vect) { PORTB = 0;// Hier funktioniert das Einschalten der LED TCNT0 = 0;// Timer0 Zählregister Startwert TCCR0 |= (1<<CS00 | 0<<CS01 | 1<<CS02);//Prescaler 1024 einstellen und starten } ISR (TIMER0_OVF_vect) { //PORTB = 0;// Hier funktioniert das Einschalten der LED NICHT TCNT2 = 0;//Timer2 Zählregister Startwert TCCR2 |= (1<<CS20 | 1<<CS21 | 1<<CS22);// Timer2 Prescaler 1024 einstellen und starten } ISR (TIMER2_OVF_vect) { PORTB = 1; //Led aus TCCR2 |= (0<<CS00 | 0<<CS01 | 0<<CS02); //Timer anhalten } int main (void) { DDRB = 1; PORTB = 1;//PB0 als Ausgang MCUCR |= ((1<<ISC01)) | ((0<<ISC00));//Fallende Flanke an Int0 GICR |=(1<<INT0);//Interrupt bei Steigender oder fallender Flanke an Int0 TIMSK |= ((1<<TOIE0) | (1<<TOIE2));//Timer1 Timer2 Overflowinterrupt erlauben sei();//Allgemein Interrupt erlauben while(1){ } }
LOL Wie goil mit'm externen IRQ immer mal wieder was initialisieren :-P
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.