Hallo zusammen! Ich bin Student und hab zu Weihnachten ne PICkit3 bekommen, auf dem Targetboard sitzt ein PIC18F45K20. Problem bei dem Ganzen, ich bin zwar nicht neu im programmieren von Mikrocontrollern/-prozessoren, aber ich bin eher die alten Dinger gewohnt und kenn mich mit der "neuen" Generation von Pics so gar nicht aus. Daher ist mir der Prescaler und die Pufferung von den higher und lower Bytes nicht wirklich geläufig. Damit auch meine Frage: Kann man es schaffen ziemlich genau eine Sekunde (für ne Uhr) bis zum Overflow einzustellen? Ich habe jetzt die Hoffnung das das mit dem Prescaler funktioniert. Nur wie ich das alles berechnen soll ist nicht so mein Ding :D Also ich lasse den PIC auf 251kHz (Mit Oskar gemessen) laufen und möchte den Timer0 benutzen. Kann mir jemand die Formel zur Berechnung des lower/higher Bytes Initialisierungs- und Nachladewerts herleiten? Danke schon mal! MfG Lars PS: Die Suchfunktion hat zwar was ergeben, aber ich war nicht wirklich mit den Ergebnissen zufrieden.
Hallo, die Uhr funktioniert nur dann halbwegs ordentlich wenn du eine Taktquelle nimmst die durch 256 teilbar ist (Timer0 overflow). Zusätzlich kannst du den Prescaler mitnehmen (Datenblatt Sektion 12.0). Als letzte Teilung kommt noch ein n-facher Überlauf des Timers in Frage. Jetzt musst du halt rechnen! Hier eine kleine begleitende Lektüre: http://www.sprut.de/electronic/pic/programm/lcduhr/lcduhr.html
XD Naja, das behebt nicht mein Problem das ich nicht weiß wie ich die beiden Register initialisieren muss bzw. wie ich die Werte errechne.. Ich bin heute seit 10Uhr Morgens dabei iwas zu lernen (Prüfungsphase) und habe mich dann noch 2 Stunden meinem neuen Hobby gewidmet. Allerdings besitze ich jetzt einfach keine Muße mehr mich wirklich damit zu beschäftigen. Achja, ich programmiere ausschließlich in C, kann also nichts mit Assembler anfangen. Und was soll ich das Rad neu erfinden, wenn es doch bestimmt schon mal jemand erfunden hat?
Hi, ich würde den 16-Bit Timer 1 nehmen. bei einem 40 MHz Quarz kannst Du so jede ms einen Interrupt auslösen und einen Softtimer (counter2) hochzählen: T1CKPS0 = 0; // Timer 1 prescalar = 0 T1CKPS1 = 0; // Timer 1 prescalar = 0 TMR1IP = 0; // 1 = make this a low priority interrupt TMR1IE = 1; // enable Timer interrupt TMR1IF = 0; // clear any pending events T1RD16 = 1 ; // 16 Bit read-write mode TMR1ON = 1; // Timer An //*****************Interrupt************************** // High-priority service void interrupt my_isr(void) { /***** Timer 1 Code *****/ if((TMR1IE)&&(TMR1IF)) { if (counter2 != 255) counter2++; TMR1H = 217; // TMR1L = 240; // 1 ms bei (40 MHZ) 10 MHz = 10000 = 39*256 +16 // 256-39=217 256-16=240 TMR1IF=0; // clear event flag }
Oder den Timer1 einfach mit einem Uhrenqaurz takten und schwupps hat man seine 1s Basis.
Der Timer0 kann auch als 16 Bit Timer verwendet werden ! Dazu muss man halt das Datenblatt lesen. Wie ich sagte Sektion 12.0 LB schrieb: > Achja, ich programmiere ausschließlich in C, kann also > nichts mit Assembler anfangen. Ja das ändert ja nichts daran, welche Werte man in ein Register schreibt. LB schrieb: > Und was soll ich das Rad neu erfinden, wenn es doch bestimmt schon mal > jemand erfunden hat? Das sind absolut triviale Grundlagen. Es tut mir leid aber das hat nichts mit einer Erfindung des Rades tun. Auch nicht symbolisch. Das muss ich leider sagen. Bitte tu dir den gefallen und denk die Sache nochmal durch. Geh das Datenblatt nochmal Punkt für Punkt durch. LB schrieb: > XD Naja, das behebt nicht mein Problem das ich nicht weiß wie ich die > beiden Register initialisieren muss bzw. wie ich die Werte errechne.. Ja wie man den einen 8bit Wert errechtnet wirst du doch wissen. Im Datenblatt gibt es immer Bit0 bis Bit6. __________________________________________ Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 Wertigkeit | 1 | 2 | 4 | 8 |16 |32 |64 | 128 Wollen wir mal ein Beispiel geben. Setzen wir bit 1 und 7 Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 Wertigkeit | 0 | 2 | 0 | 0 | 0 | 0 |64 | 0 -> Summe = 66 Verstanden? Jetzt noch ein bisschen im Datenblatt kucken was welches Bit ist und dann ergibt sich das schon. Die verschiedenen Darstellungen sollte man natürlich schon beherrschen (hexadezimal, dezimal, binär)! Viel Erfolg
Lehrmann Michael schrieb: > Der Timer0 kann auch als 16 Bit Timer verwendet werden ! > Dazu muss man halt das Datenblatt lesen. Wie ich sagte Sektion 12.0 Das Datenblatt habe ich schon lange gelesen. Und mir ist auch klar, dass ich den Timer als 16 Bit Timer nutzen kann.. Ich glaube einfach das hier mein Problem noch nicht klar ist. Es geht um die Initialisierung der beiden Register. Das Problem dabei ist das das higher Byte ein gepufferter Wert ist und nicht den wirklichen Inhalt widerspiegelt. DAS ist das Problem. Wie ich einen Wert von 8 Bit bestimme ist mir vollkommen klar. Und um ehrlich zu sein finde ich Ihre herablassende Art fehl am Platze. Schließlich ist dieses Forum doch dazu da Fragen zu stellen. Und ja, es mag eventuell trivial sein auf den Wert zu kommen aber anscheinend mache ich irgendwo auf dem Weg dahin einen Fehler und wenn Sie einfach eine Formel gepostet hätten mit der man den Wert errechnet der in das Register eingetragen wird hätte ich die mit meiner momentan verwendeten und selber hergeleiteten Formel vergleichen können. Aber anscheinend ist ja das ganze trivial und ich brauch nichts weiter zu machen als das Datenblatt zum 1000ten Mal zu lesen und es dann auf einmal zu verstehen wie ich mit der Pufferung umzugehen habe. Aber danke wenigstens für die Antwort, auch wenn sie arrogant und wenig hilfreich ist. Ich werde einen meiner Profs fragen. Thread geschlossen. An alle anderen die geantwortet haben ein großes Dankeschön für die Antworten.
Hi
>Das Problem dabei ist das das higher Byte ein gepufferter Wert ist und >nicht den
wirklichen Inhalt widerspiegelt.
Puffern heißt eigentlich nur, das z.B. beim Lesen des L-Bytes das H-Byte
zwischengespeichert wird. Damit passen L- und H-Byte auch wirklich
zusammen.
Stell dir mal vor, du liest ein Timer-Register aus, das gerade den Wert
$FFFF hat. Erst L-Byte=$FF. Ist richtig. Wenn jetzt der Timer bis zum
Lesen des H-Bytes weiterzählt wirst du ungepuffert $00 statt der
richtigen $FF lesen. Also ist der gepufferte Wert der richtige.
MfG Spess
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.