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 by fatbald1●April 16, 20072007-04-16
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.
Reply by CBFalconer●April 13, 20072007-04-13
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
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