Temporizador para insoladora con PIC

Nop, la verdad nunca he armado ese proyecto, pero viendo el esquema, no se ve complicado.
Móntalo sobre un protoboard para que hagas pruebas de su funcionamiento.

Hola D@rkbytes estuve simulando el código de la insoladora, cuando le doy el boton star me sale el mensaje pause, es como que hubiera presionado el boton pause, yo quiero que corra como debe ser cuando se presiona star decrementar el tiempo y no pasar por pause para que recien corra el temporizado, a ver si me das una mano de ante mano gracias por la ayuda que me puedas brindar.
 
Hola D@rkbytes estuve simulando el código de la insoladora, cuando le doy el botón start me sale el mensaje pause, es como que hubiera presionado el botón pause, yo quiero que corra como debe ser cuando se presiona start decrementar el tiempo y no pasar por pause para que recién corra el temporizado.
A ver si me das una mano.
De ante mano gracias por la ayuda que me puedas brindar.
Como te había mencionado anteriormente, no he probado ese circuito pero vi que tiene algunos problemas.
Faltan colocar resistencias pull-down en los pines de los pulsadores del puerto A.
El código tiene muchas redundancias y le falta mejorar bastante.

Pero mira, le hice algunos cambios al esquema y también al código.
Espero que con los cambios realizados ya te funcione.

Suerte.
 

Adjuntos

  • temporizador insoladora.rar
    35.7 KB · Visitas: 84
Como te había mencionado anteriormente, no he probado ese circuito pero vi que tiene algunos problemas.
Faltan colocar resistencias pull-down en los pines de los pulsadores del puerto A.
El código tiene muchas redundancias y le falta mejorar bastante.

Pero mira, le hice algunos cambios al esquema y también al código.
Espero que con los cambios realizados ya te funcione.

Suerte.

Gracias D@rkbytes, te agradezco solucionaste mi problema...:)
 
Gracias D@rkbytes, te agradezco solucionaste mi problema...:)

Hola estimado amigo aquí de nuevo incomodando un poco, migre todo el codigo a un pic mas grande como es el pic 16f876a, necesitaba mas puertos para activar otras cosas mas... al compilarlo todo normal carga el el hex generado sale el mensaje, pero cuando presiono el boton para desplazar de digito se queda ahi estático y solo el botón que suma el digito funciona, aqui te dejo adjunto la simulacion, te dejo un link de como ahorrar pines en un pic 16f628a el problemas es que no logre compilarlo, espero me ayudes...
 

Adjuntos

  • insoladora.rar
    66.7 KB · Visitas: 88
Hola estimado amigo, aquí de nuevo incomodando un poco.
Migré todo el código a un pic mas grande como es el pic16f876a.
Necesitaba mas puertos para activar otras cosas más.
Al compilarlo todo normal, carga el el hex generado, sale el mensaje, pero cuando presiono el botón para desplazar de dígito se queda ahí estático y sólo el botón que suma el dígito funciona.
Para usar ese PIC, ahora tienes que reemplazar el registro CMCON por el registro ADCON1.
Deja el mismo valor (7), eso hará funcionar los puertos con ADC como entradas digitales.

También debes fijarte el lugar en dónde van los pulsadores.
El pulsador para cambiar de dígito va en el pin RA3 y tú lo pusiste en RA5
te dejo un link de como ahorrar pines en un pic16f628a.
El problemas es que no logré compilarlo, espero me ayudes.
Olvidaste poner el link.

Suerte.
 
Para usar ese PIC, ahora tienes que reemplazar el registro CMCON por el registro ADCON1.
Deja el mismo valor (7), eso hará funcionar los puertos con ADC como entradas digitales.

También debes fijarte el lugar en dónde van los pulsadores.
El pulsador para cambiar de dígito va en el pin RA3 y tú lo pusiste en RA5

Olvidaste poner el link.

Suerte.

