Timer1 und Timer3
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  Timer (CCS)  |  Timer1 und Timer3 « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Timer1 und Timer3  (Gelesen 1825 mal)
 
Ridder
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« am: Oktober 01, 2009, 16:47:48 »

Hallo,

vielen Dank für das gute Forum. Ich bin ein "Neuling" in diesem Forum, zumindest was das aktive Schreiben betrifft. Schon oft habe ich hier wertvolle Tipps und Anregungen "passiv" bekommen.

Jetzt hab ich aber ein Frage, die ich so hier nicht als Antwort gefunden habe.

Ich benutze den PIC18F4520, CCS Compiler und versuche mit MPLAB IDE den Timer1 und Timer3 zu benutzen. Bei anderen PICs der 16er Reihe war das kein Problem. Jetzt lasse ich die Timer laufen und schaue mir das im SIM von MPLAB an und der Timer zählt nur bis 255 und fängt bei 0 wieder an. Beide Timer sind aber doch 16 Bit Timer? Ist die Konfiguration beim 18F anders als bei den 16F?

Vielen Dank schon einmal

Gruß

maridd
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #1 am: Oktober 01, 2009, 17:04:47 »

Halloooo  Zwinkernd

Zitat
Jetzt lasse ich die Timer laufen und schaue mir das im SIM von MPLAB an und der Timer zählt nur bis 255 und fängt bei 0 wieder an.
Welchen Wert schaust Du Dir in der SIM genau an?
Schau Dir mal die Doku der Timer im Datenblatt an. Timer1 und 3 haben jeweils ein "RD16"-Bit, mit dem Du festlegen kannst, ob der Wert des Timers in einer "16-Bit-Operation" oder zwei 8-Bit Operationen gelesen wird. Vermutlich lässt Du Dir in der Sim nur einen der beiden Register anzeigen? Jedes der beiden Timerregister für sich ist natürlich nur 8-Bit breit.

Gruß
Daniel
Gespeichert
Ridder
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #2 am: Oktober 01, 2009, 17:15:47 »

Hallo Daniel,

danke für die schnelle Antwort. Ich hab das zwar auch gelesen mit dem RD16 Bit aber wohl nicht ganz begriffen, welchen Wert ich mir im SIM angucken muß. Ich hab mir TMR1 bzw. TMR3 angeschaut, diese Werte werden auch mit 16 Stellen angezeigt.
Gruß
Martin
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #3 am: Oktober 01, 2009, 18:04:23 »

Oh I see...

Du musst erst den TMR3L-Register lesen, bevor es zu einer Aktualisierung des TMR3H-Registers kommt.

Teste mal folgenden Code:
Code: (c)
#include "p18f4520.h"

void init (void)
{

  T3CON = 0b00000001;
  T1CON = 0b00000001;
}

void main (void)
{
  unsigned char T3;
  init();
  while(1)
  {
  T3 = TMR3L;
  };

}

Gruß
Daniel
Gespeichert
Ridder
Newbie
*
Offline Offline

Beiträge: 7


Profil anzeigen
« Antworten #4 am: Oktober 01, 2009, 19:36:21 »

Hallo Daniel,

danke für den Code. Es ist aber wohl viel einfacher. Du hattest völlig recht, ich hab mir einfach die falschen Werte anzeigen lassen. Der Wert TMR1_internal bzw. TMR3_internal sind die Zählerwerte und diese zählen auch richtig ihre 16 Bit durch, also kein Programmierfehler sondern alles nur eine Frage der angezeigten Werte im SIM. Bin ich allerdings erst durch Deinen Hinweis drauf gekommen.

Vielen Dank nochmal für Deine Hilfe

Gruß

Martin
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #5 am: Oktober 02, 2009, 10:22:42 »

Hallo Martin,

schön, dass Du noch eine einfachere Lösung gefunden hast. Die Werte TMRx_internal kannte ich noch gar nicht.

Mit meinem Codebeispiel wollte ich Dir das architekturbedingte Verhalten der Timerregister demonstrieren. Und die Simulation verhält sich nunmal exakt wie der reale Prozessor. Intern verfügt der Timer immer über den korrekten Wert des High-Byte, dieser wird allerdings erst in den für den Benutzer sichtbaren Pufferregister kopiert, wenn man auf das low-byte des Timers zugreift.

Aus dem Datasheet, Chapter 12.2:
Zitat
When the RD16 control bit
(T1CON<7>) is set, the address for TMR1H is mapped
to a buffer register for the high byte of Timer1. A read
from TMR1L will load the contents of the high byte of
Timer1 into the Timer1 high byte buffer. This provides
the user with the ability to accurately read all 16 bits of
Timer1 without having to determine whether a read of
the high byte, followed by a read of the low byte, has
become invalid due to a rollover between reads.

Gruß
Daniel
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.036 Sekunden mit 18 Zugriffen.
 
Top! Top!