Frage1: Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den
Interrupt auszulösen?
Wenn ich jetzt mehrere Dinge mit einem Timer steuern möchte, schreibe
ich meine ISR in etwa so:
1
ISR(TIMER2_COMP_vect){
2
3
staticunsignedintcountTWI=0;
4
staticunsignedintcountLED=0;
5
6
7
countTWI++;
8
countLED++;
9
10
if(countTWI>=10000){
11
TWIreceiveflag=TRUE;// set flag for TWI data request
12
countTWI=0;
13
}
14
15
if(countLED>=5000){
16
PORTC^=(1<<PC5);// toggle LED (1Hz blinking)
17
countLED=0;
18
}
19
}
Evtl. werden noch mehr Flags gesetzt. Die Aufgaben werden dann in der
Mainschleife ausgeführt. Dachte bisher eigentlich immer das wäre ein
ordentlicher Ansatz, aber irgendwie scheint mein Timing ungenau zu sein.
Gibt es vielleicht Verbesserungsvorschläge?
Abweichungen der Quarzfrequenz sollte man doch eigentlich nicht bemerken
können?
Woran könnte es sonst noch liegen?
Beste Grüße
Rumkugel schrieb:
> Frage1: Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den> Interrupt auszulösen?
99
> aber irgendwie scheint mein Timing ungenau zu sein.
In welcher Größenordnung denn?
Ich kenne das von anderen µC-typen so, dass die ein Register haben, was
die voll zählen und wenn dieses voll ist, wird der interrup ausgelöst.
ein Reg hat 255bits... dem nach braucht der µC max. 32µs um ein
Interrup auszulösen (zählt von 0-255 bei 8Mio Zählschritten pro
Sekunde)...
Wie gesagt... anderer µC-typ... (von Siemens... sau teure Teile)
Warum dein Timing ungenau ist... hat du ein Quarz am µC gebaut?
Ohne Quarz wird die Interne Frequenz benutz... und diese ist nicht genau
8MHz.
Hi
>Muss ich OCR2 auf 99 oder 100 setzen, um wirklich alle 100us den
99.
>Dachte bisher eigentlich immer das wäre ein>ordentlicher Ansatz, aber irgendwie scheint mein Timing ungenau zu sein.
Woran merkst du das?
>Abweichungen der Quarzfrequenz sollte man doch eigentlich nicht bemerken
Wirklich Quartz? Oder Interner Oszillator.
MfG Spess
ich hab zweimal denselben Aufbau nebeneinander. Beide mit ATmega8 und
beide mit 8MHz Quarz. Die Quarze laufen, die LEDs blinken auch mit ca.
1Hz.
Wenn man allerdings eine Weile hinguckt, bemerkt man wie sich das
Blinken verschiebt.
Einer groben Überprüfung mit der Stoppuhr konnte eine LED auch nicht
standhalten. Das scheint mir doch sehr ungenau.
@ Rumkugel (Gast)
>ich hab zweimal denselben Aufbau nebeneinander. Beide mit ATmega8 und>beide mit 8MHz Quarz. Die Quarze laufen, die LEDs blinken auch mit ca.>1Hz.
Das kann auch der interne 8MHz RC-Oszillator sein. AVR-Fuses prüfen!
>Wenn man allerdings eine Weile hinguckt, bemerkt man wie sich das>Blinken verschiebt.
RC-Oszillator.
>Einer groben Überprüfung mit der Stoppuhr konnte eine LED auch nicht>standhalten. Das scheint mir doch sehr ungenau.
Dito.
MFG
Falk
Soweit ich weiß steht der RC-Oszillator beim ATmega8 standardmäßig auf
1MHz. Mit 1MHz laufen die beiden aber ganz offensichtlich sicher nicht.
Hab die Fuses trotzdem nochmal überprüft, stehen beide auf Ext. Crystal.
Einer der Aufbauten ist auf einem Breadboard, wenn ich den Quarz dort
rausziehe bleibt der MC stehen.
Eigentlich hatte ich auf einen Denkfehler im Programm getippt..
Ich hab zwei Aufbauten:
Einer auf einem Development Board, der andere auf einem Breadboard.
Das Timing auf dem Development Board scheint zu stimmen.
Das Breadboard läuft definitiv mit 8MHz Quarz - rausziehen stoppt den
MC.
OCR2 ist bei beiden auf 99.
Was gibts denn noch so für Gründe?
MfG
Rumkugel schrieb:
> Ich hab zwei Aufbauten:> Einer auf einem Development Board, der andere auf einem Breadboard.> Das Timing auf dem Development Board scheint zu stimmen.>> Das Breadboard läuft definitiv mit 8MHz Quarz - rausziehen stoppt den> MC.> OCR2 ist bei beiden auf 99.>> Was gibts denn noch so für Gründe?>> MfG
Zunhächst mal sollten wir abklären, was für dich grob ungenau bedeutet.
Wenn du ein 1Sek Blinken hast, wieviele Blinker zählst du denn in 1
Minute, 1 Stunde etc.
AUch Quarze sind nciht genau. Wenn auf deinem Quarz 8Mhz draufsteht,
bedeutet das nicht, dass er mit exakt 8000000Hz läuft. Da gibt es
durchaus Abweichungen, auch wenn diese klein sind.
Daher sollten man jetzt erst mal klären, ob deine gemessenen
Abweichungen in der Größenordnung von typischen Quarzabweichungen liegen
oder nicht, nachdem sich sonst nichts findet, was die Abweichung
erklären könnte.
@ Rumkugel (Gast)
>während der MC auf dem Breakboard pro Minute gut 2 Sekunden zu langsam>ist.
Das sind ~3%, so falsch kann ein Quarz nicht sein. Klingt nach
Softwarefehler oder doch RC-Oszillator.
MFG
Falk
wie gesagt, wenn ich den Quarz rausziehe, bleibt der MC stehen.
Nur mal so zum Verständnis nebenbei:
Warum muss OCR2 auf 99?
Mal angenommen, ich wollte jede us einen Interrupt, müsste demnach doch
OCR2 auf 0, oder nicht? Das ergibt irgendwie keinen Sinn für mich.
Gruß
@ Rumkugel (Gast)
>Warum muss OCR2 auf 99?
Weil der Timer im CTC Modus von 0..99 zählt, macht 100 Takte. Poste mal
den VOLLSTÄNDIGES Programm als Anhang.
MFG
Falk
@ Falk
von 0 auf 99 klingt logisch, aber ich frag mich halt wie ich damit auf
1us käme. 0 auf 0 wird wohl nicht funktionieren, oder?
Ok, ich hab mal meinen Code eingefügt. Das meiste wird für das Problem
irrelevant sein. Ich habe 2 Dateien weggelassen in denen nur Code fürs
TWI steht.
Die Zeitverschiebung habe ich anhand einer 7-Segment Anzeige bestimmt,
weil es damit doch etwas leichter war als die Diode zu zählen.
MfG
Rumkugel schrieb:
> von 0 auf 99 klingt logisch, aber ich frag mich halt wie ich damit auf> 1us käme. 0 auf 0 wird wohl nicht funktionieren, oder?
Doch, theoretisch schon. Praktisch scheitert es am Prescaler, denn 8
Takte wären selbst für einen leeren Interrupt zu wenig. Aber mit einem
Prescaler von 64 und einem OCR-Wert von 0 hättest du einen Interrupt
alle 64 Takte.
Besten Dank für den Hinweis, Stefan, damit bin ich der Wahrheit schonmal
ein kleines Stück näher gekommen..
Bleibt nur noch die Frage, wie mein Quarz oder was auch immer so weit
daneben liegen kann.