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.
Du hast nicht geschrieben, was nicht funktioniert. Und ein kompletter Code als angehängte C-Datei wäre nicht schlecht.
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.
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.
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?
Bei allen PICs gibt es ein Bit, mit dem man einen Überlauf der Timer abfragen kann. Beim Timer0 heisst das TMR0IF, weiteres siehe Datenblatt.
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.
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...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.