Autor Tema: Como usar el modo sleep en Ccs con un Pic 12f629  (Leído 14864 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Como usar el modo sleep en Ccs con un Pic 12f629
« en: 06 de Abril de 2010, 00:11:25 »
Hola a todos...disculpen la pregunta tan básica, pero la verdad es que aun estoy aprendiendo esto de los pic´s.

Deseo hacer que el pic entre en sleep para bajar el consumo  por un tiempo y que salga de este estado cuando se active un pin.
Por lo que tengo entendido se debe activar el watchdog para poder usar el modo sleep, cosa que no entiendo mucho.
Les agradecería que me guiaran para poder generar el codigo en Ccs.
La dispocicion de los pines esta en esta imagen

http://img.hw.cz/m/Mikrokontrolery-PIC-12F629-675-a-16F630-676/pouzdro12.gif

saludos!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #1 en: 06 de Abril de 2010, 01:45:29 »
Lo del watchdog no es imprescindible para el sleep, dependerá de cómo quieras que el PIC se despierte.
Si vas a usar un pin, no necesitarás despertarlo con el watchdog.

Para dormir al PIC sólo tienes que poner sleep() en tu programa.
Para que se despierte al cambiar cualquier pin, tienes que activar la interrupción "on-change" del pin correspondiente, usando enable_interrupts(INT_RAx) y enable_interrupts(GLOBAL).
En la función de la interrupción pones el código que quieras ejecutar al despertar.

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #2 en: 06 de Abril de 2010, 13:02:36 »
Ok nocturno, haber si entendí. Habilite el pin RA1 la opción on-change entonces cuando pongo es estado 1 a este pin debiera despertar, pero lo que no se es como defino que cuando esta en nivel alto despierte, por que no lo e especificado en ningún lugar.

Un saludo...aqui dejo el codigo para ver si estoy en lo correcto

Código: [Seleccionar]
void main()
{
   
   enable_interrupts(INT_RA1) ); //habilito la funcion on-change en el pin A1
   enable_interrupts(global);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
   
  sleep();        //Hago que el Pic se duerma
  despierta();   //Llamo la funcion para que despierte
 
                   

}

void despierta(void)
{
   if(input(PIN_A1)==1)
   {
      output_high(PIN_A2);
      Programa();
   }

void programa();
{

        // Codigo de programa
}

}



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #3 en: 06 de Abril de 2010, 13:34:39 »
No tienes que llamar a la función despierta(), tienes que definirla como la función asociada a la interrupción por cambio de flanco.
Basta con que pongas esto delante de void despierta() para que sea el vector de interrupciones el que se encargue de llamarla directamente:
#INT_RA1

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #4 en: 06 de Abril de 2010, 22:56:41 »
mmm no hay caso..estuve viendo un manual en pdf de las instrucciones del Ccs y no aparece #INT_RAx solo aparece #INT_RBx.
O quizás este haciendo mal el código, pero la verdad es que no puedo sacar el pic del modo sleep y e leeido bastante pero no logro entender aun
que estoy ignorando para hacerlo.

Cuando compilo me aparece el siguiente error indicandome justo sobre #INT_RA1

error 7 line11(9,10): Invalid Pre-Processor directive
Código: [Seleccionar]
#include <12F629.h>

#fuses NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,INTRC_IO,NOBROWNOUT

#byte TRISA=0x085
#byte porta=0x05

#use delay(internal=4M)
#use fast_io(a)

#INT_RA1           // se supone que al cambiar el estado de RA1 debe despertar
void  despierta()
 {
 output_a(1);
 delay_ms(1000);
 }
 

void main()
{
   set_tris_a(0);
   output_a(0);
   enable_interrupts(INT_RA1); //habilito la funcion on-change en el pin A1
   enable_interrupts(global);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
   sleep();
   despierta();   
   

}


Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #5 en: 06 de Abril de 2010, 23:12:32 »
Es que se asi

Código: C
  1. enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
  2.    enable_interrupts(INT_RA3);         //Habilitamos interrupcion por cambio de estado
  3.                                                  //en pin RA3
//Aqui puedes especificar el pin que deseas

Con RA3 en mi caso creara la interrupcion cuando el pin cambie de estado , de inicio tengo una resistencia de pull-up para que inicie en ALTO, asi que cuando se presione el boton y cierre a GND tendre 0 y ahi salta la interrupcion.

Ahora lo que te mencionan


