SLEEP
Παράδειγμα 1:
#include <18F2550.h>
#FUSES NOWDT, WDT1024, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
void main()
{
int a=0;
setup_wdt(wdt_on);
for (a=0;a<10;++a)
{
output_toggle(pin_a0);
delay_ms(100);
}
sleep(); //Μπαίνει σε sleep mode και ξυπνάει κάθε
//~4sec από τον wdt (wdt1024).
}
Παράδειγμα 2:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_EXT
void EXT_isr(void)
{
int a=0;
while (a<20)
{
output_toggle(pin_a0);
delay_ms(50);
++a;
}
}
void main()
{
enable_interrupts(INT_EXT);
ext_int_edge(0,l_to_h);
enable_interrupts(GLOBAL);
while (1)
{
if (input(pin_b1)) sleep();
output_toggle(pin_A0);
delay_ms(200);
}
}
#include <18F2550.h>
#FUSES NOWDT, WDT1024, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
void main()
{
int a=0;
setup_wdt(wdt_on);
for (a=0;a<10;++a)
{
output_toggle(pin_a0);
delay_ms(100);
}
sleep(); //Μπαίνει σε sleep mode και ξυπνάει κάθε
//~4sec από τον wdt (wdt1024).
}
Παράδειγμα 2:
#include <18F2550.h>
#FUSES NOWDT, INTRC_IO, NOPUT, NOMCLR
#use delay(clock=4M)
#int_EXT
void EXT_isr(void)
{
int a=0;
while (a<20)
{
output_toggle(pin_a0);
delay_ms(50);
++a;
}
}
void main()
{
enable_interrupts(INT_EXT);
ext_int_edge(0,l_to_h);
enable_interrupts(GLOBAL);
while (1)
{
if (input(pin_b1)) sleep();
output_toggle(pin_A0);
delay_ms(200);
}
}
Στο πρώτο μπαίνει σε sleep μετά της επαναλήψεις και το delay της for και ξυπνάει κάθε περίπου 4 δευτερόλεπτα από τον wdt (κάνει reset και ξαναξεκινάει η for).
Στο δεύτερο αναβοσβήνει συνέχεια ανά 200mS το pin_a0 και όταν κάνουμε high το pin_b1 μπαίνει σε sleep. Για να ξυπνήσει πρέπει να πάει στο pin_b0 (που είναι και η int_ext) ένας παλμος low to high, τότε θα δημιουργηθεί η διακοπή με αποτέλεσμα να ξυπνήσει ο μ/ε, να τρέξει την while (στην ρουτίνα της διακοπής) και να συνεχίσει με την main (ξανά συνεχές αναβόσβημα ανά 200mS)
Στο δεύτερο αναβοσβήνει συνέχεια ανά 200mS το pin_a0 και όταν κάνουμε high το pin_b1 μπαίνει σε sleep. Για να ξυπνήσει πρέπει να πάει στο pin_b0 (που είναι και η int_ext) ένας παλμος low to high, τότε θα δημιουργηθεί η διακοπή με αποτέλεσμα να ξυπνήσει ο μ/ε, να τρέξει την while (στην ρουτίνα της διακοπής) και να συνεχίσει με την main (ξανά συνεχές αναβόσβημα ανά 200mS)