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'
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?