Autor Tema: pic 12f675 modo sleep funciona en proteus pero no en el circuito real  (Leído 1902 veces)

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

Desconectado KARyKAR

  • PIC10
  • *
  • Mensajes: 4
pic 12f675 modo sleep funciona en proteus pero no en el circuito real
« en: 31 de Diciembre de 2018, 17:14:09 »
 :lol: :lol:

Buenas tardes, estoy realizando un proyecto de activar un módulo de reproducción mp3 con el pic 12f675, el cual consiste de la siguiente manera:
tengo un reloj análogo que  tiene un interruptor interno y quiero reproducir un sonido específico por cada hora previamente grabado en la microSD del módulo  Dfplayer mini, pero el pulso del interruptor cerrado es muy largo y al  conectar el módulo Dfplayer en modo reproducción o play mediante el interruptor del reloj este reproducirá mas de un sonido cuando se accione, entonces decidí utilizar el pic 12f675 para controlar el comportamiento del módulo y de la apariencia del reloj.
entonces:
1- el pic me sensa la señal proveniente de un LDR para que el modulo no funcione durante la noche
2- el pic sensa la señal del interruptor del reloj  que esta conectada a 5v de la misma alimentación del pic
3- el pic lee la señal del interruptor del reloj y genera una señal de poca duración que acciona el mando de reproducción del módulo, (este módulo se puede controlar por bus UART pero no se utilizar este protocolo de comunicación ) enviando un pulso bajo y luego pasándolo a alto para detener la reproducción.
al culminar  esta tarea el pic pasa a modo sleep para no censar mas el interruptor del reloj, lo volverá a sensar en la próxima hora donde hará la misma tarea.
el problema es que el circuito y el pic me funciona bien en proteus pero al montar el circuito el pic no despierta y no acciona el modulo mp3.
el programa es el siguiente:
--------------------------------------------------------------------------------------------------------------------------------------------------------

#include <RELOJJ.h>
#define GP0 PIN_A0
#define GP1 PIN_A1
#define GP2 PIN_A2
#define GP3 PIN_A3
#define GP4 PIN_A4
#define GP5 PIN_A5
#define PULSE PIN_A2
#define LDR   PIN_A4


VOID MAIN ()
{
//***********************************************************************
//*****************CONFIG***************************************

SET_TRIS_A(0B00010100);
SETUP_ADC_PORTS(NO_ANALOGS);
SETUP_COMPARATOR(NC_NC_NC_NC);
setup_adc( ADC_OFF ); // disable A2D
enable_interrupts(GLOBAL);
enable_interrupts(INT_RA2);
 
while (TRUE)
  {
 
  sleep();
    IF (input(PULSE) == 1)
      {
        if (input(LDR) == 1)
         {
                       //interrupcion por cambio de estado en pines
             
             output_high (PIN_A0);
             delay_ms(4000);
             output_low (PIN_A0);
             delay_ms(1000);
           
                 
                         
             output_high (PIN_A1);
             delay_ms(200);
             output_low (PIN_A1);
             delay_ms(400);
             output_high (PIN_A1);
             delay_ms(200);         
             output_low (PIN_A1);
             delay_ms(200);
             output_high (PIN_A1);
             delay_ms(200);
             output_low (PIN_A1);
             delay_ms(400);
             output_high (PIN_A1);
             delay_ms(200);         
             output_low (PIN_A1);
             delay_ms(200);
           //  SLEEP();
         }
             
-------------------------------------------------------------------------------------------------------------------------------

que errores estoy cometiendo para que no me funcione el programa ?

como me quedaría a través del protocolo UART ?

muchas gracias.

 :-/  :-/

Desconectado AccioRw

  • PIC16
  • ***
  • Mensajes: 165
Re:pic 12f675 modo sleep funciona en proteus pero no en el circuito real
« Respuesta #1 en: 02 de Enero de 2019, 07:56:31 »
Hola KARyKAR, antes de nada quería darte mi opinion sobre los simuladores y es que siempre que puedas evitarlos y trabajar con el circuito en la realidad mejor para evitar eso mismo que te ha pasado y otras sorpresas que te irá dando, al final termina resultando mas cómodo, rápido y fiable trabajar con un circuito montado que sobre los simuladores que por buenos que puedan ser.

Dicho esto podria ser que tengas el MCLR activado siempre y se te esté reseteando el pic continuamente ¿?

Prueba a encender un led justo despues de activar la interrupcion del puerto RA2, si se resetea el micro no se te encenderá nunca ese led.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:pic 12f675 modo sleep funciona en proteus pero no en el circuito real
« Respuesta #2 en: 02 de Enero de 2019, 13:52:27 »
Que tal KARyKAR,

La implementación de tu código no es correcto y no veo siquiera que pudiera funcionar en Proteus tampoco.
No estás implementado la rutina de interrupción, solamente habilitas la interrupción externa en el puerto RA2, pero no la defines si es por flanco de bajada o flanco de subida.
La funcionalidad del modo sleep es como sigue:

Una vez que el microcontrolador se coloca an modo de bajo consumo (sleep), este se puede despertar a través de varios eventos. Uno de ellos es por interrupción externa que es como lo estás intentando implementar. Ahora bien, cuando se genera la interrupción externa, el contador de programa del microcontrolador (PC) va a saltar a la dirección del vector de interrupciones que es la dirección 0x0004, ahí es que debería residir el código de activación de tu dispositivo de reproducción. Una vez que esto sucede, terminas la rutina de interrupción y el contador de programa regresa al programam principal en la dirección + 1 de donde se encuentra la instrucción del sleep.  En tu caso no debe haber más intrucciones ahí, sino regresar al sleep, por lo que en tu código principal solo necesitas un loop infinito que continuamente coloca al microcontrolador en modo sleep.

Tu código debería ser algo como esto:

Código: [Seleccionar]
#include <12F675.h>
#device ADC=10

#FUSES PUT                      //Power Up Timer
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOCPD                    //No EE protection

#use delay(internal=4000000)
#use FIXED_IO( A_outputs=PIN_A1,PIN_A0 )
#define PULSE   PIN_A2
#define LDR   PIN_A4

#INT_EXT
void  EXT_isr(void)
{
   if(input(LDR)==1) //Es de día?
   {
      output_high (PIN_A0);
      delay_ms(4000);
      output_low (PIN_A0);
      delay_ms(1000);
     
       output_high (PIN_A1);
       delay_ms(200);
       output_low (PIN_A1);
       delay_ms(400);
       output_high (PIN_A1);
       delay_ms(200);         
       output_low (PIN_A1);
       delay_ms(200);
       output_high (PIN_A1);
       delay_ms(200);
       output_low (PIN_A1);
       delay_ms(400);
       output_high (PIN_A1);
       delay_ms(200);         
       output_low (PIN_A1);
       delay_ms(200);
   }
}

void main()
{
   SETUP_ADC_PORTS(NO_ANALOGS);  //Configura todos los pines como digitales
   SETUP_COMPARATOR(NC_NC_NC_NC);   //Deshabilita el comparador
   enable_interrupts(INT_EXT_L2H);  //Habilita la interrupción externa del pin GP2 por flanco de subida
   enable_interrupts(GLOBAL);       //Habilita las interrupciones globales

   while(TRUE)
   {
      sleep();    //Coloca el microcontrolador en modo sleep
   }

}


He probado este código en real y trabaja perfectamente (estoy asumiendo que el pulso de interrupción de parte del reloj no tiene rebotes).

Saludos y espero que esto te sirva.

elreypic.