Timer beim AVR, ich kapiers nicht

Gast #122176
Lesenswert?

Also ich gebe ja zu dass ich anscheinend doof bin, aber vielleicht hat
ja doch einer die Nerven und versucht mir das zu erklären.
Ich habe einen Mega16, das STK500 und Codevision;
Nun habe ich den Timer 0 eingestellt:
Prescaler 64, Reload =0xC6 = 198
Im Interrupt wird nur ein Port getoggelt, also sollte ich an dem Port
eine Frequenz von ca. 1 kHz messen.
Mein Oszi (Tektronix TDS1012) sagt aber dass da nur 740 Hz anliegen.
Kann mir einer erklären warum ? Es kann doch nicht sooo schwer sein,
beim AVR eine Frequenz von 1 kHz zu erzeugen.



Greetings
Karlheinz
Angehängte Dateien:
Gast #122177
Lesenswert?

Du springst 1000 mal in der Sekunde in den Interrupt und toggelst einen
Port. Aber um ein 1KHz-Signal zu generieren mußt du 2000 mal in der
Sekunde in den Interrupt springen, um den Port zu toggeln. Wie jetzt
die 740 Hz zustande kommen, keine Ahnung. Stimmt die Quarzfrequenz?
Michael
Gast #122183
Lesenswert?

Da find ich jetzt zwar nix über die FUSES, aber es gibt ja Datenblätter.
Also SUT und CKSEL und COPT scheinen ok zu sein,
CKOPT = 1
CKSEL = 111
SUT = 11

Vielleicht liegts ja irgendwie am STK, ich werde wohl den Chip mal
programmieren und extern aufbauen, nur mit Takt und Versorgung
Mal schauen was da so passiert
Gast #122184
Lesenswert?

Mal ins blaue geschossen:

Der Sprung zur Interuptservicerutine und das ev. sichern der Register
brauchen doch auch Zeit bevor Du den Timer wieder lädts.

Ist jetzt nur mal ein schuss aus der Hüfte von einem Anfänger.

Reiner
Gast #122186
Lesenswert?

Zum einen solltest du den Timer gleich als erstes neu laden.

Zum anderen kann ich mir noch einen anderen Fehler vorstellen: Im
Hauptprogramm toggelst du einen Pin am PORTC, im Timer-Interrupt
toggelst du einen anderen Pin, auch am PORTC.
Das toggeln eines Pins kann bei einem AVR nie atomar sein, man braucht
dazu also immer mehr als nur eine Anweisung, bei der immer erst der
gesamte Port in ein Register gelesen, das eine Bit getoggelt und dann
wieder geschrieben wird. Das Problem ist nun, dass ein Timer-Interrupt
just nach dem Einlesen des Ports im Hauptprogramm stattfindet, deinen
PORTC.1 toggelt und nachdem die INT-Routine abgearbeitet wurde,
überschreibt das Hauptprogramm deinen grad getoggelten PORTC.1 wieder
mit dem alten Wert.

Das ganze nennt sich Race-Condition, Stichwort Synchronisation und kann
auftreten, wenn mehrere evtl. pseudoparallel ablaufende Codeabschnitte
eine Ressource nicht atomar ändern. Bei einem Portpin ist aber immer
der ganze PORT eine Ressource, und nicht die einzelnen Pins.

Die Lösung wäre in dem Fall die Interrupts im Hauptrogramm vor dem
Toggeln auszuschalten und danach wieder einzuschalten.
Gast #122187
Lesenswert?

Hi,

@Cristof Krüger:

"Das toggeln eines Pins kann bei einem AVR nie atomar sein, man
braucht dazu also immer mehr als nur eine Anweisung, bei der immer erst
der gesamte Port in ein Register gelesen, das eine Bit getoggelt und
dann wieder geschrieben wird."

Es ist so nicht ganz richtig bei den neuen ATiny u. Mega44 geht das mit
nur einem Befehl.
Leider benutzt er ein Mega16 somit braucht er mehr Instruction sowie
wie du es gesagt hast.

Mfg
Dirk
Gast #122188
Lesenswert?

BUMBAAAAAAFFFFFFFFF


Genau das war´s, Christof.
Wenn ich das Toggeln aus dem Hauptprogramm rausnehme, dann stimmt die
Frequenz bis auf eine Nachkommastelle genau


1000 Dank


Greetings
Karlheinz
Gast #122189
Lesenswert?

@Karlheinz:
Super, freut mich, dass mein ganzes Geschreibsel nicht umsonst war =)

@Dirk:
Interessant. Wusste gar nicht, dass ATMEL den Befehlssatz nu erweitert.
Das macht die AVRs ja noch interessanter!
Gast #122190
Lesenswert?

Hi...

Naja, das ist eigentlich keine Befehlssatz-Erweiterung.
Eher eine Funktionalitätserweiterung der Port-Hardware. Das Schreiben
von Einsen ins PINx-Register (also das Eingangsregister) toggelt den
Port. Nettes Feature, aber ich glaube kaum, dass das die Compiler
momentan schon nutzen...

...HanneS...
Gast #122191
Lesenswert?

Achso... wenn es nur das ist, dann dient es evtl. zur verkürzung eines
typischen Hello-World-Blink-LED-Programms. Mir fällt sonst auf Anhieb
nicht ein, was sonst davon großartig profitieren würde. Togglen von
Pins kommt zwar oft bei Clocksignalen vor, aber da weiss man ja immer,
wann man das auf 0 oder auf 1 setzt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren