This is very strange. I have the interrupt working with a toggle on RB1 while main is generating in a loop a pulse on RB0.
During power up both ports are putting out a toggle, but about 5 to 10 seconds after power on the interrupt generated toggle stops. Main still is toggling away. I went through and made sure other peripheral interrupt sources are off...
what am I missing? Would someone please load this code and verify that the interrupt is stopping for some reason?
Code:
' This code is for 16F1827 MCU with built in oscillator (Max Osc 32Mhz)
' Code requires PicBasic Pro 2.60 along with MPASM assembler
ASM
__config _CONFIG1, _FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_OFF & _FCMEN_OFF
__config _CONFIG2, _PLLEN_OFF & _LVP_OFF & _LVP_OFF & _STVREN_OFF
ENDASM
DEFINE OSC 8
' Define ADCIN parameters
DEFINE ADC_BITS 8 ' Set number of bits in result
DEFINE ADC_CLOCK 4 ' Set clock source, look on data sheet for chart
DEFINE ADC_SAMPLEUS 500 ' Set sampling time in uS
DEFINE INTHAND myint ' Setup interrupt handler
;*******************************************************************************
;*******************************************************************************
; System hardware configuration
;*******************************************************************************
;*******************************************************************************
OSCCON = %01110000 ' 8MHz internal
ANSELA = %00000001 ' all digital. A/D disabled
ANSELB = %00000000
TRISB = %00000000 ' set port directions 0 = output, 1 = input
TRISA = %00000001
ADCON0 = %00000111 ' Set PORTA digital 1, analog 0
APFCON0.0 = 1 ' CCP1 PWM output on RB0
APFCON0.3 = 1 ' CCP2 PWM output on RA7
APFCON1 = 1
CCPR1L = 64 ' Set PWM Duty-Cycle to 50%
CCPR2L = 64
PR2 = 49 ' Set PWM frequency
CCP1CON = %00000000 ' Mode select = PWM off , to turn on %00001100
CCP2CON = %00000000 ' Mode select = PWM off, to turn on %00001100
T2CON = %00000110 ' %00000100 = TMR2 ON 1:1 pre-scale
' %00000101 = TMR2 ON 1:4 pre-scale
' %00000110 = TMR2 ON 1:16 pre-scale
' %00000111 = TMR2 ON 1:64 pre-scale
;*******************************************************************************
; Program variables
;*******************************************************************************
ADCVAL var byte
;*******************************************************************************
; Program constants
;*******************************************************************************
;*******************************************************************************
; Power on initialization to known port states
;*******************************************************************************
PowerOn_init:
PortA = 0 ' force low to avoid glitches
POrtB = 0
PIR1 = 0 ' clear TMR1 int flag
PIE1 = %00000001 ' TMR1 int enabled
INTCON = %11000000 ' global & peripheral ints enabled
T1CON = %00010001 ' TMR1 1:2 prescale, timer1 on
;*******************************************************************************
;*******************************************************************************
goto mainloop
asm
; Save W, STATUS and PCLATH registers, if not done previously
myint
; retfie auto-restores w, status, bsr, fsr and pclath
bcf T1CON,TMR1ON ; stop timer 1
bcf PIR1,TMR1IF ; clear over flow flag
movlw 0xEF ; load timer for 16,535 * 2 prescaler interrupt on 16 bit timer
movwf TMR1H ; load high byte
movlw 0xEF
movwf TMR1L ; load low byte
bsf T1CON,TMR1ON ; re-enable timer 1
movlw 0x02
xorwf PORTB,f ; toggle RB1
retfie ; Return from interrupt
retfie ; Return from interrupt
endasm
mainloop:
adcin 0, adcval
LATB.0 = 1
pauseus (4*adcval) + 1000
LATB.0 = 0
pause 15
goto mainloop
Bookmarks