Forum: Mikrocontroller und Digitale Elektronik PIC 18F2685 - Timer0 - Highbyte lässt sich nicht setzen


von Marco (Gast)


Lesenswert?

Hallo,

ich hab schon wieder ein Problem :-)
Leider lässt sich bei mir TMR0H nicht setzen. TMR0L geht ganz wunderbar.
Wenn ich die Aussagen im Datenblatt richtig verstehe müsste mein Code 
eigentlich funktionieren,oder?
1
void main(void)
2
{
3
TRISB = 0xFF;  //PortB0 Eingang
4
TRISC = 0x00;  //PortC alles Ausgänge
5
PORTA = 0x00;
6
PORTC = 0x00;
7
ADCON1 = 0xFF; //AD-Eingänge abschalten,als Digitale Eingänge nutzen
8
INTCONbits.RBIF = 0;
9
INTCONbits.GIE = 1; //Alle Interrupt zulassen
10
INTCONbits.RBIE = 1; //Port Change Interrupt anschalten
11
T0CON = 0b00001000; //16bit,interner Takt,kein Vorteiler
12
13
TMR0H=0x01; //load TH0
14
TMR0L=0x01; //load TL0

Gruß und Danke schon im Voraus

Marco

von heinzhorst (Gast)


Lesenswert?

Woher weißt du denn, dass das High-Byte nicht gesetzt wird? Hast du dir 
mit einem Debugger den Inhalt des Timer-Registers angeschaut? Falls ja: 
Was steht denn da drin und wo hast du den Breakpoint gesetzt?

von Marco (Gast)


Lesenswert?

Hallo,

ja, ich hab hier einen MPLAB ICD3 dran hängen und gehe den Code in 
Einzelschritten durch. Daher kann ich gut sehen, dass TMR0L mit dem 
vorgegebenen Wert geladen wird und TMR0H unverändert auf 0 stehen 
bleibt.

von holger (Gast)


Lesenswert?

TMR0H is not the actual high byte of Timer0 in 16-bit
mode; it is actually a buffered version of the real high
byte  of  Timer0,  which  is  not  directly  readable  nor
writable (refer to Figure 10-2). TMR0H is updated with
the contents of the high byte of Timer0 during a read of
TMR0L. This provides the ability to read all 16 bits of
Timer0 without having to verify that the read of the high
and  low  byte  were  valid,  due  to  a  rollover  between
successive reads of the high and low byte.
Similarly, a write to the high byte of Timer0 must also
take place through the TMR0H Buffer register. The high
byte  is updated with  the contents of TMR0H when  a
write occurs to TMR0L. This allows all 16 bits of Timer0
to be updated at once.

von Markus O. (pipimaxi)


Lesenswert?

prima Holger, dass du einigermaßen zitieren kannst, hast du schonmal 
bewiesen. Aber wirklich hilfreich ist deine Aussage auch nicht, 
Datenblätter lesen können wir selbst...
Selbst wenn erst das Highbyte, dann das Lowbyte beschrieben wird, ändert 
sich im Timerregister nichts.

von holger (Gast)


Lesenswert?

>prima Holger, dass du einigermaßen zitieren kannst, hast du schonmal
>bewiesen. Aber wirklich hilfreich ist deine Aussage auch nicht,
>Datenblätter lesen können wir selbst...
>Selbst wenn erst das Highbyte, dann das Lowbyte beschrieben wird, ändert
>sich im Timerregister nichts.

Debuggen ist so ne Sache;)

Also, dort steht das erst TIMERH beschrieben werden muss und dann
TIMERL damit TIMERH übernommen wird. Das wird im Programm oben ja auch
gemacht. Die Frage ist jetzt wozu willst du TIMERH jetzt zurücklesen?
Der Wert wird übernommen, dafür sorgt der PIC.

Jetzt kommen ein paar Vermutungen:
Dort steht nicht dass wenn man dann mit dem ICD TIMERH ausliest
dort auch der selbe Wert wieder rauskommt. TIMERH ist erst gültig
wenn TIMERL vorher gelesen wird. Das steht oben.

Ob der richtige Wert im Timer0 steht kannst du ja leicht kontrollieren.
Lass eine LED blinken;)

Oder so:
Der Timer sollte jetzt nicht laufen!

TMR0H=0x01; //load TH0
TMR0L=0x01; //load TL0

tempL = TMR0L;
tempH = TMR0H;

Dann schaust du dir tempH mal an.

von holger (Gast)


Lesenswert?

Nachtrag: Nur zum Verständnis noch mal. Die Zeile wo der
Debugger stehen bleibt wurde noch nicht ausgeführt.
Erst wenn man einen Schritt weiter geht wird sie ausgeführt.

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.