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