Hi, ich habe ein Problem mit meinem Mega32: Ich benutze Timer0 um mir eine genaue Zeit zu erzeugen während der ein Pin auf 1 sein soll. Habe einen 14.7456 MHz Quarz. Timer0 hat einen Prescaler von 64. Da der Timer alle 256 Schritte überläuft, und ich in der ISR eine Variable bis 90 hochzähle entspricht das genau 100ms. Während dieser 100ms sollen nun die Impulse einer Frequenz gezählt werden. Hierzu habe ich einen externen Zählerbaustein den ich nach diesen 100ms auslese. Über ein UND-Gatter wird dafür gesorgt, dass keine Impulse mehr in den Zähler laufen wenn der Pin nicht auf 1 ist. Das Problem ist folgendes: mit diesem Code (BASCOM): Torzeit = 1 Waitms 100 Torzeit = 0 funktioniert das Ganze sehr gut (Zähler verzählt sich + - 1 ist aber normal) Benutze ich Timer0 um mir die 100ms zu erzeugen verzählt sich mein Zähler teilweise um bis zu 50 Stellen. Benutze dabei folgenden Code: ... Torzeit = 1 Start Timer0 Do If Tor_over = 1 Then Exit Do Loop ... und die Timer0 ISR: Timer0_isr: Incr Tor_zaehler If Tor_zaehler = 90 Then Torzeit = 0 Tor_zaehler = 0 Tor_over = 1 Stop Timer0 End If Return Eigentlich müsste die Zeitberechnung über den Timer des Mega32 doch wesentlich genauer funktionieren als der Waitms-Befehl oder? Weiß irgendjemand woran das liegen könnte?
Nachtrag: Habe jetzt anstatt den Timer0 den Timer2 verwendet und jetzt funktioniert es. Hat wohl irgendein-Problem mit UART oder so...
Erneuter Nachtrag: nachdem für ungefähr eine Stunde der Strom wegwar funktioniert es egal mit welchem Timer nicht. Weiß irgendwer Rat?
Hi Wie hoch ist denn deine zu messende Frequenz? Ich würde darauf tippen, das der Fehler durch die Laufzeit der Befehle zwischen 'Torzeit=1' und 'Torzeit=0' + Zeit für ISR-Ansprung resultiert. Wer weiss, was BASCOM für Code daraus produziert. MfG Spess
>Eigentlich müsste die Zeitberechnung über den Timer des Mega32 doch >wesentlich genauer funktionieren als der Waitms-Befehl oder? Warum? Beide ermitteln im Endeffekt die Zeit durch Abzählen einer vorher festgelegten Anzahl Taktzyklen. Zum Rest kann ich nichts sagen - ich spreche kein Bascom. Oliver
es ist egal ob meine frequenz 10kHz oder 10MHz beträgt. Es ist mit ISR immer ein Fehler teilweise bis +-50 und mit waitms nur ein fehler +-1 zum thema genauigkeit: der waitms befehl wird durch andere interrupts unterbrochen und wird so ungenauer.
Hi Weisst du, was 'Start Timer0' wirklich macht? Für ein genaues Timing ist es notwendig den Timer und den Vorteiler auf 0 zu setzen und den Timer zu Starten. Wenn das nicht so gemacht wird kann im Extremfall ein Fehler von fast 2 Timer-Overflows entstehen. Abgesehen davon, halte ich BASCOM wegen seiner rudimentären Nutzung der Hardwareressourcen und dem nicht kalkulierbaren Laufzeitverhalten ungeeignet für zeitkritische Anwendungen. MfG Spess
Hi Korrektur: 'von fast 2 Timer-Overflows' -> 'von fast 1 Timer-Overflow' War ein Denkfehler. MfG Spess
danke spess53, wenn ich nicht start timer0 und config timer0 verwende sondern die register direkt beschreibe geht es jetzt. wie sieht es denn mit dem laufzeitverhalten in c aus (also beispielsweise avr-studio) ist es da besser?
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.