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ß
Es gibt keinen µC "ARM7". Es gibt nur ein paar Prozessorkerne mit diesem Namen, die von zig Herstellern in hunderte von µC eingebaut werden.
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.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
Ach ja eine kleine Frage hätte ich da noch. Muss ich in der ISR den Timer noch einmal starten? Gruß
Merve B. schrieb: > Ach ja eine kleine Frage hätte ich da noch. Muss ich in der ISR den > Timer noch einmal starten? Nein, der Timer läuft weiter.
@Frank Bär Danke :)
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.
Ah klingt logisch :) Danke für den Tipp!!!
@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.
Ich habe vergessen, den Interrupt-Flag zu löschen. Als ich das tat, waren die Werte wieder in Ordnung. Mein Fehler ;) aber man lernt ja dadurch :)
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.