Hi All
I hope someone can help me here. I've tried Microchip, but maybe I'm not explaining things well enough. I have a board which has a
32.768KHz crystal directly connected to the SOSCI/SOSCO pins on the dsPIC. After setting up the configuration bits correctly, for running internal FRC w/PLL, I wrote the program below, using some bits from Microchip demos, and programmed the device, but I cannot get it to call the ISR when the watch crystal activates the SOSCI pin. I have made it that it turns on a relay when in the routine, and off when back in the main loop. I can get it to go into the interrupt routine when I use the internal oscillator as the timer device, but not the external crystal.I have tried every example I can find, even code direct to me from microchip tech support but nothing works, yet all other aspects of the chip work perfectly, I have tcp/ip / USB / SD MMC all running of the chip, all I need is a RTC. All pointers, sugesstion, etc. would be great. I have other code, which I can post if needed, but the code below would be the best for myself to get working. Excuse bad coding, but I'm new to PIC.
TIA for all help
Russ
; CODE BEGINS
.include "p33FJ256GP506.inc"
.global __reset .global __T1Interrupt
.global _wreg_init .global _timer_init .global _enSecOsc
.section .text
; The following code example will enable Timer1 interrupts, ; load the Timer1 Period register and start Timer1. ; When a Timer1 period match interrupt occurs, the interrupt ; service routine must clear the Timer1 interrupt status flag ; in software.
__reset: MOV #__SP_init, W15 ;Initalize the Stack Pointer MOV #__SPLIM_init, W0 ;Initialize the Stack Pointer Limit Register MOV W0, SPLIM NOP ;Add NOP to follow SPLIM initialization
; Setup relay for testing interrupt BCLR TRISF,#TRISF4 BCLR LATF,#LATF4
CALL _wreg_init ;Call _wreg_init subroutine CALL _timer_init ;Timer initialization, and Port setup CALL _enSecOsc ; Enable secondary oscillator
done: BSET LATF,#LATF4 ; Turn off relay BRA done ;Place holder for last line of executed code
;.............................................................................. ;Subroutine: Initialization of W registers to 0x0000 ;..............................................................................
_wreg_init: CLR W0 MOV W0, W14 REPEAT #12 MOV W0, [++W14] CLR W14 RETURN
;.............................................................................. ; Timer Initialization ;..............................................................................
_timer_init: CLR T1CON ; Stops the Timer1 and reset control reg. CLR TMR1 ; Clear contents of the timer register
MOV #0x8000, w0 ; Load the Period register, -=12/04/03 RW: changed from 0xFFFF=- MOV w0, PR1 ; with the value 0x8000 - 32768
BCLR T1CON, #TCKPS0 ; Load Prescaler BCLR T1CON, #TCKPS1 ; with 00 = 1:1
BSET IPC0, #T1IP0 ; Setup Timer1 interrupt for BCLR IPC0, #T1IP1 ; desired priority level BCLR IPC0, #T1IP2 ; (this example assigns level 1 priority) BCLR IFS0, #T1IF ; Clear the Timer1 interrupt status flag BSET IEC0, #T1IE ; Enable Timer1 interrupts
BSET T1CON, #TCS ; External Clock Source BSET T1CON, #TON ; Start Timer1
RETURN
;.............................................................................. ; Enable secondary oscillator ;.............................................................................. _enSecOsc: ;OSCCONL(Low byte) Unlock Sequence MOV #OSCCONL, w1 MOV.b #0x02, w0 MOV #0x46, w2 MOV #0x57, w3 MOV.b w2, [w1] MOV.b w3, [w1] MOV.b w0, [w1] ; Enable Sec Osc RETURN
;.............................................................................. ; Example code for Timer1 ISR ;..............................................................................
__T1Interrupt: PUSH.D W4 BCLR LATF,#LATF4 ; TURN ON RELAY BCLR IFS0, #T1IF ; Reset Timer1 interrupt flag POP.D W4 RETFIE ; Return from ISR
.end
; CODE ENDS