Forum: Mikrocontroller und Digitale Elektronik Timer0 PIC18F45K20 1Sekunde zählen


von LB (Gast)


Lesenswert?

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.

von Lehrmann M. (ubimbo)


Lesenswert?

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

von LB (Gast)


Lesenswert?

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?

von Dirk F (Gast)


Lesenswert?

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
  }

von PIC N. (eigo) Benutzerseite


Lesenswert?

Oder den Timer1 einfach mit einem Uhrenqaurz takten und schwupps hat man 
seine 1s Basis.

von Lehrmann M. (ubimbo)


Lesenswert?

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

von LB (Gast)


Lesenswert?

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.

von Erich (Gast)


Lesenswert?

Respekt !
Dieser Student wird es weit bringen.

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.