Forum: Mikrocontroller und Digitale Elektronik Mega128 Timer Einstellung


von Andre (Gast)


Lesenswert?

Hay Leute

Ich habe eine Frage ich habe einen Atmega128 und einen 4,915000 MHZ
Quarz nun möchte ich einen Timer Interuppt alle 5 sek. Auslösen.

Was muss ich den bei

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;

TIMSK=0x00;
ETIMSK=0x00;

Eintragen und welcher Timer währe dafür geeignet 5 sek Auszulösen?


MFG: Andre

von Helge Dietert (Gast)


Lesenswert?

Hallo,

mit TMISK und ETMISK kann man einstellen auf welche timer-interrupts
reagiert werden soll.

Mit TCCR stellt man das Verhalten des ganzen Ein.

Bei einer solchen festen Vorgabe würde ich einen 16-Bit timer nehmen
und dann entweder jeder overflow zählen und auswerten; oder das
Vergleichsregister nehmen und jeden Vergleichsregisterüberlauf
auswertern (gibt ein extra Flag, mit dem er er dann TCNT runtersetzt)
oder direkt eine PWM Einheit verwenden mit einer Pulsweiten von 0,5 von
der Gesamtlänge.

TCNT ist generell das Register in dem hochgezählt wird; meistens bis
zum Overflow. Kann auch geschrieben werden, so dass dann ab einem
höhreren Wert gezählt wird.

Die genauen Werte stehen recht verständlich im Datenblatt vom Atmel
oder mal unter dem AVR-GCC-Tutorial gucken.

Viele Grüße
Helge

von Andre (Gast)


Lesenswert?

Ja das habe ich ja Verstanden nun möchte ich aber gerne die Werte haben
wenn es ginge ich weiss nicht wie ich das rechnen soll.
MFG: Andre

von Helge Dietert (Gast)


Lesenswert?

Hallo,

das Rechnen ist sehr einfach.

Du hast die Frequenz vom Hauptquarz, meisten f_h = 16 000 000 Hertz

Mit dem Prescaler schlägt dein Timer mit einem Wert von f_t = fh /
Prescaler

Nach 0 < x < 2^16 (Entweder mit dem Input Compare Register [+Der TCNT
kann von der Hardware resettet werden oder nach jedem Overflow schon
einen Werte in TCNT schreiben [+ Input Compare Register kann
anderweitig verwendet werden; -zusätliche Anweiseung] ) erfolgt dann
halt der Overflow.

Als Frequenz f_i mit der das Interrupt aufgerufen wird ergibt sich so:

f_i = f_h / ( Prescaler * x )

fertig!

Persönlich mache ich dann so, wenn ich für eine f_i passende Werte
Suche, dass ich die möglichst großen Prescaler ausprobiere und dann
versuche entweder mit 8 Bit auszukommen -> x < 2^8 oder 16 Bit
auszukommen -> x <2^16. Um das in diesem Bereich einfach einstellen zu
können und um eine bessere Genauigkeit zu bekommen, versuche ich x
immer möglichst groß zu machen.

Wenn man bei einem Interrupt immer nur Umschaltet ist die Frequenz des
Signals natürlich nur f_i/2.

Bei PWM Hardwareeinheiten, stehen für die einzelnen Modi die Formel so
ähnlich schon direkt im Datenblatt.

Viele Grüße
Helge

von Helge Dietert (Gast)


Lesenswert?

P.S.:

Für sowas kann man das auch recht gut mit dem Toolkit von atmel
ausprobieren. Einfach mal setzen, breakpoint auf das interrupt setzen,
und die stopwatch anschauen.

Wenn es gar nicht gut, kann ich es auch mal vorrechnen; nur mein
Arbeitsrechner ist nicht am Internet, so dass ich von ihr nicht die
Quellen habe.

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.