View previous topic :: View next topic |
Author |
Message |
respected
Joined: 16 May 2006 Posts: 95
|
Timer1 and sleep and WDT |
Posted: Thu Sep 01, 2011 2:14 pm |
|
|
There is a significant problem.
These codes must be 8 seconds, a time to wake up the PIC.
and wakes up every sec and min values should increase. but sec and min values are not increased, when one reads the eeprom. I wonder why?
not: is used the external oscillator for timer1. Compiler version 4.119
respects.
Code: |
#include <18F14K50.h>
#device ADC=10
#fuses HS,WDT2048,NOLVP,NODEBUG,CPUDIV4,NOMCLR,NOPUT,NOBROWNOUT,USBDIV1
#use delay(clock=12000000)
byte sec=0,min=0;
/////////////////////////////////////////////////////////
#int_TIMER1
void timer1_isr()
{
sec++;
set_timer1(32769);
if(sec>59) {sec=0; min++;}
}
//////////////////////////////////////////////////////////
void main(void)
{
setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1 | T1_CLK_OUT);
set_timer1(32769);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
setup_wdt(wdt_on);
while(true)
{
output_high(pin_c3);
delay_ms(200);
output_low(pin_c3);
delay_ms(200);
write_eeprom(0,sec);
write_eeprom(1,min);
sleep();
}//while
}//main |
|
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 01, 2011 2:36 pm |
|
|
Quote: |
not: is used the external oscillator for timer1.
|
What does this mean ? Do you have a 32.768 KHz watch crystal and
capacitors connected to the Timer1 oscillator pins ? You need it. |
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Thu Sep 01, 2011 2:42 pm |
|
|
yes. i have 32.768 KHz watch crystal and
capacitors connected to the Timer1 oscillator pins .. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Thu Sep 01, 2011 2:54 pm |
|
|
Several comments:
1) _SYNC_ implies the T1 oscillator change is synchronised to the master clock. Won't work when the master oscillator stops. What does sleep do to the master oscillator?....
2) Look at the EEPROM write life. How long would it potentially take to kill the EEPROM writing every time round the loop?.
3) What is your actual crystal on the main oscillator?. You have the PLL disabled, and a division by four selected, and the clock rate set as 12MHz. Would imply a 48MHz external clock. Is this what you have?.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Thu Sep 01, 2011 3:03 pm |
|
|
I wrote to see u EEprom values. printf would generate the same results are taken.12 MHz is not the problem. 48 MHz is the same. Thanks. but not solved.
When there is no sleep and the WDT is running smoothly. I used to wake up the WDT is always a problem. |
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Thu Sep 01, 2011 5:31 pm |
|
|
I changed the settings for the oscillator. result is the same.
sleep (idle) works when you have made. but the sleep () does not work in
setup_timer_1(T1_EXTERNAL_SYNC | T1_DIV_BY_1 | T1_CLK_OUT);
setup_timer_1(T1_EXTERNAL| T1_DIV_BY_1 | T1_CLK_OUT); working
but Timer1 wake-up , not WDT
Last edited by respected on Thu Sep 01, 2011 5:44 pm; edited 1 time in total |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu Sep 01, 2011 5:38 pm |
|
|
I made it work with rs232 output. I didn't test it with eeprom.
I used vs. 4.119. I put a 32.768 KHz watch crystal on the T1OSCI and
T1OSCO pins, with 22 pf capacitors. I put a 12 MHz crystal on the CLKIN
and CLKOUT pins, also with 22 pf capacitors. I connected the USART Tx
pin to a MAX232 chip and then to my PC.
I edited the program slightly as shown below in the comments.
I get this output on the TeraTerm window:
Quote: |
00:00
00:01
00:02
00:03
00:04
00:05
00:06
00:07
00:08
00:09 |
Code: |
#include <18F14K50.h>
#device ADC=10
#fuses HS,WDT2048,NOLVP,NODEBUG,CPUDIV4,NOMCLR,NOPUT,NOBROWNOUT,USBDIV1
#use delay(clock=12000000)
#use rs232(baud=9600, xmit=PIN_B7, rcv=PIN_B5, ERRORS)
byte sec=0,min=0;
/////////////////////////////////////////////////////////
#int_TIMER1
void timer1_isr()
{
sec++;
set_timer1(32769);
if(sec>59) {sec=0; min++;}
}
//////////////////////////////////////////////////////////
void main(void)
{
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT); // *** REMOVED SYNC
set_timer1(32769);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
setup_wdt(wdt_on);
while(true)
{
output_high(pin_c3);
delay_ms(200);
output_low(pin_c3);
delay_ms(200);
//write_eeprom(0,sec); // *** COMMENTED OUT ***
//write_eeprom(1,min); // *** COMMENTED OUT ***
printf("%02u:%02u \n\r", min, sec); // *** ADDED ***
delay_ms(3); // *** ADDED ***
sleep();
}//while
}//main |
|
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Fri Sep 02, 2011 3:16 am |
|
|
Dear pcm programmer,
The simulation is running, but timer1 wake-up, not wdt. (on the circuit)
In this case does not sleep, because 1 minute wake-up.
I want to wake up in 8 minutes.
thanks. respects |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Fri Sep 02, 2011 4:04 am |
|
|
Just count.....
The WDT, is an inaccurate timer. Variation as much as 300%, over temperature/voltage/chip versions. To get anything accurate, you have to use a timer, not the WDT. The timer here wakes every two seconds (if you don't set the counter forward). The wake only involves a few dozen instructions, so power is tiny. Just let the chip wake every two seconds, and count the wake-ups till you get to your eight minutes. You can reduce the number of instructions involved in the wake up by _not_ having an interrupt handler. So:
Code: |
#include <18F14K50.h>
#device ADC=10
#fuses HS,WDT2048,NOLVP,NODEBUG,CPUDIV4,NOMCLR,NOPUT,NOBROWNOUT,USBDIV1
#use delay(clock=12000000)
int16 ticks;
//////////////////////////////////////////////////////////
void main(void) {
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT); // *** REMOVED SYNC
set_timer1(0);
enable_interrupts(INT_TIMER1);
//enable_interrupts(GLOBAL); //Remove so interrupt handler is not called
do {
ticks=0;
output_high(pin_c3);
delay_ms(200);
output_low(pin_c3);
do {
sleep();
delay_cycles(1); //Instruction pre-fetched - NOP
clear_interrupt(INT_TIMER1);
} while(++ticks<240); //Just wake up for this loop every 2 seconds
} while(TRUE); //Main loop every eight minutes.
}
|
This will just raise the output line for 200mSec every 8 minutes, and will sleep 99.9% of the time, with corresponding power savings.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Fri Sep 02, 2011 5:02 am |
|
|
a different approach. going to try it. thanks |
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Fri Sep 02, 2011 7:52 am |
|
|
yes. no problem.
i don't use WDT. i use timer1 . it's worked |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
![](templates/subSilver/images/spacer.gif) |
respected
Joined: 16 May 2006 Posts: 95
|
|
Posted: Fri Sep 02, 2011 2:30 pm |
|
|
Thank you for your interest PCM. |
|
![](templates/subSilver/images/spacer.gif) |
|