www.mikrocontroller.net

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


Autor: Karlheinz Druschel (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Michael (Gast)
Datum:

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

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
evtl fuses verstellt???

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm,
mit welchen Fuses kann man den Timer so beeinflussen ?

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
siehe Tutorial

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ReinerL (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael (Gast)
Datum:

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

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karlheinz Druschel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Christof Krüger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.