|
|
View previous topic :: View next topic |
Author |
Message |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Sep 10, 2006 9:42 pm |
|
|
I assume you have a 32 KHz crystal on the Timer1 oscillator pins. Here
is a demo program that will wake-up 2 seconds after it goes to sleep.
It sets Timer1 = 0, so it will take 2 seconds to count up to 0xFFFF and
overflow.
The key to making this program work, is to understand that there is
an additional enable bit that must be set to let Timer1 interrupts
wakeup the PIC. It's the PEIE bit in the INTCON register. CCS doesn't
have a constant defined for this bit in the PIC's .H file. CCS includes
the PEIE bit with the GIE bit when you do "enable_interrupts(GLOBAL)".
Apparently CCS didn't anticipate that anyone would want to wake-up
on just a peripheral interrupt, without having global interrupts enabled.
But anyway, you can add a constant for it as shown below. Then it
works. I tested this with PCM vs. 3.249 on a PicDem2-Plus board.
Code: |
#include <16F877.H>
#fuses XT, NOWDT, PROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#define INT_PERIPHERAL 0x0B40 // For 16F877
//===============================
void main()
{
printf("Start\n\r");
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);
set_timer1(0);
clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_PERIPHERAL);
sleep();
printf("Woke up from sleep\n\r");
while(1);
} |
|
|
|
Guest
|
|
Posted: Wed Sep 13, 2006 5:16 am |
|
|
First of all i must thank all posters ( Ttelmah, jecottrell, PCM Programmer ) on great wish for helping. Becuse of you guys, this compiler is workin and getting better and better.
@ PCM Programmer:
Your code is working perfetcly on 16F877 !! .
After i have switched to 16f917, changed the clock to 8 mhz and changed the INT_AD to 0x8C40, the problem is the same...
I can reach the part before sleep but then again when i reach sleep () ,program gets stuck ( no wakeup ). I dont know .... |
|
|
Ttelmah Guest
|
|
Posted: Wed Sep 13, 2006 5:58 am |
|
|
INT_AD???...
The only devices that can wake you up from sleep, are those that run when the unit is asleep. The ADC, will only do so, if it is running off it's RC clock. To sleep while a conversion is being done, you would have to use:
Code: |
setup_adc(ADC_CLOCK_INTERNAL); //use RC clock
disable_interrupts(global); //prevent interrupts from calling a handler
enable_interrupts(INT_AD); //Enable the interrupt you want to wake up
clear_interrupts(INT_AD); //Make sure it is clear (otherwise no sleep)
read_ADC(ADC_START_ONLY); //start the ADC
sleep(); //sleep till the ADC conversion completes
delay_cycles(1); //dummy instruction for the pre-fetch
|
This will wake up and continue when the ADC conversion has completed.
Best Wishes |
|
|
Mat Guest
|
|
Posted: Thu Sep 14, 2006 10:05 am |
|
|
My mistake, wrong thema. Sorry !
Anyway i tried code from Ttelmah and changed code from pcm programmer and both of those codes get freezed when program reaches sleep. There is no problem on the F877... just on F917.
Code: | #include <16F917>
#fuses HS, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock=8000000)
#include "lcd.c"
#define INT_PERIPHERAL 0x0B40 // 2864
#byte T1CON = 0x10 // timer 1
#byte INTCON = 0x0B // Intcon
#byte PIE1 = 0x8C // PIE
#bit TMR1ON = T1CON.0 // 0 Bit --> Timer1 - 1/8
#bit PEIE = INTCON.6 // PEIE
#bit GIE = INTCON.7 // GIE
#bit TMR1IE = PIE1.0 // TMR1IE
//===============================
void main()
{
TMR1IE = 1;
GIE = 1;
PEIE = 1;
lcd_init();
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);
set_timer1(0);
clear_interrupt(INT_TIMER1);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_PERIPHERAL);
output_high(PIN_B0); delay_ms(300); output_low(PIN_B0);
printf(lcd_putc,"Sleep...\n\r");
sleep();
printf(lcd_putc,"Woked up \n\r");
while(1);
} |
|
|
|
Mat Guest
|
|
Posted: Mon Sep 18, 2006 9:02 am |
|
|
I changed bunch of stuff to get this working but again program freezes in sleep part... Now im really out of idea...
Code: | #include <16F917>
#fuses EC_IO, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock=8000000)
#include "lcd.c"
//===============================
#byte T1CON = 0x10 // timer 1 control registar
#byte INTCON = 0x0B // Intcon
#byte PIE1 = 0x8C // PIE
#byte PIR1 = 0xC //
#bit TMR1IE = PIE1.0 // TMR1IE
#bit TMR1IF = PIR1.0 // Timer1 interrupt flag
#bit TMR1ON = T1CON.0 // 0 Bit --> Timer1 - 1/8
#bit T1SYNC = T1CON.2 // Timer 1 sync / async bit
#bit PEIE = INTCON.6 // PEIE
#bit GIE = INTCON.7 // GIE
//===============================
void main()
{
int tick;
GIE = 0; // Global Interrupt Enable bit --> OFF
PEIE = 1; // Peripheral Interrupt Enable bit --> ON
T1SYNC = 1; // Do not synchronize ext.clock input --> ON
TMR1IE = 1; // Timer1 overflow interrupt enable --> ON
//---------------
lcd_init();
setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1);
//---------------
tick=915;
printf(lcd_putc,"Sleep...\n\r"); output_high(PIN_B0); delay_ms(300); output_low(PIN_B0);
do {
TMR1IE = 1; // timer1 interrupt enable --> ON
TMR1IF = 0; // delete timer1 interrupt flag --> ON
set_timer1(0);
sleep();
} while (tick--);
printf(lcd_putc,"Woked up \n\r"); output_high(PIN_B1); delay_ms(300); output_low(PIN_B1);
} |
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|