Forum: Mikrocontroller und Digitale Elektronik Timer 1 OVF_Interrupt


von 3s_serdi (Gast)


Lesenswert?

Hallo,

kann mir jemand erklären durch eine beispiel rechnnung, daruch mann 
besser verstehen kann. wie kann ich mein Timer 1 overflow interrupt 
einstellen damit ich einen funktion je ein ms aufrufen kann.
ich nutze die ATmega 128 mit einer 16.000 000 externer taktfrequenz, 
vorteiler 1024.

beispiele rechnung wäre hilf reich

danke

von Willi W. (williwacker)


Lesenswert?

also

16.000.000 = 16.000.000 Takte pro Sekunde

Vorteiler 1024 macht 16.000.000/1024 Takte pro Sekunde

1ms ist 1/1000 Sekunde macht 16.000/1024 Takte = 15625 Takte pro ms

Damit kannst Du den Overflow vergessen, Du musst den Compare-Modus 
wählen (mit dem Compare-Wert 15625)

Alles weitere im Datenblatt

Ciao

von Willi W. (williwacker)


Lesenswert?

war natürlich falsch, Ihr habt es sicher gemerkt, schäm

es kommt 15,625 raus, damit ergibt sich als Comparewert ca. 16 und damit 
ist die ms nicht genau einstellbar, also besser einen anderen Vorteiler 
wählen.

von AVRFan (Gast)


Lesenswert?

>damit ich einen funktion je ein ms aufrufen kann.
>ich nutze die ATmega 128 mit einer 16.000 000 externer taktfrequenz,

Einfachste Lösung: Timer1 im CTC-Modus fahren, Vorteiler 1, Compare-Wert 
16000 - fertig ist die Millisekunde.

von Matthias (Gast)


Lesenswert?

also, 16Mhz/1024 ist der Zähltakt, mit dem der Timer läuft:
15625Hz = alle 64µs ein Impuls.

Also musst du deinen Timer so einstellen, dass alle 15625Impulse der 
überläuft:
pseudocode:

ISR ( Timer1_overflow)
{
   TNCT1 = (65536 - 15625 );
  ...
}

Damit lädst du den TImer so vor, dass er nicht 65536 Takte, sondern nur 
15625 Takte bis zum Sprung 65535=>0 (Überlauf) braucht...

von Karl H. (kbuchegg)


Lesenswert?

@Willi
Dein Rechengang ist für mich nicht wirklich verständlich.

@3s_serdi
Daher nochmal für den Overflow-Fall
Wenn alle 1 ms ein Ereignis eintreten soll, heist dass
das 1000 Ereignisse in der Sekunde erfolgen sollen.

* Der Haupttakt beträgt 16Mhz, also 16000000 Ereignisse pro Sekunde.

* Der Vorteiler des Timers beträgt 1024. Daraus folgt, dass
  der Timer nur noch 16000000 / 1024 = 15625 mal pro Sekunde
  erhöht wird.

* Damit ein Overflow eintritt, muss der Timer (Timer 1) bis
  65536 zählen. Da der Timer in 1 Sekunde bis 15625 zählen
  kann, bruacht er dazu: 65536 / 15625 = 4.2 Sekunden.
  Also weit weg von den geforderten 1 ms


Welcher Vorteiler würde denn benötigt werden?
Die Rechnung mal umgekehrt:
Wir wollen 1000 Ereignisse pro Sekunde. Für jedes Ereignis muss
der Zähler einmal bis 65536 zählen. Ergo muss er in 1 Sekunde
insgesammt 1000 * 65536 = 65536000 Zählvorgänge ausführen.
Das wären knapp an die 65Mhz. Da der Systemtakt aber nur 16Mhz
beträgt, müsste der Vorteiler daher schon kleiner als 1 sein,
damit das überhaupt möglich ist. Ein Vorteiler <1 gibt es aber
nicht.
Ergo: Mit dem Overflow Interrupt wird das so nichts. Selbst bei
einem Vorteiler von 1, sind maximal
   16000000 / 1  = 16000000 / 65536 = 244
