Gast
#660139
Moin, ich finde den Fehler einfach nicht :-( Gegeben ist Timer1 eines AVR Mega8, der Rechteckimpulse am Eingang T1 zählen soll. Alle Variablen sind als volatile deklariert. Software: avr-gcc void timer1_Init(void) { TCCR1B = 0x00; TIMSK |= (1<<TOIE1); TCNT1L = 0x00; TCNT1H = 0x00; TCCR1A = 0x00; TCCR1B |= ( (1<<CS12) | (1<<CS11) | (1<<CS10) ); } ISR(TIMER1_OVF_vect) { if (Ueberlauf < 255) Ueberlauf ++; } Die Zeitdauer fürs Zählen wird in Timer0 gesteuert; funktioniert 100%ig: ISR(TIMER0_OVF_vect) { TCNT0 = TIMER0_WERT; // Wert für 25ms // Zeit zählen if (Zeit > 0) Zeit --; else TCCR1B = 0x00; // Timer 1 stoppen ... Im Hauptprogramm wird ausgewertet und alles wieder auf Start gesetzt: if (0 == Zeit) { if (Ueberlauf > 0) Wert = 65535; else Wert = TCNT1; ... Wert = 0; Ueberlauf = 0; Zeit = HG_ZEIT; //entspricht 1s timer1_Init(); ... Das mache ich kontinuierlich im Hauptprogramm und vergleiche Wert mit einer Variablen Soll, bei der nach Betätigung einer Taste das Gleiche in Grün abläuft. Soll enthält also die Sollfrequenz (in Takten) und Wert die Istfrequenz. Der Vergleich if (Wert <= Soll) Status = HG_OK; else Status = HG_N_OK; liefert aber als Ergebnis immer, auch bei deutlich höheren Frequenzen als in Soll HG_OK. Die Signale liegen natürlich an T1 korrekt an. Und ich weiss einfach nicht, warum. Hilfe... Danke, UdoZ