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]
@Johannes M. Das weiß ich, aber der Posteröffner hat explizit nach dieser Möglichkeit gefragt...
>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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.