RTC on dsPIC33F

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

Reply to
fatbald1
Loading thread data ...

AFAICS there is no loop anywhere to repeat the test. However if the BRA done is the actual loop, there is no time for the relay to close.

--
 
 
 
 
 "A man who is right every time is not likely to do very much."
                           -- Francis Crick, co-discover of DNA
 "There is nothing more amazing than stupidity in action."
                                             -- Thomas Matthews
Reply to
CBFalconer

Sorry I forgot to include the delay loop in the timer ISR. I used this to hold the relay while I check with the scope, just incase the debugger was missing the breakpoint within the routine, you never know.

Thanks for your reply.

Reply to
fatbald1

Hi

It turned out to be a hardware problem. The engineer placed a 1M resistor between the crystal and gnd and it worked perfect.

Russ

Reply to
fatbald1

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.