Hallo zusammen,
ich hab da eine Frage.
Muss man, wenn man mit dem Matchregister arbeitet, zwingend den
Periphalclock auf eine Frequenz einstellen?
So wie ich das verstanden habe, läuft mein µC (ARM7) mit 14,4MHz.
Wenn ich dann jede Sekunde eine Variable hochzählen lassen will, muss
ich doch einfach die Zeit meiner Frequenz berechnen (1/f) und daraus
dann auf eine Sekunde.
Sprich: 1/14,4MHz -> ca. 0,07µs
Da 1s 1000µs entspricht 1000/0,07
Daraus bekomme ich dann 14285 und wenn ich dann noch den Overflow
betrachte, müsste ich theoretisch "14284" in mein Matchregister
reinschreiben, dass ich bei jeder Sekunde eine Variable hochzählen
lassen kann.
Aber ehrlich gesagt, denke ich, dass meine Rechnung ziemlich falsch ist.
Wäre nett, wenn mich jemand auf meinen Fehler aufmerksam macht.
Dankeschön
Gruß
Merve B. schrieb:> Aber ehrlich gesagt, denke ich, dass meine Rechnung ziemlich falsch ist.> Wäre nett, wenn mich jemand auf meinen Fehler aufmerksam macht.
Korrekt.
Erst einmal das offensichtliche: 1s = 10^6µs
Ich wage aber zu bezweifeln, dass dein Controller mit 14,4MHz läuft. Das
klingt mir eher, als hättest du die PLL falsch bzw. sinnfrei
konfiguriert.
Von deiner Timerkonfiguration wissen wir auch nicht allzu viel.
Ich rate jetzt einfach mal ins Blaue:
LPC23xx/24xx mit 288MHz PLL-Frequenz und Postscaler 20?
Wenn deine Angaben allerdings stimmen, dann frage ich mich, warum du für
das einfache hochzählen einer Variable einen ARM7 benutzt...
@A.K. tut mir leid, dass ich mich falsch ausgedrückt habe
@ Frank Bär Ich habe hier einen LPC2368. Der CPU-Takt beträgt 57.6MHz
und das dann durch 4 sind 14,4MHz (So wurde es mir erklärt). Ich habe
nichts an den Einstellungen geändert.
Ich will nur das Prinzip mit dem Match Compare verstehen. Im groben habe
ich es verstanden, aber mit der Berechnung klappts noch nicht so ganz,
wie man es sehen kann.
Ich habe auch noch nicht angefangen ein Programm zu schreiben, d.h.
meinen Timer habe ich noch nicht konfiguriert.
Tut mir leid, wenn ich euch auf die Nerven gehe, mit dem wenigen Wissen,
was ich habe.
Merve B. schrieb:> @ Frank Bär Ich habe hier einen LPC2368. Der CPU-Takt beträgt 57.6MHz> und das dann durch 4 sind 14,4MHz (So wurde es mir erklärt). Ich habe> nichts an den Einstellungen geändert.
Ah, jetzt nähern wir uns der Sache ;-)
> Ich will nur das Prinzip mit dem Match Compare verstehen. Im groben habe> ich es verstanden, aber mit der Berechnung klappts noch nicht so ganz,> wie man es sehen kann.
Wenn der Timerstand den im Match-Register hinterlegten Wert erreicht,
wird ein Interrupt ausgelöst. In dem Interrupt kannst du deine Variable
modifizieren.
> Ich habe auch noch nicht angefangen ein Programm zu schreiben, d.h.> meinen Timer habe ich noch nicht konfiguriert.
Dann solltest du damit anfangen. Für den Anfang ist es erst einmal
wichtig, dass der Timer läuft. Zu dem Zweck erst einmal minimal
konfigurieren und starten. Im Debugger schaust du dir dann das
TC-Register an, ob es sich verändert. Dann kannst du mit dem
Match-Interrupt rumspielen.
> Tut mir leid, wenn ich euch auf die Nerven gehe, mit dem wenigen Wissen,> was ich habe.
Jeder fängt mal an.
Ein Oszilloscope oder auch nur ein Frequenzzähler wär jetzt für diese
Aufgabe auch nicht verkehrt. Damit kannst du dann deine Einstellungen
verifizieren.
Grüsse
Danke für die Hilfestellungen. Ich habe ein kleines Programm geschrieben
was auch funktioniert. Ich poste es mal rein, vielleicht braucht es
irgendwann mal jemand. Falls ihr Fehler seht, dann könnt ihr mich gerne
darauf aufmerksam machen.
Ich möchte noch eine Kleinigkeit wissen. Wenn ich vom selben Timer 2
Interrupts haben möchte (einmal mit Match und einmal mit Capture), dann
muss ich doch praktisch bei der Initialisierung von den Vektoren "2
Interrupt Vektoren" zuweisen, richtig? Aber wenn beides vom selben Timer
ist kann ich dann trotzdem die selbe Vektor Adresse benutzen ( in dem
Fall jetzt die "4")? Weil im Datenblatt steht da nur die "4" für den
Timer0.
Du musst dazu zusätzlich die Interrupt-Quelle prüfen. Im IR-Register
prüfst du auf das MR0-Bit bzw. auf das CR0-Bit. Abhängig davon muss
deine ISR dann den entsprechenden Code ausführen.
Im IR-Register habe ich den Capture Interrupt und den Match Interrupt
ausgewählt. Desweiteren habe ich bei der Initialisierung von den
Interrupt Vektoren den "Block" kopiert und nur die Prioriät geändert.
Aber ehrlich gesagt, weiß ich nicht, wie er in die richtige ISR
reinspringen kann.
Es gibt nur eine ISR, nämlich die, die dem Interruptvektor 4 zugeordnet
ist.
In der ISR musst du jetzt prüfen, ob die Capture-Bedingung (Flag CR0)
oder die Matchbedingung (Flag MR0) den Interrupt ausgelöst hat.
Die Bits, die du prüfen musst, findest du in TnIR.
In der Konfiguration musst du in TnCCR den Capture-Interrupt aktivieren
und in TnMCR den Match-Interrupt.
@Frank Bär
Danke für den tollen Tipp. Hab es ausprobiert und es klappt wunderbar.
Was mich nur irritiert, ich habe in einem anderen Projekt den Timer mit
der Matchfunktion getestet. Wie zu erwarten hat er jede Sekunde eine
Variable hochgezählt. Bloß als ich es dann in das Programm mit dem
Capture eingebaut habe, habe ich plötzlich viel zu hoche Zahlen
zurückbekommen, obwohl ich die selbe Konfiguration genommen habe, wie in
dem funktionierendem Programm.
Weißt du vielleicht, an was das liegen kann?
Danke
Traten die hohen Werte auf deiner Zählvariable auf?
Dann hast du wahrscheinlich auch bei jedem Capture-Event inkrementiert,
weil die ISR nicht zwischen Match- und Capture-Event differenziert hat.
Näheres kann man nur sagen, wenn du den Code der ISR zeigst.