PIC12, GP0 vill inte följa GP1

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
bos
Inlägg: 2311
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

PIC12, GP0 vill inte följa GP1

Inlägg av bos »

Jag har stirrat mig blind på det här problemet, och jag kommer ingen vart. Koden funkar exakt som den är tänkt i MPLAB-simulatorn, men när jag simulerar PIC-kretsen i Proteus Isis (med klocksignaler) så blåvägrar GP0 att bli det jag vill.

Relevant kod:

Kod: Markera allt

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
; Project: C64 ROM switch controller
;
;
; Pin usage layout:
; =================
; GP0 = OUT     (Q), out
; GP1 = RESTORE (D), in
; GP2 = RESET   (C), in / out
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    list      p=12F683            ; list directive to define processor
    #include <p12f683.inc>        ; processor specific variable definitions

	__CONFIG   _CP_OFF & _CPD_OFF & _BOD_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _BOREN_OFF

; I/O ports
#define _RESET   GP2
#define _RESTORE GP1
#define _OUT     GP0
#define C_PIN   _RESET
#define D_PIN   _RESTORE
#define Q_PIN   _OUT

; Shared Uninitialized Data Section
INT_VAR     udata_shr
TEMP        res 1


;**********************************************************************
RESET_V code    0
        goto    start

ISR_V   code    4
        goto    isr

;**********************************************************************
;                                    ISR
;                                (not used)
;**********************************************************************
isr
        retfie

;**********************************************************************
;                                 ENTRY
;**********************************************************************
start
        banksel OSCCON
        movlw   b'00010001'                         ; Intosc, 125kHz
        movwf   OSCCON

        clrf    ANSEL                               ; No analog inputs
        clrf    OPTION_REG                          ; Disable WPU, INT falling edge

        movlw   b'00000100'                         ; GP2 IOC
        movwf   IOC

        clrf    INTCON
        bsf     INTCON, PEIE                        ; Enable peripheral interrupts
        bsf     INTCON, GPIE                        ; IOC interrupt

        clrf    PIE1
        bsf     PIE1, TMR1IE                        ; Enable Timer1-interrupt

        movlw   b'10011000'                         ; Timer1 LP, 1:2 prescale
        movwf   T1CON

        movlw   b'00000110'                         ; GP0 out, GP1/2 in
        movwf   TRISIO

        banksel GPIO
        clrf    GPIO

loop
        ; Interrupt on change
        btfsc   INTCON, GPIF
         call   ioc_action

        goto    loop

;;;

ioc_action
; GP4 = debug, just to see if we get here
        bsf     GPIO, GP4
        bcf     INTCON, GPIF
        bcf     GPIO, GP4

        btfss   GPIO, C_PIN
         goto   c_went_low

c_went_high
        ; copy D to Q

        ; D = 0/1?
        btfss   GPIO, D_PIN
         goto   clr_q

        bsf     GPIO, Q_PIN
        return
clr_q
        bcf     GPIO, Q_PIN
        return

c_went_low
        ; Released: stop Timer1
        bcf     T1CON, TMR1ON

        return

        END                       ; directive 'end of program'
Koden är i princip en D-flipflop. När C går från låg till hög ska värdet på D kopieras till Q. I alla andra fall (C hög -> låg, C hög, C låg) ska det inte hända något alls.

Fungerar som sagt i simulatorn. Se bild för hur det ser ut i Proteus. Förväntat resultat är att Q ska bli hög på C:s andra flank.

Är det något uppenbart jag gjort fel, eller simulerar Proteus fel?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC12, GP0 vill inte följa GP1

Inlägg av bearing »

Tja, om det fungerar när du simulerar i MPLAB får du väl utgå från att felet ligger det andra simuleringsprogrammet.

Finns det möjlighet att sätta brytpunkter i det andra programmet, och se om t.ex. ; copy D to Q körs?
Skriv svar