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
Poste doch mal das komplette Programm... mir persönlich ist es zu mühsam, einzelne Codeschnipsel auszuwerten...
> TCNT1L = 0x00; > TCNT1H = 0x00; Falsche Reihenfolge. Beim Schreibzugriff immer erst das High-Byte und dann das Low-Byte. Am besten gleich
1 | TCNT1 = 0; |
schreiben.
Moin, die TCNT1-Sache ist geändert. Danke. Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-) UdoZ
Moin, die 2 vermeintlich unterschiedlichen Speicherstellen im EEPROM sind identisch. UdoZ
> Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram > wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-) Unvollständiger Kram hält auch vom lesen ab ;) - Da fehlen immer noch Programmteile... - Variablen werden mit Konstanten gefüttert, deren #define in dem geposteten Code nicht zu sehen sind... - usw... usw...
Moin, Magnus Müller wrote: >> Der zusammengefasste Code ist angehängt. Definitiv nicht benötigter Kram >> wurde beseitigt; ca. 6 kB unnötiger Kram hält auch vom Lesen ab ;-) > > > Unvollständiger Kram hält auch vom lesen ab ;) > - Da fehlen immer noch Programmteile... Bezüglich des Problems ist der Code komplett. Alle anderen Teile sind irrelevant, produzieren keine Stack- oder Timing-/Timerprobleme etc.. Der 'Minimalcode' wurde auch schon mit gleichem, wahrscheinlich banalen Fehler bzw. Ergebnis 'live' getestet. > - Variablen werden mit Konstanten gefüttert, deren #define in dem > geposteten Code nicht zu sehen sind... Die Konstanten stehen in <avr/io.h>, sind im Anhang kommentiert oder in dem Fall, in dem nichts kommentiert wurde, selbsterklärend (HG_OK, HG_N_OK). Aber, wenn es hilft: #define HG_OK 1 #define HG_N_OK 0 ;-) > - usw... usw... Trotzdem danke für Deine Bemühungen. UdoZ
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.