Forum: Mikrocontroller und Digitale Elektronik Anfänger Problem mit Timer atmega8


von Renatus L. (rlechner)


Lesenswert?

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){  }

  }

von loller (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.