Gast
#320780
Hallo, habe folgendes Problem: Möchte mit einem AVR Mega32 (16Mhz Quarz) die Frequenz 2er Rechtecksignale (3 bis 500 Hz, Puls/Pause = 1:1) ermitteln. Verwende folgenden Lösungsansatz: die 2 Signale gehen je auf einen externen Int. 0/1 (die ext. Int. reagieren auf jeden Flankenwechsel), mit dem Timer 0 und 2 messe ich die Puls bzw. Pausendauer (Prescaler 250kHz = 4 us/Zähltakt) Beim 1. Flankenwechsel der z.B am Int 0 erkannt wird, wird Timer1 zurück gesetzt. Da es nur ein 8Bit Timer ist muß ich in der Timer OverFlow Int. eine Variable für die Überläufe hochzählen. Wird nun der 2. Flankenwechsel erkannt, lese ich den Überlaufzähler, sowie das Timerregister aus und ermittle dadurch die Frequenz. -> Anschließend wird wieder für eine Puls bzw Pausendauer gewartet und dann erfolgt eine neue Messung. Das ganze funktioniert im Prinzip schon, allerdings erhalte ich bei bestimmten Signalfrequenzen einen "Messfehler". Das ganze liegt vermutlich daran: Wenn während ich in der Int.Routine des Ext.Int. bin ein erneuter TimerOverflow auftritt so erfolgt die Inkrementierung der Überlaufvariable erst wenn die Ext.Int Routine abgearbeitet ist -> somit ist die ermittelte Zeitdauer um den Wert 256 zu klein. Deshalb dacht ich mir ich halte zu Beginn der ext.Int Routine den Timer an, lese das Overflow Flag des Timers aus und wenn dies auf "1" ist nehm ich die Inkrementierung der Überlaufvariable in der ext.int Routine vor und lösche das Bit für den TimerOverflow Interrupt. Doch das ganze funktioniert leider noch immer nicht... Kann mir jemand sagen was ich da falsch mach ?? Oder wie ich es besser lösen kann ?? (Bei einer Eingangsfrequenz von 248 Hz, beträgt die ermittelte Frequenz mal 248Hz und mal 164Hz. Erhöhe oder veringere ich die Eingangsfrequenz um 1, dann ist die ermittelte Frequenz immer korrekt). Vielen Dank Gruß, Rolf