Una vez mas... gracias D@rkbytes, este es el
link http://www.picbasic.co.uk/forum/showthread.php?t=18972
esto es basado en la idea de myke predko y consta en hacer un interface con shift register para el display lcd y ahorrar pines en el pic, a ver si logras compilarlo y hacerlo correr, te adjunto imagen del Ckto mas simulación con los archivos pbp.

Logre generar el archivo hex para hacerlo correr a 8mhz, pero en el display lcd no sale nada.

espero alguna respuesta...
 

Adjuntos

  • Interfaz_pic_lcd.rar
    245.3 KB · Visitas: 40
Una vez más... Gracias D@rkbytes.
Este es el link.
http://www.picbasic.co.uk/forum/showthread.php?t=18972
Esto es basado en la idea de myke predko y consta en hacer un interface con shift register para el display lcd y ahorrar pines en el pic.
A ver si logras compilarlo y hacerlo correr, te adjunto imagen del circuito más simulación con los archivos pbp.

Logré generar el archivo hex para hacerlo correr a 8mhz, pero en el display lcd no sale nada.

Espero alguna respuesta.
Para que ese programa funcione se necesita modificar la librería pbppic14.lib
Esta librería se encuentra en la carpeta de instalación de PICBasic Pro.

Dentro del archivo que adjunto viene la librería modificada para que funcione el "HighJack" que se requiere.

Ahora lo que tienes que hacer es lo siguiente:
Reemplaza la librería original pbppic14.lib por la librería adjunta que modifiqué.
Este reemplazo y modificación no afecta a los programas que usen la instrucción LCDOUT
Tan sólo será usado el HighJack de la librería con los programas que usen el archivo One_Wire_74HC595.bas o LCD_AnyPin.pbp que es el archivo original de donde parte este proyecto de Darrel Taylor.
Éste archivo hace un redireccionamiento de la instrucción LCDOUT hacia LCDsend.

Recuerda que el PIC16F628A no puede trabajar a 8MHz con el oscilador interno, tan sólo a 4MHz máximo.

Bien, adjunto el proyecto funcionando con la librería modificada y la simulación para hacer funcionar una pantalla LCD 16x2 con un solo cable. (One-Wire) y un 74HC595.

Suerte.
 

Adjuntos

  • 1_Wire_74HC595.jpg
    1_Wire_74HC595.jpg
    107.3 KB · Visitas: 62
  • 16F628A LCD One Wire 74HC595.rar
    142.3 KB · Visitas: 62
  • LCD_AnyPin.zip
    4 KB · Visitas: 42
Última edición:
Para que ese programa funcione se necesita modificar la librería pbppic14.lib
Esta librería se encuentra en la carpeta de instalación de PICBasic Pro.

Dentro del archivo que adjunto viene la librería modificada para que funcione el "HighJack" que se requiere.

Ahora lo que tienes que hacer es lo siguiente:
Reemplaza la librería original pbppic14.lib por la librería adjunta que modifiqué.
Este reemplazo y modificación no afecta a los programas que usen la instrucción LCDOUT
Tan sólo será usado el HighJack de la librería con los programas que usen el archivo One_Wire_74HC595.bas o LCD_AnyPin.pbp que es el archivo original de donde parte este proyecto de Darrel Taylor.
Éste archivo hace un redireccionamiento de la instrucción LCDOUT hacia LCDsend.

Recuerda que el PIC16F628A no puede trabajar a 8MHz con el oscilador interno, tan sólo a 4MHz máximo.

Bien, adjunto el proyecto funcionando con la librería modificada y la simulación para hacer funcionar una pantalla LCD 16x2 con un solo cable. (One-Wire) y un 74HC595.

Suerte.




muchas gracias D@rkbytes, cualquier inquietud volveré a consultarte
 
Hola, no sé si siguen interesados en esto, pero estoy trabajando en una y necesito ayuda. Estaba haciendo una pero el código en C me tira un error en el compilador CSS: "Error 71 Out of ROM. A segment of the program is too large."

