Forum: Mikrocontroller und Digitale Elektronik Atmega168 Timer auf dem Arduino Nano3


von Daniel S. (supernova01)


Lesenswert?

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

von Johann J. (johannjohanson)


Lesenswert?

Dennis S. schrieb:
> 0.001F

Was ist das / was soll das darstellen?

von Johann J. (johannjohanson)


Lesenswert?

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 .. :-)

von c-hater (Gast)


Lesenswert?

Dennis S. schrieb:

>     TCCR0A |= (1 << WGM01);
Bullshit-----^

>     TCCR0B |= (1 << CS01) | (1 << CS00);
Bullshit-----^

>     TIMSK0 |= (1 << OCIE0A);
Bullshit-----^

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

>>     TIMSK0 |= (1 << OCIE0A);
> Bullshit-----^

Den ziehe ich zurück. Das kann immerhin sinnvoll sein.

von Daniel S. (supernova01)


Lesenswert?

...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

von Johann J. (johannjohanson)


Lesenswert?

Dennis S. schrieb:
> Danke.

Gerne - wenn Du Fragen nicht beantwortest wird Dir wohl niemand helfen 
(können).

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

> 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?

von Daniel S. (supernova01)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

> 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.

von Arduinoquäler (Gast)


Lesenswert?

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  &=  )

von S. Landolt (Gast)


Lesenswert?

> Es ist doch mittlerweile eine alte Weisheit ...

Offenbar nicht, Dennis ist seit sechseinhalb Jahren dabei.

von Hannes (Gast)


Lesenswert?

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

von Hannes (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.