EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

RTC on dsPIC33F

Started by fatbald1 April 13, 2007
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

fatbald1 wrote:
> > 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. > > ; 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
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. -- <http://www.cs.auckland.ac.nz/~pgut001/pubs/vista_cost.txt> <http://www.securityfocus.com/columnists/423> <http://www.aaxnet.com/editor/edit043.html> "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 -- Posted via a free Usenet account from http://www.teranews.com
CBFalconer wrote:
> > 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. >
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.
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


The 2024 Embedded Online Conference