mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer 1 OVF_Interrupt


Autor: 3s_serdi (Gast)
Datum:

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

Autor: Willi Wacker (williwacker)
Datum:

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

Autor: Willi Wacker (williwacker)
Datum:

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

Autor: AVRFan (Gast)
Datum:

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

Autor: Matthias (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Johannes M.

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

Autor: AVRFan (Gast)
Datum:

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

Autor: Quehl (Gast)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: DKM (Gast)
Datum:

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

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.