PIC 18F2685 - Timer0 - Highbyte lässt sich nicht setzen

Gast #2344010
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
Gast #2344042
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?
Gast #2344069
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.
Gast #2344339
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.
Gast #2346069
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren