Forum: Mikrocontroller und Digitale Elektronik PIC18F46K40 - Timer0 - Interrupt Flag


von Max (Gast)


Lesenswert?

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:
1
    delay:
2
    movlw   b'00000000'
3
    movwf   T0CON0,0
4
    movlw   b'01000000'
5
    movwf   T0CON1,0
6
    movlw   h'ff'
7
    movwf   TMR0H,0
8
    movlw   h'00'
9
    movwf   TMR0L,0
10
    banksel PIR0
11
    bcf      PIR0,TMR0IF,1
12
    bsf      T0CON0,T0EN,0
13
    loop:
14
    btfss   PIR0,TMR0IF,1
15
    bra      loop   
16
    bcf      T0CON0,T0EN,0
17
    bcf      PIR0,TMR0IF,1
18
    return  0

von Noch einer (Gast)


Lesenswert?

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.

von FlexTheFox (Gast)


Lesenswert?

Verändert sich das Zählregister?

von Witkatz :. (wit)


Lesenswert?

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.

: Bearbeitet durch User
von picfan (Gast)


Lesenswert?

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

von picfan (Gast)


Lesenswert?

P.S.
PIR0 gibt es nicht, das Interruptflag vom Timer0 ist im INTCON-Register
also im Datenblatt wircklich ganz genau hinsehen!

von picfan (Gast)


Lesenswert?

P.S.
Mit welcher IDE arbeitest du?

von Max (Gast)


Lesenswert?

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....

von picfan (Gast)


Lesenswert?

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

von Witkatz :. (wit)


Lesenswert?

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.

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.