El código es el siguiente:

Código:
#include <16F628A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES NOMCLR                   //Master Clear pin used for I/O
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection

#use delay(clock=4000000,RESTART_WDT)
#use I2C(master, sda=PIN_B3, scl=PIN_A4)

#rom 0x2100={0,185,1}

#include <LCD.C>

// Pinout
#byte PORTA=5
#bit CARA_SUPERIOR=PORTA.0
#bit CARA_INFERIOR=PORTA.1
#bit BUZZER=PORTA.2
#bit SW_ARRIBA=PORTA.7
#bit SW_ABAJO=PORTA.6
#bit SW_INTRO=PORTA.3

// Mensajes
#define STOP 0
#define PAUSA 1
#define MUESTRACARAS 2
#define MSG_MINUTOS 3
#define MSG_SEGUNDOS 4

// Control estado entrada datos
#define ENTRADAMINUTOS 1
#define ENTRADASEGUNDOS 2

// Control tecla pulsada
#define ARRIBA 1
#define ABAJO 2
#define INTRO 3

const char car[32] =   {17,17,0,0,0,0,17,17,31,31,0,0,0,0,31,31,31,31,0,0,0,0,17,17,17,17,0,0,0,0,31,31};

int8 OpcionMenu=1, ConfCaras, HayMensaje;
int1 Estado=0, EnPausa=0;
int16 Tiempo, Ticks, TiempoPredefinido;
int8 MinutosPre, SegundosPre,TicksMensaje, EstadoEntradaTiempo;



void CargaConfiguracion() {
   TiempoPredefinido = ((int16)read_eeprom(0) * (int16)256) + (int16)read_eeprom(1);
   MinutosPre=TiempoPredefinido/60;
   SegundosPre=TiempoPredefinido - MinutosPre*60;
   ConfCaras=read_eeprom(2);
   TicksMensaje=0;
   Tiempo=TiempoPredefinido;
   EstadoEntradaTiempo=0;
   CARA_INFERIOR=0;
   CARA_SUPERIOR=0;
   HayMensaje=0;
}

void GrabaConfigEeprom() {
   Write_Eeprom (0,TiempoPredefinido >> 8); // graba el byte alto
   Write_eeprom (1,TiempoPredefinido & 0xFF); // graba el byte bajo
   Write_Eeprom (2,ConfCaras);
}

void LCD_DefineCaracter () {
   char i;
   lcd_send_byte (0,0x40);
     for (i=0;i<32;i++) {
      lcd_send_byte (1,car[i]);
   }
}


void menu() {
   lcd_gotoxy(1,2);
   switch (OpcionMenu) {
      case 1:
         if (Estado || EnPausa)
            lcd_putc ("     Parar      ");
          else
            lcd_putc ("    Arrancar    ");
         break;
      case 2:
         lcd_putc ("Cfg tiempo      ");
         break;
      case 3:
         lcd_putc ("Cfg caras       ");
         break;
      case 4:
         if (EnPausa)
            lcd_putc ("   Continuar    ");
          else
            lcd_putc ("     Pausar     ");
         break;
   }
}

void Pitido (int16 Duracion) {
   Duracion*=3;
   while (Duracion>0) {
      BUZZER=1;
      delay_us(162);
      Duracion--;
      BUZZER=0;
      delay_us(162);
   }
}

void PitidoGrave (int16 Duracion) {
Duracion/=2;
   while (Duracion>0) {
      BUZZER=1;
      delay_us(1000);
      Duracion--;
      BUZZER=0;
      delay_us(1000);
   }
}

void ArrancaInsolado() {
   Estado=1; // la encendemos
   EnPausa=0;
   CARA_SUPERIOR=(ConfCaras<3);
   CARA_INFERIOR=(ConfCaras!=2);
   Ticks = Tiempo * 2;
   set_timer1(3036);  // hasta 65536 son 62500 ciclos
   // 62500 con prescaler de 8 y a 1MHz es medio segundo
   // 62500*8/1000000=0,5s.
   enable_interrupts(GLOBAL);
   OpcionMenu=4;
}