Código: C
  1. #INT_RA              //interrupcion por cambio de estado en pines
  2. recepcion(){                    //Interrupcion por cambio de estado en pines
  3.    if(!input(PIN_A3)){          // RA3 es 0 ?? esto solo por confirmar pregunto por 0 por eso el sigo " ! "
  4.       flag_rx=TRUE;            //Dato recibido
  5.       }                          // if
  6. }
                            // int_ra3

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #6 en: 07 de Abril de 2010, 01:02:26 »
No hay caso, la verdad hice lo que me dijiste  AKENAFAB pero no e logrado darle al clavo. Lo que quiero hacer es sacar del estado sleep del pic cuando activo el pin RA1. Al principio dejo todos los pines como entradas, por lo que tienen un nivel 0, luego deseo que lo activo con switch a 5v pero el micro sigue en sleep.
Al compilar no tengo ningún error, pero al simularlo en proteus no pasa nada...solo se queda dormido...
De verdad necesito una orientación



Código: [Seleccionar]
#include <12F629.h>

#fuses XT,NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,INTRC_IO,NOBROWNOUT


#use delay(internal=4M)
#use fast_io(a)

#INT_RA              //interrupcion por cambio de estado en pines
despierta(){                   
         
      output_high(PIN_A5);
      delay_ms(1000);


void main()
{
   set_tris_a(0);                      //seteo todos los pines como entrada
   output_a(0);
   
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   enable_interrupts(INT_RA1);
   ext_int_edge(L_TO_H);
   setup_comparator(NC_NC);
   setup_vref(FALSE);
   
  while(1){
 
   sleep();
   delay_cycles(1);
   output_high(PIN_A4);
   
           }
}



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #7 en: 07 de Abril de 2010, 01:38:09 »
No te fíes del proteus, hay que hacerlo en un montaje real para asegurarse que funciona.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #8 en: 07 de Abril de 2010, 02:18:10 »
Todos los pines los configuraste como salida

Código: [Seleccionar]
  set_tris_a(0);                      //seteo todos los pines como entrada
   output_a(0);

Pon el pin que quieres que actue como entrada

Ahi definiste todo como salida.

Haces referencia a RA1 pero esta como Salida asi que no cambia

Ademas estas configurando L_to_H con RA1 pero la interrupcion Externa es con RA2 e  #INT_RA es para cambio de estado en puertos
« Última modificación: 07 de Abril de 2010, 02:23:44 por AKENAFAB »

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #9 en: 07 de Abril de 2010, 02:33:46 »
Esto ya sirve

Ya de ahí puedes modificarle como te es necesario

Esa interrupcion es por cambio de estado, osea que si esta en 0 y pasa a 1 , salta interrupcion , lo mismo que si se queda en 1 luego pasa a 0 , salta interrupcion.

El led se enciende cuando ocurre interrupcion y se apaga cuando regresa del sleep.

Si tienes dudas con las interrupciones que trabaja el microcontrolador presiona VALID INTERRUPTS y te muestra cuales hay,tambien revisa el archivo *.h que trae las caracteristicas del pic.

Una vez que compiles presiona OPEN ALL FILES y ahi te sale.

Código: C
  1. #include <12F629.h>
  2.  
  3. #fuses XT,NOWDT,NOPROTECT,NOCPD,NOMCLR,NOPUT,INTRC_IO,NOBROWNOUT
  4. #use delay(internal=4M)
  5. #use fast_io(a)
  6.  
  7.  
  8. void main()
  9. {
  10.    setup_comparator(NC_NC_NC_NC);
  11.    setup_vref(FALSE);
  12.    
  13.    set_tris_a(0b000010);                      //seteo todos los pines como salidda Excepto Ra1
  14.    output_a(0);
  15.    
  16.    enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
  17.    enable_interrupts(INT_RA1);
  18.  
  19.    
  20.   while(1){
  21.  
  22.    sleep();
  23.    delay_cycles(1);
  24.    output_low(PIN_A4);
  25.    
  26.            }
  27. }
  28.  
  29. #INT_RA              //interrupcion por cambio de estado en pines
  30. despierta(){                    
  31.          
  32.       output_HIGH(PIN_A4);
  33.       delay_ms(1000);
  34. }

Saludos!

Desconectado Axel_18

  • PIC16
  • ***
  • Mensajes: 152
Re: Como usar el modo sleep en Ccs con un Pic 12f629
« Respuesta #10 en: 07 de Abril de 2010, 12:25:29 »
Genial AKENAFAB, era ese pequeño detalle que no me dejaba...

Muchas gracias, te lo agradesco mucho

saludos!