Forum: Mikrocontroller und Digitale Elektronik Timer beim AVR, ich kapiers nicht


von Karlheinz Druschel (Gast)


Angehängte Dateien:

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

von Michael (Gast)


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

von crazy horse (Gast)


Lesenswert?

Irgnedwas stimmt hier doch überhaupt nicht. Wenn man die 740 mal
zurückrechnet (Vorteiler 64 und reload 0xC6) komme ich auf eine
Taktfrequenz von 5,5MHz??

von Michael (Gast)


Lesenswert?

3,694304 MHz / 64 = 57723,5. 57723 / (256 - 198) = 995.2...
Also von daher stimmt's schon. Jedoch weit entfernt von 740.
Michael

von Jens123 (Gast)


Lesenswert?

evtl fuses verstellt???

von Karlheinz Druschel (Gast)


Lesenswert?

Hm,
mit welchen Fuses kann man den Timer so beeinflussen ?

von Alex (Gast)


Lesenswert?

siehe Tutorial

von Karlheinz Druschel (Gast)


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

von ReinerL (Gast)


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

von Michael (Gast)


Lesenswert?

Kann es sein daß du im Hauptprogramm keine Endlosschleife hast und der
Controller 740 mal in der Sekunde das Programm neu startet?
Michael

von Christof Krüger (Gast)


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.

von Dirk (Gast)


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

von Karlheinz Druschel (Gast)


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

von Christof Krüger (Gast)


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!

von ...HanneS... (Gast)


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

von Christof Krüger (Gast)


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.

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.