Hallo,
ich arbeite gerade mit dem PIC18F46K40 und habe ein Problem, dass ich
nicht gelöst bekomme.
Und zwar will ich einfach nur die Timer 0 Interrupt Flag (TMR0IF) im
PIR0 Register löschen.
Aber egal was ich mache, sie verändert sich im Simulator nicht.
Weder setzten noch löschen.
Wenn ich alle PIR0 Bits manuell im Simulator über das Interface setze
und im Programm mit CLRF lösche werden auch nur die Bits [0;3] gelöscht.
Die Bits [4;7] bleiben, egal was ich mache unverändert.
Auch auf einem echten PIC scheint das der Fall zu sein, denn schon beim
simplen versuch eine Blinkenden LED zu programmieren, bleibt die LED im
Anfangszustand.
Sprich meine Delay Funktionen läuft unendlich lang, da sich aus
irgendeinem Grund die TMR0IF nicht verändert (Oder ich einfach einen
Programmier Fehler gemacht habe und der Simulator nen Bug hat.....).
Hat jemand Ideen, was das Problem sein könnte?
Hier meine Delay Routine:
Dein Beispiel bringt mich zur Verzweiflung. Ganz egal, was ich versuche;
im Emulator der selbe Effekt.
Habe hier nur Pic18 mit altem Timer0. (Nur ein T0CON Register. TMR0H
wird nur im 16Bit Modus benutzt.) Da funktioniert TMR0IF setzen und
löschen einwandfrei. Schleife beendet sich. Im Emulator und im realen
Chip.
Gute Gelegenheit, dich in den In-Circuit-Debugger einzuarbeiten.
Das Thema hat mich jetzt auch mal gewurmt.
Ich hab mal auf die Schnelle ein Projektchen mit dem MCC
zusammengeklickt, nach dem microchip.wikidot Beispiel:
http://microchip.wikidot.com/mcc:using-timer0-in-mcc
Der TMR0L wird im Simulator brav hochgezählt und macht Überläufe aber
der TMR0IF wird nicht gesetzt. Wenn ich das richtig zusammengeklickert
habe - mit dem MCC arbeite ich sonst nicht - behaupte ich, dass das
wikidot Beispiel auf dem PIC18F46K40 im Simulator nicht funktioniert.
Ich hätte das gerne mit Hardware mal getestet, aber einen K40 habe ich
nicht und sehe bei Conrad oder Voelkner noch keine. Die K40 Reihe ist
gerade mal ein paar Wochen alt und hat noch den Status "sample
available".
Ich hoffe, dass es nur ein Bug im Simulator ist und kein Hardwarebug im
Timer0.
Hallo,
ich sehe, dass du Z.B. movwf T0CON0,0 schreibst.
Ich würde immer movwf T0CON0 schreiben, ohne ,0
das ,0 oder ,1 wird bei Bitmanipulationen eingesetzt,
oder auch um dem Prozessor mitzuteilen, ob der verschobene Wert
ins Arbeitsregister soll oder ins RAM. Der movwf-Befehl kann nur einen
Wert, welcher sich ja schon im Arbeitsregister befindet ins Ram
befördern.
Des Weiteren sehe ich dass du T0CON0 und T0CON1 schreibst, ich glaube es
gibt bei den PIC18 nur T0CON, T1CON, T2CON, T3CON, immer ganz genau das
Datenblatt ansehen!
MFG Picfan
picfan schrieb:> P.S.> PIR0 gibt es nicht, das Interruptflag vom Timer0 ist im INTCON-Register> also im Datenblatt wircklich ganz genau hinsehen!
Sorry, aber das stimmt nicht.
Da es sich um eine neuere Variante des PIC18 handelt wurden einige Dinge
geändert.
Es gibt jetzt z.B. T0CON0 und T0CON1 für Timer 0 usw...
http://ww1.microchip.com/downloads/en/DeviceDoc/40001816C.pdf
War echt ne blöde Idee einen PIC der als "Sample Aviable" markiert ist
für sein Projekt zu verwenden (Toll meine PCB ist jetzt schon genau auf
diesen angepasst).
Timer0 macht ein Problem nach dem anderen.
Ich werde versuchen die anderen Timer zu Verwenden in der Hoffnung, dass
das der einzige Bug von diesem Pic ist....
Hallo,
sorry, hatte kürzlich mit einem PIC18F45k50 etwas zu tun.
Heute hab ich das datasheet von 46k40 angeschaut, es hat sich einiges
fundamental geändert....
MFG
Max schrieb:> Timer0 macht ein Problem nach dem anderen.
Konntest du das Problem bereits lösen?
Im Microchip Forum gibts einen neuen Thread zu Timer0 Bugs mit
vielversprechenden Tipps.
http://www.microchip.com/forums/m963806.aspx
In der Simulation konnte ich auch mit diesen Tipps und den aktuellen
Versionen von MPLAB 3.50 und XC8 1.40 keine Verbesserung sehen. Egal
welchen Oszillator ich wähle und ob Timer0 Sync oder ASync - der TMR0IF
wird nicht gesetzt.