# Despertar del modo Sleep



## jampino (Jun 22, 2006)

Hola tengo un problema, haber si alguien me puede hechar una mano, el problema es el siguiente. Tengo que poner al PIC 16F877 en modo SLEEP y se tiene que despertar cada 10 mseg (sin ningun pulso externo) para hacer una lectura de una patilla. El problema que tengo es el que no se de que manera hacer para sacar al micro del modo SLEEP. Si alguien me pudiera dar alguna solucion lo agradeceria. Un saludo y gracias.


----------



## roberto moreno (Jun 22, 2006)

Estuve leyendo el datasheet del microcontrolador que mencionas y ahpi dice que se puede salir del modo sleep por debordamiento del TMR1, échale una leidita y seguramente te sacará de tu duda.


----------



## jampino (Jun 23, 2006)

He estado leyendo el datasheet del 16f877 y la verdad que no he podido encontrar la solucion para despertarlo, lo he intentado de varias formas pero no he encontrado la manera.


----------



## kepelotas (Jun 23, 2006)

lo puedes despertar mediante la interrupcion del wdt o timer0


----------



## jampino (Jun 23, 2006)

Ok,pero creo que con el wdt no me vale por que necesito que se despierte cada 10 mseg. y la verdad que no se si se le puede asignar un tiempo determinado, ya que nunca lo he utilizado. Una cosa que no se si debo o no, tengo que tener un cristal para poder trabajar con el timer1 cuando esta en modo sleep entre las patillas RC1 y RC0 o no es necesario? Gracias por la ayuda


----------



## mario18560 (Jun 29, 2006)

Hola. Si se puede hacer mediante temporizaciones trabajando con el WDT. El WDT es un timer con el que puedes hacer una temporizacion muy, pero muy precisa. De 10 ms, por ejemplo, tal como necesitas. 

Un cordial saludo.


----------



## danydystri21 (Feb 23, 2012)

Hola tengo una inquietud tengo 2 micros comunicados por rs232 inalambricamente con modulos xbee y lo que deseo hacer es lo siguiente: que el RX se encienda y entre en modo de SLEEP, despues se encienda el micro TX y que por interruccion de RS232 se despierte el RX aqui ajunto el codigo del RX:

#include <16F877A.h>
#DEVICE ADC=8
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=20M)
#include <LCD_B.c>
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8 , parity=N )


     int A=0,
         B=0,
         C=0,
         D=0,
         E=0,
         J=0,
         K=0,
         L=0,
         M=0,
         N=0,
         O=0,
         P=0,
         Q=0,
         R=0,
         W=0,
         X=0,
         Y=0,
         Z=0,
         bandera=0 ;  // bandera para la recepcion  del dato y el modo sllep empieza en cero //


#int_RDA
void RDA_isr(){  //inicia la interrupccion //


 if(kbhit(1))  {      // aqui pregunta por el bus de datos  que si se encuentra en 1 reciba y haga la interrupccion //
 Y=GETC();           // recibe la variable y del tx del control remoto //
 bandera=1;          //como se inicia en cero cuando recibe el dato se pone en uno //


 X++;                //aqui se incrementa la variable sumandose//


 switch(X){          //empieza por casos //

   case 1: A=Y;      //caso 1 a es igual a y//

      break;
   case 2: B=Y;

      break;
   case 3: C=Y;

      break;
   case 4: D=Y;

      break;
   case 5: E=Y;

      break;
  }                //cierre del if del case de las variable que se incrementa //

 if(X==5){X=0;}    //cuandp x valga 5 se inicializa la variable de entrada osea siempre se van a evaluar los 5 casos //


  }    // cierre del el kbhit en uno y recibe los datos //

}    // cierre de la interrupccion //



  Void main(){

 setup_adc_ports(ALL_ANALOG);    //sets all the adc pins to analog
 setup_adc(ADC_CLOCK_INTERNAL);

 LCD_INIT();

 lcd_gotoxy(3,1);
 printf(lcd_putc,"BIENVENIDOS");      ///lcd 2 x 16 para el robot ///
 delay_ms(800);

 lcd_putc('\f');

 lcd_gotoxy(1,1);                                 //1 MNS//
 lcd_putc("ESTABLECIENDO LA");
 delay_ms(800);


 lcd_gotoxy(2,2);
 lcd_putc("COMUNICACION....");                     //2 MNS//
 delay_ms(800);

 lcd_putc("\f");

  enable_interrupts(int_RDA);
  enable_interrupts(GLOBAL);


  while(true){


    if (bandera==1);{

           lcd_gotoxy(1,1);
           printf(lcd_putc,"A0=%u  ",A);
           lcd_gotoxy(9,1);
           printf(lcd_putc,"A1=%u  ",B);
           set_adc_channel(3);
           delay_us(10);
           M=read_adc();
           PUTC(M);

           set_adc_channel(4);
           delay_us(10);
           N=read_adc();
           PUTC(N);
    }   // cierre del if es igual a bandera en 1 igual a eso //

     if(bandera==0){
     sleep();
     bandera=1;
     }





 }   // cierre del while true //

}


----------