Ereignisse pro Sekunde drinnen. Das sind knapp 4 Millisekunden.
Mehr geht mit diesem Timer und dem Overflow Interrupt nicht, wenn
der Timer jedesmal seinen kompletten Zählumfang durchlaufen muss.
Aber: niemand sagt, dass der Timer jedesmal bei 0 anfangen muss
zu zählen! Man kann den Timer auch mit einem Wert vorladen, von
dem aus er irgendwann den Wert 65536 erreicht und ein Overflow
ausgelöst wird.

@3s_serdi
Ist die Berechnung nun etwas klarer geworden? Du musst dir einfach
nur überlegen was der Timer macht, mit welcher Frequenz er
angesteuert wird und wie weit er zählen muss, bis ein Ereignis
(= ein Interrupt) ausgelöst wird.
Der Rest ist dann banale Rechnerei.

von Johannes M. (johnny-m)


Lesenswert?

@Matthias:
Im Prinzip OK, aber wie oben schon von anderen angedeutet: So was macht 
man beim AVR grundsätzlich über die Compare-Einheiten, ausgenommen 
natürlich Fälle, in denen keine Compare-Einheit mehr frei ist. Also 
Compare-Einheit im CTC-Modus und dann die Auswertung über den 
betreffenden Compare-Interrupt. Die Sache mit dem manuellen Timer-Reload 
hat insbesondere in Hochsprachen den Nachteil, dass man (wenn man auf 
Genauigkeit angewiesen ist) die Anzahl der Takte, die vom Eintritt des 
Interrupt-Ereignisses bis zum Nachladen des Timers vergehen, nur schwer 
ermitteln kann. Wenn man es natürlich nicht so genau braucht, dann kann 
man es so machen, aber man muss eben immer noch den Timer nachladen, was 
bei CTC entfällt.

@AVRFan:
[Klugscheiß & Haarspalt]
Naja, der Compare-Wert müsste genaugenommen 15999 sein. Ist bei einem so 
hohen Wert wahrscheinlich vernachlässigbar, aber wenns um kleinere Werte 
geht, kann das erheblich Genauigkeit kosten.
[/Klugscheiß & Haarspalt]

von Matthias (Gast)


Lesenswert?

@Johannes M.

Das weiß ich, aber der Posteröffner hat explizit nach dieser Möglichkeit 
gefragt...

von AVRFan (Gast)


Lesenswert?

>Naja, der Compare-Wert müsste genaugenommen 15999 sein.

Stimmt, Mann. Mein Fehler - sorry.

>Ist bei einem so hohen Wert wahrscheinlich vernachlässigbar, aber wenns
>um kleinere Werte geht, kann das erheblich Genauigkeit kosten.

So ist es.

von Quehl (Gast)


Lesenswert?

dazu fällt mir ein, kann man im CTC Modus noch den 2. Compare Interrupt 
benutzen? Der Timer wird doch wohl bei jedem Compare zurückgesetzt oder 
nur bei einem?

mfg

von Johannes M. (johnny-m)


Lesenswert?

Quehl wrote:
> dazu fällt mir ein, kann man im CTC Modus noch den 2. Compare Interrupt
> benutzen? Der Timer wird doch wohl bei jedem Compare zurückgesetzt oder
> nur bei einem?
Wie beim Highlander: es kann nur einen geben... Afaik gibt es bei den 
Timern mit mehr als einer Compare-Einheit sowieso nur eine, die für den 
CTC-Modus verwendet werden kann (beim Mega16/32 z.B. ist bei Timer 1 
entweder ICR1 oder OCR1A für CTC vorgesehen). Außerdem macht es wenig 
Sinn, da der Timer eh nie über den niedrigsten Compare-Wert hinauskäme. 
Wenn das zweite OCR einen höheren Wert hat, wird dieser eben nie 
erreicht... Braucht man also im Prinzip gar nicht erst drüber 
nachzudenken.

von DKM (Gast)


Lesenswert?

Zurückgesetzt wird nur bei Compare Match mit OCRA, d.h den Compare Match 
B Interrupt kannst Du auch nutzen nutzen

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.