Forum: Mikrocontroller und Digitale Elektronik PIC Timer0 Initialisieren / Auf Überlauf abfragen


von Hors Z. (Gast)


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.

von Michael S. (rbs_phoenix)


Lesenswert?

Du hast nicht geschrieben, was nicht funktioniert. Und ein kompletter 
Code als angehängte C-Datei wäre nicht schlecht.

von Hors Z. (Gast)


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.

von Michael S. (rbs_phoenix)


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.

von Hors Z. (Gast)


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?

von tt2t (Gast)


Lesenswert?

Bei allen PICs gibt es ein Bit, mit dem man einen Überlauf der Timer 
abfragen kann. Beim Timer0 heisst das TMR0IF, weiteres siehe Datenblatt.

von Hors Z. (Gast)


Lesenswert?

Das ist das Problem um das es geht. Ich schaffe es nach wie vor nicht 
die While Schleife zu verlassen da anscheinend wird das T0IF Bit nicht 
gesetzt wird.

von Hors Z. (Gast)


Lesenswert?

Kann ich vielleicht mit dem T0IF Bit nur ein Interrupt auslösen? Kann 
ich es garnicht abfragen? Im prinzip frage ich ja in der While-Schleife 
das T0IF Bit ab ob es gesetzt ist...

von Michael S. (rbs_phoenix)


Lesenswert?

Doch, abfragen kann man es, es wird auch gesetzt. Wird evtl irgendwo 
anders in deinem Programm der Timer0-Interrupt benutzt? Das würde es 
dann erklären.

von Erich (Gast)


Lesenswert?

Evtl. mit der Lösung hier vergleichen
http://www.edaboard.com/thread226273.html

Gruss

von Hors Z. (Gast)


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.

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.