Forum: Mikrocontroller und Digitale Elektronik Interrupt funktioniert nicht PIC16 und Timer in Assembler


von rhamirez (Gast)


Lesenswert?

Hallo Leute, ich bräuchte etwas hilfe...

Könnte vielleicht jemand mal drüberschauen und mir sagen, wo der fehler 
ist?
Was soll es machen:
Timer hochzählen und beim overflow meinen interruot ausführen.
Vielleicht habe ich etwas übersehen oder vergessen oder einfach nur 
falsch verstanden...

in der initialisierung:

BSF     STATUS, RP0 ; Bank 1 anwählen
    MOVLW   B'00000110'  ; A/D Converter  aus
     MOVWF   ADCON1
    BSF    PIE1,TMR1IE  ; timer 1 interrupt enable

    BCF       STATUS, RP0    ; Bank 0 anwählen
    ;========= INTCON GIE,PIE enable========
    MOVLW  B'1100000'
    MOVWF  INTCON
       movlw   B'00110001' ; prescaler 1 zu 8, timer enable
    movwf  T1CON

und der interrupt selber:

  BCF  INTCON,7
  BCF  PIR1,TMR1IF
  MOVWF   W_TEMP
        SWAPF   STATUS,W
        CLRF    STATUS
        MOVWF   STATUS_TEMP
        MOVF    PCLATH, W
        MOVWF   PCLATH_TEMP
        CLRF    PCLATH

  INCF  timercounter
  MOVFW  timercounter
  XORLW  D'16'
  SKPZ
  b  intende
  CLRF  PORTB
  CLRF  timercounter

intende MOVF    PCLATH_TEMP, W
    MOVWF   PCLATH
    SWAPF   STATUS_TEMP,W
    MOVWF   STATUS
    SWAPF   W_TEMP,F
    SWAPF   W_TEMP,W
    BSF  INTCON,7
    RETFIE

ich wäre sehr dankbar, wenn mir jemand helfen könnte...

Mit freundlichen Grüßen
euer rhamirez

von Wilhelm F. (Gast)


Lesenswert?

Was sagt denn der Simulator im MPLAB? Da kannst du das ganze Ding doch 
mal durchsteppen und die betreffenden Register beobachten...

von rhamirez (Gast)


Lesenswert?

den timer zählt er hoch (also muss der ja richtig initialisiert 
sein,oder?)
aber der springt nie in meinen breakpoint im interrupt, overflow flag 
usw macht er nicht

von Lehrmann M. (ubimbo)


Lesenswert?

Es wäre noch schön zu wissen welchen von den hundert PIC16F du nun 
verwendest... Dann könnte man dir helfen ...

von rhamirez (Gast)


Lesenswert?

okay tut mir leid.. es ist ein pic 16f872, laut data sheet muss ich doch 
nur pie1<0> in bank 1 und im intcon gie oder noch mehr? habe ich 
vielleicht etwas vergessen?

von rhamirez (Gast)


Lesenswert?

einen fehler erkannt intcon b'11000000'

aber läuft immer noch nicht

von Sebastian H. (sebihepp)


Lesenswert?

Setze mal das Bit T1OSCEN in T1CON.

von Sebastian H. (sebihepp)


Lesenswert?

Sorry, der Oszillator hat damit nichts zu tun.

Aber du zählst im Interrupt eine Variable "timercounter" hoch und sobald 
diese 16 erreicht, setzt du die Variable und PortB auf 0. Wie willst du 
merken ob das Programm funktioniert?

Und woher kommt die Instruktion SKPZ? Ich kann mir schon denken, was sie 
macht, aber wo hast du sie deklariert?

von rhamirez (Gast)


Lesenswert?

soo sebi, habe ich gemacht, hatt immer noch nicht funktioniert...


nach langem probieren, habe ich den timer manuell durchlaufen lassen....
er springt in den interrupt... läuft durch.. und läuft in den break 
point und läuft weiter Oo... frecher hund der....

irgendwann wurde es mir zu bund habe in jeder zeile einen gesetzt 
durchlaufen lassen und schwupps hängt er im ersten fest hängt im 
zweiten.. hängt in allen...

scheint ein bug zu sein wenn ich jetz wieder alle entfernt und meinen 
ursprünglichen gelassen... jetz läuft er da auch rein..

Es handelt sich um die Version MPLAB IDE 8.53

von rhamirez (Gast)


Lesenswert?

den befehl habe ich von der sprut seite..

den kennt MPLAB

SKPZ    SKIP wenn Z-Flag gesetzt ist
Syntax:   SKPZ
echter Code   BTFSS    STATUS, Z
Bedeutung:   Überspringe den folgenden Befehl, falls das Zero-Flag 
gesetzt ist.
Beispiel:   SKPZ        ; teste das Z-Flag
CLRW        ; dieser Befehl wird nicht ausgeführt falls Z=1

von Sebastian H. (sebihepp)


Lesenswert?

Habe mir schon gedacht, dass der Befehl dazu da ist. ;)
Mir ist er neu, aber schön was neues gelernt zu haben. =)

Gut, dann ist es wohl ein Bug in MPLab. Wobei ich den Simulator nicht 
(gern) benutze...

von Wilhelm F. (Gast)


Lesenswert?

So ein einfacher Timer-Interrupt kann doch wohl kein ernsthaftes Problem 
machen. Ich benutzte kürzlich ein uraltes PICkit1, wobei ich mir das 
neueste MPLAB aus dem Netz zog. Den Code für einen 
Timer-Interrupt-gesteuerten Multiplexer sowohl für Assembler als auch 
für C schrieb ich selbst anhand von Beispielen. Da gibt es doch 
reichlich Demos, auch von der Microchip Homepage.

von Sebastian H. (sebihepp)


Lesenswert?

Es ging auch mehr um ein Problem beim Simulieren in MPLab

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.