PIC Timer0 Initialisieren / Auf Überlauf abfragen

Gast #3063752
Lesenswert?

Hallo,

ich versuche derzeit in einem PIC den Timer0 auf Überlauf abzufragen.
Das mache ich folgendermaßen:

T0CONbits.T08BIT = 0;
T0CONbits.T0CS = 0;
T0CONbits.PSA = 1;
TMR0H = 0x20;
TMR0L = 0x20;
INTCONbits.T0IF = 0;

Die Einstellung soll für 9,17ms sein, habe diesen Code hier generieren 
lassen :

http://www.enmcu.com/software/timer0calculatorandcodegeneration

Meine Abfrage sieht dann wie folgt aus:

T0CONbits.TMR0ON = 1;//Timer starten
while(INTCONbits.T0IF!=1)//solange kein Überlauf ist
{
  if(CMCONbits.C1OUT == 0) //Wenn der Komparator 0 ist
  {
   Ausgang = 1;    //Ausgang auf 1 setzen
  }


}

Ich frage den Komparator C1OUT ab, dieser arbeitet ordnungsgemäß ich 
kann am entsprechenden Ausgang des Komparators ein passendes Signal 
messen.

Ich habe bereits diesen Artikel durchgelesen, aber der hat mich auch 
nicht so recht weiter gebracht:
http://www.mikrocontroller.net/articles/PIC_Codebeispiele

Hat von euch einer eine idee? Habe ich vergessen etwas zu deklarieren im 
Bezug auf den Timer? Oder stimmt vielleicht etwas mit der Abfrage nicht?

Ich nutze einen PIC18F67J60 Programmiere in C und als Compiler nutze ich 
den C18 Compiler v3.45.

Danke schonmal für eure Antworten.
Gast #3063783
Lesenswert?

Das Problem ist, das die While Schleife nicht verlassen wird. Ich habe 
das gefühl das der Timer nicht gestartet wird bzw. der Überlauf nicht 
erreicht wird.

Der Ganze Code wäre ein bißchen viel, ich befinde mich gerade im TCP/IP 
Stack von Microchip.
#3063795
Lesenswert?

Hors Z. schrieb:
> Der Ganze Code wäre ein bißchen viel, ich befinde mich gerade im TCP/IP
> Stack von Microchip.

Wird der Timer0 vielleicht von was anderem Benutzt oder löst er ein 
Interrupt aus, der in diesem dann gleich Ausgewertet und das Flag wieder 
löscht? Ansonsten kannst du statt Ausgang = 1 auch den Teil 
auskommentieren und dafür ein bit vom TMR0H Register ausgeben. Ändert 
sich dieses nicht, läuft der Timer nicht. Anbieten würde sich hier ein 
niedriges bit, damit sich da auch schnell/oft was ändert.
Gast #3063841
Lesenswert?

Ich habe jetzt einfach mal eine Schleife erstellt und frage immer TMR0H 
ab bis zum Überlauf. Ich lasse mir im jeden Durchlauf den aktuellen wert 
als Hexadezimalzahl ausgeben.

while(INTCONbits.T0IF!=1)
{
  AppBuffer[0] = '\0';
  AppBuffer[0] = TMR0H;
  TCPPutArray(MySocket, AppBuffer, wCurrentChunk);
}

Resultat:

Ich bekomme wie folgt Hexadezimalzahlen ausgegeben:
20
22 (5x Hintereinander)
3D (4x Hintereinander)

Ich schließe daraus das der Timer läuft, das Overflowbit anscheinend 
auch gesetzt wird, nur das eventuell der Timer wert nicht passt?

Oder liege ich da falsch?
Gast #3064233
Lesenswert?

Tatsächlich ist der Timer0 noch an einer anderen Stelle im Programm 
eingebunden. Ich habe es nun mit dem Timer2 versucht, jedoch ist das 
ergebis das selbe, da wo das Overflowflag gesetzt werden sollte passiert 
nichts. Der Timer zählt einfach weiter... Ich habe mir die Zählwerte 
ausgeben lassen das passt wohl schon.

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