Hallo
Ich programmiere mir gerade eine BusPirate mit einem PIC24FJ um.
Bei der Timerprogrammierung bin ich ziemlich genau um den Faktor 4 zu
langsam (verdächtig), ich finde aber den Fehler nicht. Vielleicht kann
mir jemand helfen?
Ich habe das LED BLINK DEMO als Ausgangscode verwendet, benutze jetzt
aber in der Config (MPLAB X) das FNOSC_FRCDIV keyword, Clock sollte also
intern 8Mhz sein.
Alle PostScaler sind auf 1 bzw. aus.
Das sollte ein Fcy von 4Mhz ergeben (Cyclus)
Dann berechnet sich doch der Startup für einen Timer (16Bit) zu:
0xffff - 4000
wenn der Interrupt beim Overflow jede Millisekund kommen soll, oder?
Ich dekrementiere in der ISR einen Counter der mit 1000 initialisiert
ist, also müsste ich ja alle Sekunde einen Event haben, dann wenn der
Counter 0 wird. Dann reinitialisiere ich ihn auf 1000 und mache eine
Ausgabe über die UART. Die kommt im Terminalprogramm aber 15-16x pro
Minute, also ziemlich genau alle 4sek.
Wo kann der Fehler liegen?
Für jeden Tip dankbar
Gruß
Stefan
Interessant wäre ein Code, um zu gucken, wie der Timer konfiguriert ist.
Außerdem wäre es gut zu wissen, welchen PIC24 du meinst, am besten mit
Link zum Datenblatt. Vielleicht hast du doch irgendwo nen Fehler bei der
Timerkonfig. Zur kontrolle würde ich beim Sekundentakt auch eine LED
blinken lassen, nicht das der Fehler irgenwo beim UART liegt. Denke aber
eher nicht.
Zur Not nimmste nen PLLx4
Da die Kommunikation über UART funktioniert, sollte der Oszillator
richtig eingestellt sein.
Stefan_L_01 schrieb:> und im Mainloop eine einfache Ausgabe
Nur das oder noch mehr? Kann es sein, dass eine unterlauf von XT
verpasst wird weil sonst noch etwas in der Main passiert?
Hallo Max
0xf9f (praktisch dez4000) hat (jetzt wo ich noch im main Loop einen
Event Counter inkrementiere) genau 240 Events pro Minute ausgelöst, was
4 pro Sekunde entspricht.
Davor 4 zu langsam, jetzt 4 zu schnell...evtl. läuft doch noch pll mit?
Das ist ein Faktor 16 gegenüber vorher
4000*16 = 64000, liegt nahe an dem xFFFF-4000.
Nun gut zuvor war es "etwa" 4x zu langsam, kann auch nicht ganz 4x
gewesen sein.
Aber ich dachte die Timer inkrementieren und nicht andersrum? Hmm
vielleicht waren das PIC16 samples wo ich das her habe, hat sich was
geändert? Im Manual sehe ich jetzt steht ja auch nur nüchtern für den
PIC24 "Load the period value into PRx", das muss ja dann eigentlich
dekremntierend sein.
Underflow von XT passiert nicht durch die logische if (XT) Anweisung im
ISR. Deswegen habe ich im Mainloop alle Zeit der Welt auf das Event zu
reagieren, kann beliebig viele Software Timer einbauen usw. .
Danke für die Hinweise & n8
Stefan
Stefan_L_01 schrieb:> 0xf9f (praktisch dez4000)
nicht ganz, 3999dez. Der Timer teilt den Eingangstakt durch
(Prescaler*(PRx+1))
> genau 240 Events pro Minute ausgelöst, was> 4 pro Sekunde entspricht.
Im Simulator mit 4MHz instruction Frequency funktionierts mit PR1=0xF7F.
> Aber ich dachte die Timer inkrementieren und nicht andersrum?
Er wird inkrementiert und sobald TMR1==PR1 wird TMR1 auf null gesetzt
und das Interrupt ausgelöst.
> Davor 4 zu langsam, jetzt 4 zu schnell...evtl. läuft doch noch pll mit?
Das wäre komisch, wenn die Taktquelle nicht 4MHz ist, sollte die
Übertragung über UART nicht funktionieren.
Für mal diese Zeilen ein und miss die Frequenz die an RA0 ausgegeben
wird, bei 4MHz sollte sie 666kHz sein:
Ich habe im Lauf mir einfach mal das
OSSCONbits.COSC (current oscii)
angeschaut, es ist 001 was PPL entspricht, also x4 des Taktes. Das
entspricht genau meinem Verhalten.
Trotz FNOSC_FRCDIV Anweisung im Base config word (ist ja auch Default
für power up wenn ich richtig lese).
Kann es sein dass der bootloader der noch in der Firmware sitzt den
Modus vor meiner Software bestimmt?
Gruß
Stefan
Nachtrag: Ursprünglich war auch PPL defiert in dem UR-Demo, mit dem ich
"lernen" anfing.
Die UART Divider aus der Firmware vom BP sind wahrscheinlich auch darauf
abgestimmt. Mich hat eh gewundert dass nach der Umstellung auf FRCDIV
die Ausgabe noch gelaufen ist.
Klar kann ich das jetzt einfach so lassen und mich freuen dass alles 4x
so schnell geht, aber ich würde schon gerne das Teil auch kontrollieren
können...