Ambient
New Member
For some reason the IOC does not seem to be working. I cannot figure out why, this is my first time using this feature. Also, I have a feeling that the TMR2 interrupt is not working either...I have been up all night trying to fix it and cannot figure it out.
Thanks for your help.
Sean
Thanks for your help.
Sean
Code:
;dual 7-segment hex display controller for one byte
List p=16f690
include P16F690.INC
__CONFIG _CP_OFF & _CPD_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTOSCIO & _MCLRE_ON & _FCMEN_OFF & _IESO_OFF; & _INTRC_OSC_NOCLKOUT
errorlevel -302
;-----------------------VARIABLE REGISTER DEFINITIONS---------------------------
w_temp EQU 0x70 ; variable used for context saving
status_temp EQU 0x71 ; variable used for context saving
pclath_temp EQU 0x72 ; variable used for context saving
Digit1 EQU 0xc1
Digit2 EQU 0xc2
temp EQU 0xc3
;================================CODE==================================
org 0x0000
goto Initialize
;***************************Interrupt_Routine**************************
org 0x0004 ; interrupt vector location
movf STATUS,W ; move status register into W register
movwf status_temp ; save of contents of STATUS register
movf PCLATH,W ; move pclath register into W register
movwf pclath_temp ; save of contents of PCLATH register
btfsc INTCON,RABIF
goto ReadPort
bcf PIR1,TMR2IF
btfsc PORTB,h'05'
goto Display1
btfsc PORTB,h'04'
goto Display2
STATUS_RESTORE
movf pclath_temp,W ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,W ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,F
swapf w_temp,W ; restore pre-isr W register contents
retfie
;***************************INITIALIZATION*****************************
Initialize
movlw b'00011000'
movwf STATUS ;BANK 0
movlw b'00000000'
movwf ADCON0 ;turns off ADC
movlw h'ff'
movwf T2CON ;TMR2 PS 1:16, TMR2 PostS 1:16, 0.06sec period
movlw b'00111000'
movwf STATUS ;BANK 1
movlw b'01000001'
movwf OSCCON ;sets oscillator to 1MHz
movlw b'00000001'
movwf OPTION_REG ;1:16 PS,
bsf PIE1,TMR2IE ;enable Timer2 interrupt
movlw b'00111111'
movwf TRISA ;PORTA I/O setup
movlw b'00111111'
movwf IOCA
movlw b'11000000'
movwf TRISB ;PORTB: RB4-5 outputs for Display select lines
movlw b'00000000'
movwf TRISC ;PORTC: Display Data
movlw b'11011000'
movwf STATUS ;BANK 2
movlw b'11000000' ;enable Interrupt on change
movwf IOCB
movlw h'00'
movwf ANSEL ;analog disable ANS0-ANS7
movlw h'00'
movwf ANSELH ;analog disable ANS8-ANS11
movlw b'00111000'
movwf STATUS ;BANK 0
movlw b'00001000'
movwf INTCON ;enable IOC for PortA, B
main
bsf INTCON,GIE
bsf PORTB,h'04'
bsf PORTB,h'05'
movlw b'10011110'
movwf PORTC
nop
nop
goto $-1 ;idle loop
ReadPort
movf PORTB,W
andlw b'11000000'
iorwf PORTA,W
movwf temp ;temp contains full input byte
andlw h'0F' ;Least Significant Nibble
call Table
movwf Digit2
swapf temp,W
andlw h'0F' ;Most Significant Nibble
call Table
movwf Digit1
goto STATUS_RESTORE
Display1
bsf PORTB,h'04' ;disable display 2
movf Digit1,W
movwf PORTC
bcf PORTB,h'05' ;enable display 1
goto STATUS_RESTORE
Display2
bsf PORTB,h'05' ;disable display 1
movf Digit2,W
movwf PORTC
bcf PORTB,h'04' ;enable display 2
goto STATUS_RESTORE
Table
andlw b'00001111'
addwf PCL,F
;PORTC 76543210
;Segment abcdefgh, active low
retlw b'00000010' ;0
retlw b'10011110' ;1
retlw b'00100100' ;2
retlw b'00001100' ;3
retlw b'10011000' ;4
retlw b'01001000' ;5
retlw b'01000000' ;6
retlw b'00011110' ;7
retlw b'00000000' ;8
retlw b'00011000' ;9
retlw b'00010000' ;A
retlw b'11000000' ;B
retlw b'01100010' ;C
retlw b'10000100' ;D
retlw b'01100000' ;E
retlw b'01110000' ;F
END
;+++++++++++++++++++PORTC Pinout+++++++++++++++
;++++PortC: 7 6 5 4 3 2 1 0 +++
;++segment: a b c d e f g h +++
;++++++++++++++++ _a_ +++++++++++
;++++++++++++++++ | | +++++++++++
;++++++++++++++++ f|_g_|b +++++++++++
;++++++++++++++++ | | +++++++++++
;++++++++++++++++ e| |c +++++++++++
;++++++++++++++++ h -d- +++++++++++
;++++++++++++++++++++++++++++++++++++++++++++++