void FinalizaInsolado(int Modo) {
char i;
   Estado=0; // la paramos
   CARA_SUPERIOR=0;
   CARA_INFERIOR=0;
   disable_interrupts(GLOBAL);
   if (Modo==STOP){
      Tiempo=TiempoPredefinido;
      EnPausa=0;
      if (OpcionMenu==4) // si está parado no puede entrar en la opción 4
         OpcionMenu=1;
   }
    else {
      EnPausa=1;
      HayMensaje=PAUSA;
    }
   for (i=0;i<3;i++) {
      Pitido (100);
      PitidoGrave (200);
   }
}

void MuestraTiempo() {
   int Minutos, Segundos;


   if (EstadoEntradaTiempo) {
      lcd_gotoxy(12,2);
      Minutos=MinutosPre;
      Segundos=SegundosPre;
   } else {
      lcd_gotoxy(12,1);
      Minutos = Tiempo / 60;
      Segundos = Tiempo - Minutos*60;
   }

   printf (lcd_putc,"%2u:%02u",Minutos,Segundos);
}

void MuestraEstado() {
char i;
   lcd_gotoxy(1,1);
   switch (HayMensaje) {
      case 0: // no hay mensaje
         for (i=0;i<11;i++)
            printf (lcd_putc,"%c",ConfCaras*Estado);
         break;
      case MUESTRACARAS:
         lcd_gotoxy(12,2);
         for (i=6;i<11;i++)
            printf (lcd_putc,"%c",ConfCaras);
         break;
      case PAUSA:
         printf(lcd_putc,"  Pausado   ");
         break;
      case MSG_MINUTOS:
         printf(lcd_putc,"Minutos....");
            lcd_send_byte (0,0x0F);
         break;
      case MSG_SEGUNDOS:
         printf(lcd_putc,"Segundos...");
         //lcd_gotoxy(15,1);
         break;

   }
   if (HayMensaje)
      TicksMensaje++;
      if (TicksMensaje==4) {
         HayMensaje=0;
         TicksMensaje=0;
      }
   MuestraTiempo ();
}


void EjecutaOpcion() {
   switch (OpcionMenu) {
      case 1:
         if (Estado || EnPausa)  // estaba encendida
               FinalizaInsolado(STOP);
          else  // estaba apagada
               ArrancaInsolado();
         break;
      case 2:
         EstadoEntradaTiempo++;
         HayMensaje=MSG_MINUTOS;
//         lcd_send_byte(0,0xC); // parpadeo
//         lcd_gotoxy(1,12);
         break;
      case 3:
         ConfCaras++;
         if (ConfCaras==4)
            ConfCaras=1;
         if (Estado) {
            CARA_SUPERIOR=(ConfCaras<3);
            CARA_INFERIOR=(ConfCaras!=2);
         }
         lcd_gotoxy(1,1);
         HayMensaje=MUESTRACARAS;
         break;
      case 4:
         if (EnPausa)
            ArrancaInsolado();
          else
            FinalizaInsolado  (PAUSA);
         break;
   }
}



#int_TIMER1
TIMER1_isr()
{
   set_timer1(3036);  // hasta 65536 son 62500 ciclos
   // 62500 con prescaler de 8 y a 1MHz es medio segundo
   // 62500*8/1000000=0,5s.
   Ticks--;
   if (!Ticks) // se acabó
      FinalizaInsolado(STOP);
   else {
      Tiempo=Ticks/2;
   }
   menu();
   MuestraEstado();
}

