Hi, ich möchte einen 1ms Timer erzeugen. #define TReload ((0.001F * (F_CPU / 64 ))-1) Timer init() (einmalig ausgeführt) TCCR0A |= (1 << WGM01); OCR0A = TReload; TCCR0B |= (1 << CS01) | (1 << CS00); TIMSK0 |= (1 << OCIE0A); Ich zähle im Interruptvektor (ISR (TIMER0_COMPA_vect)) eine Variable (ISRvar) von 0 hoch. Diese frage ich aus dem Hauptprogramm ungebremst ab. Wenn die ISRvar größer gleich 1000 ist, sollte eine Sekunde vergangen sein, ist aber nicht, eher bei irgendwas zwischen 978 und 980... Wie kann das sein. Ich weiß ohne richtigen Code immer schwierig. Es ist schon einen Moment her, da habe ich diese Steuerbits für diesen Zähler beackert, das war so wie es ist, aber eigentlich auch nicht so wirklich richtig, ich meine Vorteiler und Quarzfrequenz passen eigentlich nicht zusammen, aber es stimmte so grob halt. Konnte den Fehler nicht finden. 2 Fragen, A) ist das Label F_CPU beim der Arduino Software überhaupt richtig nutzbar, also irgendwo gesetzt? B) soweit ich das weiß ist dort auf dem Nano3 doch ein 16Mhz Quarz verbaut (hoffe ich?) Auf Seite 148 ist die Tabelle zum Vorteiler, habe eben noch mal geschaut http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-2545-8-bit-AVR-Microcontroller-ATmega48-88-168_Datasheet.pdf 16Mhz durch 64 (Teiler bei CS00 und CS01 =1) wären 250Khz. Durch die 16Mhz als F_CPU ergibt sich ein Reloadwert von 249 für den Timer, sollte also alles passen, dennoch passt es nicht... Hat jemand einen Tip, finde da nichts... Danke Gruß DS
Dennis S. schrieb: > B) soweit ich das weiß ist dort auf dem Nano3 doch ein 16Mhz Quarz > verbaut (hoffe ich?) Wenn Du wissen willst, ob die Fuses stimmen (wenn Du es nicht nachschauen kannst) - lass einfach eine LED 1 mal pro Sekunde blinken. Programme dazu findest Du ... überall .. :-)
Dennis S. schrieb: > TCCR0A |= (1 << WGM01); Bullshit-----^ > TCCR0B |= (1 << CS01) | (1 << CS00); Bullshit-----^ > TIMSK0 |= (1 << OCIE0A); Bullshit-----^
c-hater schrieb: >> TIMSK0 |= (1 << OCIE0A); > Bullshit-----^ Den ziehe ich zurück. Das kann immerhin sinnvoll sein.
...wenn ich mit 980 zurück rechne: 16Mhz 980 64 ergibt ziemlich genau 255. Auffällig. Selbst wenn ich 249 oder 250 direkt zuweise: OCR0A = 249; ändert es nichts. Ich lade das falsche reload Register, kann das sein? Danke. Gruß DS
Dennis S. schrieb: > Danke. Gerne - wenn Du Fragen nicht beantwortest wird Dir wohl niemand helfen (können).
:
Bearbeitet durch User
> Ich lade das falsche reload Register, kann das sein?
Vielleicht läuft auch der falsche Modus, das ist es nämlich, was c-hater
in seiner unnachahmlichen Art zum Ausdruck bringen wollte: könnte es
sein, dass beim Arduino TCCR0A und B bereits vorbesetzt sind und die
Ver-Oderung ins Chaos führt?
Hi, keine Ahnung, sie werden jedenfalls nicht von mir genutzt, ist nicht viel Code drauf, nur ein bissl Ausgabe auf LED. Mache da sonst noch nichts. Die Timer auf dem Atmega waren mir schon immer zu viel, steige da nicht gut durch, auch nicht im Datenblatt, ist nicht meins. Da bräuchte ich etwas Unterstützung, die ganzen Modi etc... Thema Fragen: ja 0.001 * 16.Mio durch 64 -1 ist halt 249...!? Aber wie gesagt, wenn ich es so rein lade bleibt es dabei, von daher verstehe ich nicht was ich zu der Frage noch schreiben soll... Viele Grüße DS
> keine Ahnung
Okay, da sind wir schon zu zweit, ich kenne den Arduino nicht. Aber ein
Ansatz wäre jetzt doch, statt dieser Ver-Oderung eine saubere Zuweisung
an TCCR0A und B zu machen und zu schauen, ob bzw. was sich ändert.
Es ist doch mittlerweile eine alte Weisheit dass das Arduino-Umgebungs-Zeugs welches ohne Zutun immer gestartet wird bereits den Timer 0 setzt und benutzt. Also wenn Timer 0, dann Vorsicht und komplett initialisieren, nicht nur "weiterverwenden" ( = vs. |= und &= )
> Es ist doch mittlerweile eine alte Weisheit ...
Offenbar nicht, Dennis ist seit sechseinhalb Jahren dabei.
https://www.exp-tech.de/blog/arduino-tutorial-timer ganz Interessant, wusste ich auch nicht das delay() einen timer benutzt (zeit wird dort verbraten dachte ich). So wie es bei Arduino benutzt wird, geht der Vorteil eines Timer Interrupts doch mit damit verloren. Interessant wäre es zu wissen welchen Timer man nutzen kann ohne Funktionen am Arduino zu verlieren... Gruß Hannes
sehr hilfreich: in setup: timer1.initialize(1000); timer1.attachInterrupt(timer1_isr) void timer1_isr(void) //wird 1000x in der sekunde aufgerufen {} So zerstört man sich nicht die vorhandene Struktur... Viel Erfolg
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.