Forum: Mikrocontroller und Digitale Elektronik PIC Komparator Interrupt


von Jonny B. (jonnybgood)


Lesenswert?

Hallo Leute!

Ich verwende bei einem meiner Programme den PIC16F737, und möchte mit 
dem internen Komparator einen Interrupt auslösen.
Leider passiert das fälschlicherweise sofort nach dem Starten des 
Programmes.
Wenn ich das Programm Schritt für Schritt im debugger laufen lasse 
passiert kein interrupt. Sobald ich das Programm aber normal laufen 
lasse springt es sofort in die Interrupt Routine.

Mein main Program ist momentan nur eine nop-Schleife, also nach meiner 
Initialisierung passiert erstmal gar nichts.
Die Eingänge des Komparators hängen an jeweils einem Shunt der mit Masse 
verbunden ist.

Ich bin momentan relativ ratols, habe die Komparatorfunktion auch noch 
nie vorher verwendet, und hoffe mal auf ein paar Tipps oder vorschläge.

LG, Jonny...

Und hier meine Initialisierung:

init           clrf STATUS
    clrf PORTA
    clrf PORTB
    clrf PORTC

    clrf ADCON0

;  Komperator init
    bsf STATUS, RP0
    bcf STATUS, RP1

    movlw b'10100101'    ;Komparator Referenzspannung    movwf CVRCON

    movlw b'00110110'
    movwf CMCON

    bcf STATUS, RP0
    bcf STATUS, RP1

    bcf PIR2, CMIF
;  Komperator init ende

    movlw b'11000000'
    movwf INTCON

    clrf T1CON
    clrf T2CON

    bsf STATUS, RP0    ; Bank 1
    bcf STATUS, RP1

    movlw b'11000011'
    movwf TRISA
    movlw b'00010111'
    movwf TRISB
    movlw b'10000000'
    movwf TRISC


    movlw b'10000000'
    movwf OPTION_REG

    clrf PIE1
    movlw b'01000000'
    movwf PIE2
    clrf PCON
    clrf OSCTUNE
    clrf OSCCON
    movlw b'00001101'
    movwf ADCON1
    clrf ADCON2

    bcf STATUS, RP0    ; Bank 0
    bcf STATUS, RP1

    bcf STATUS, RP0    ; Bank 2
    bsf STATUS, RP1

    movlw b'00000000'  ; Watchdogtimer        ;  movwf WDTCON

    bcf STATUS, RP0    ; Bank 0
    bcf STATUS, RP1

    clrf memoR
    clrf memoL
    clrf d1
    clrf d2
    clrf d3
    clrf d4
    clrf counterR
    clrf counterL
    clrf Endlage_R
    clrf Endlage_L
    clrf Endlage

    goto main

von Bernd R. (Firma: Promaxx.net) (bigwumpus)


Lesenswert?

Prüf mal, ob die verwendete Referenzspannung nicht erst eine Zeit zum 
stabilisieren braucht. Ich würde da etwas Wartezeit einbauen und dann 
erst den IF löschen.

von Jonny B. (jonnybgood)


Lesenswert?

Ich habe nun eine Verzögerung von einer Sekunde eingebaut, leider hat 
das nicht geholfen.
Wenn ich das CMIF mit der Watch funktion beobachte bleibt es immer 0 
solange ich Schritt für Schritt debugge, nur wenn ich auf Run klicke 
lande ich sofort beim Interrupt. :-(

Hat noch jemand einen Hinweis für mich? :-D

von chris (Gast)


Lesenswert?

GIE (bit 7 von INTCON) sollte erst am Ende der Initialisierung gesetzt 
werden und nicht schon vor die Komponenten initialisiert werden, 
eventuell
erst im main. Speziell aber wenn du schon PIE  aktivierst, die aber gar 
noch
nicht konfiguriert sind.

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.