void ConfiguraTiempo(int Modo) {
   switch (EstadoEntradaTiempo) {
      case ENTRADAMINUTOS:
         switch (Modo) {
            case ARRIBA:
               MinutosPre++;
               if (MinutosPre>99)
                  MinutosPre=0;
               break;
            case ABAJO:
               if (MinutosPre==0)
                  MinutosPre=100;
               MinutosPre--;
               break;
            case INTRO:
               EstadoEntradaTiempo++;
               HayMensaje=MSG_SEGUNDOS;
               TicksMensaje=0;
         };
         break;
     case ENTRADASEGUNDOS:
         switch (Modo) {
            case ARRIBA:
               SegundosPre++;
               if (SegundosPre>59)
                  SegundosPre=0;
               break;
            case ABAJO:
               if (SegundosPre==0)
                  SegundosPre=60;
               SegundosPre--;
               break;
            case INTRO:
               EstadoEntradaTiempo=0;
               TiempoPredefinido = (int16)MinutosPre*(int16)60+(int16)SegundosPre;
               HayMensaje=0;
               if (!Estado && !EnPausa)
                  Tiempo=TiempoPredefinido;
               GrabaConfigEeprom();
         }
   }
//MuestraEstado();
MuestraTiempo();
}

void main()
{
   set_tris_a(0b11001000);
   setup_timer_0(RTCC_INTERNAL);setup_wdt(WDT_2304MS);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   enable_interrupts(INT_TIMER1);
   disable_interrupts (GLOBAL);
   setup_oscillator(OSC_4MHZ);

   printf(lcd_putc,"Temporizador v.1\n");
   lcd_putc("Nocturno -- 2007");
   LCD_DefineCaracter ();
   CargaConfiguracion();
   delay_ms(500);
   pitido(50);
   CARA_INFERIOR=0;
   CARA_SUPERIOR=0;
   menu();
   MuestraEstado();

   while(1){

//   pitido(50);
      restart_wdt();
      if (!SW_ARRIBA) {// sube en el menú
         pitido(20); // antirrebotes
         while (!SW_ARRIBA); // esperamos que suelte tecla
         if (EstadoEntradaTiempo)
            ConfiguraTiempo(ARRIBA);
          else {
            OpcionMenu--;
            if (!OpcionMenu)
               OpcionMenu=(3+Estado+EnPausa);
            if (OpcionMenu==3)
               HayMensaje=MUESTRACARAS;
              else
               HayMensaje=0;
            TicksMensaje=0;
            menu();
            MuestraEstado();
          }
      }

      if (!SW_ABAJO) {// baja en el menú
         pitido(20); // antirrebotes
         while (!SW_ABAJO); // esperamos que suelte tecla
         if (EstadoEntradaTiempo)
            ConfiguraTiempo(ABAJO);
          else {
            OpcionMenu++;
            if (OpcionMenu==(4+Estado+EnPausa))
               OpcionMenu=1;
            if (OpcionMenu==3)
               HayMensaje=MUESTRACARAS;
              else
               HayMensaje=0;
            TicksMensaje=0;
            menu();
            MuestraEstado();
          }
      }
      if (!SW_INTRO) {// acepta opción
         pitido(20); // antirrebotes
         while (!SW_INTRO); // esperamos que suelte tecla
         if (EstadoEntradaTiempo) {
            ConfiguraTiempo(INTRO);
           } else {
            HayMensaje=0;
            TicksMensaje=0;
            EjecutaOpcion();
           }
         menu();
         MuestraEstado();
      }

   }
}
 
Eso quiere decir que ya no hay espacio para el programa en la ROM.
Trata de optimizar el código o cambia de PIC, por ejemplo, al PIC16F648A que tiene el doble de ROM.
 
Hola a todos,
Aquí hay un proyecto de proteus y mikroC, si usted quiere construir Ultra Violeta PCB entonces necesitas contador aquí es el temporizador, usted encontrará también código fuente en mikroC.

Disfrute de su tiempo.

Gracias
Kapoh.
 

Adjuntos

  • Timer PCB UV Exposure Project Kapoh.rar
    55.1 KB · Visitas: 22
Atrás
Arriba