Fuente con cronometro

#1
estoy armando esta fuente con cronometro con pic 16f883 lcd 4x16 funciona pero se tilda por momentos y se vuelve la cuenta lenta, subo el código en c
Código:
#include <16f883.h>
#device ADC=10
#use delay (internal = 8MHz)
#define use_portb_lcd true
 #fuses NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT,
#include <lcd420.c>

 #include <Button.c>

#define  pulsador pin_c3
int8  horas=0,minutos=0,segundos=0,milisegundos=0;

#INT_TIMER1
void sid_Timer1 (void)
{
   set_timer1(0xD8F0);        // Recargar el Timer 1 para 10ms. @ 4MHz.
   
   if(++milisegundos > 99)    // Incrementar "milisegundos" y Si "milisegundos" es mayor a 59...
   {
      milisegundos = 0;       // Entonces limpiar "milisegundos"
      
      if(++segundos > 59)     // Incrementar "segundos" y si "segundos" es mayor a 59...
      {
         segundos = 0;        // Entonces limpiar "segundos"
      
         if(++minutos > 59)   // Incrementar "minutos" y si "minutos" es mayor a 59...
         {
            minutos = 0;      // Limpiar "minutos"

            if(++horas > 11)  // Incrementar "horas" y si "horas" es mayor a 11...
            {
               horas = 0;     // Limpiar "horas", "minutos" y "segundos"
               minutos = 0;
               segundos = 0;
            }
         }
      }
   }
}

void main(){
long int var1=0, var2=0;
 float valor,volt,valor2,amper;


    int1 flag = 0;
   int8 B0 = 0;
   int16 contador = 0;

   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);   
      
     
 setup_adc_ports(sAN0|sAN3);
 setup_adc(ADC_CLOCK_INTERNAL );

 
//Se inicia la LCD
   lcd_init();
   lcd_gotoxy(2,1);
   lcd_putc("Cargando datos");
   delay_ms(1000);
   lcd_gotoxy(7,2);
   lcd_putc("LPK");
   

   delay_ms(500);
   lcd_putc("\\f");
   lcd_gotoxy(2,1);
   lcd_putc("Volt     Amper");
      delay_ms(1000);

 while (true)
   {
   
   
 set_adc_channel(0);  
   delay_us(20);
  volt=0;
  for(var1=0;var1<500;var1++)
  {
    volt=volt+ read_adc();
    delay_us(62);  
  }
 
  valor = volt / 500;

  valor = valor * 50 / 1023;

  lcd_gotoxy(2,2);
  printf(lcd_putc,"%4.1f",valor);

  
   
   set_adc_channel(3); 
    delay_us(20);   
   amper=0;
  for(var2=0;var2<500;var2++)
  {
    amper=amper+ read_adc();
    delay_us(62);  
  }

  valor2 = amper / 500;
  valor2 = valor2 * 19 / 1023;

  lcd_gotoxy(11,2);
  printf(lcd_putc,"%4.1f",valor2);
   
   
  
      if (button(pulsador,0,255,10,B0,1)) // Si se presiona el pulsador...
      {
         while(!input(pulsador))          // Mientras esté pulsado...
         {
            ++contador;                   // Incrementar "contador"
            delay_ms(1);                  // Retardo de 1ms.
            
            if(contador == 3000)          // Si "contador" llegó a 3000 (3 segundos)...
            {            
               setup_timer_1(T1_DISABLED);  // Deshabilitar Timer1
               horas = 0;                 // Limpiar "horas"
               minutos = 0;               // Limpiar "minutos"
               segundos = 0;              // Limpiar "segundos"
               milisegundos = 0;          // Limpiar "milisegundos"
               flag = 1;                  // Mantener "flag" en 1 (Para que el soltar el pulsador no avance el conteo)
               lcd_gotoxy(1,4);
               lcd_putc("00:00:00:00");   // Poner en ceros la pantalla.
            }
         }
         
         contador = 0;                    // Limpiar "contador"
         
         if(!flag)                        // Si "flag" = 0...
         {
            flag = 1;                     // Poner "flag" en 1 y
            setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);   // Timer1 con sincronización interna y prescaler 1:1
            set_timer1(0xD8F0);           // Cargar el Timer 1 para 10ms. @ 4MHz.
         }
         else if(flag)                    // Pero si "flag" = 1...
         {
            flag = 0;                     // Poner "flag" en 0 y
            setup_timer_1(T1_DISABLED);   // Deshabilitar Timer1
         }
      }
      // Mostrar el tiempo en pantalla.
      lcd_gotoxy(1,4);
      printf(lcd_putc,"%02u:%02u:%02u:%02u",horas,minutos,segundos,milisegundos);
   }
}
...
 
#3
primero que nada, cuando una fuente tiene algún visualizador (tester, voltimetro, amperimetro, reloj) este debe ser, preferentemente) alimentado individualmente al circuito principal de dicha fuente, ya que si hay corto circuito o algun otro inconveniente esta no se vea afectada.

Si deseas un reloj preciso, te recomiendo el integrado DS1307 o iguales, ya que utilizan una fuente de energía externa (independientemente del microcontrolador y la circuiteria) y esto hace que el reloj vaya a tiempo incluso si se des-energiza la fuente o el microcontrolador.

Si deseas hacer hacer un voltimetro y amperimetro, pues es más sencillo que el reloj.
 
#4
si voy a usar el ds1307 creo que iría mejor, ahora estoy viendo como generar una frecuencia y mostrarla en el lcd como duty%, sin usar ningún integrado tomaría la señal del amperímetro y tendría que hacer algún calculo y mostrarlo voy a ver que puedo hacer
 
#7
Hola callecuatro1976, deberías de ser algo mas preciso en la duda que tienes... Por el momento lo que entendí del código que subiste es que quieres variar el ancho de pulso de la salida pwm(para el caso la salida pwm1) y mostrarlo el ciclo de servicio en el LCD, si lo entendí correctamente esto puede ayudarte y con algunas modificaciones quizá se ajuste a lo que tienes en mente.
Código:
/*****************************************************************************/
#include <16f883.h>
/*****************************************************************************/
#device  ADC=10
/*****************************************************************************/
#fuses   NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
/*****************************************************************************/
#use     delay (internal=8MHz)
/*****************************************************************************/
#define  use_portb_lcd true
#include <lcd.c>
/*****************************************************************************/
#use     pwm(ccp1,timer=2,frequency=500,duty=1)
/*****************************************************************************/
void pulsadores()
{
   static unsigned int8 bandera0=1;
   static unsigned int8 bandera1=1;
   static unsigned int16 duty;
   if((input(pin_a0)==0)&&(bandera0==1))
   {
      bandera0=0;
   }
   if((input(pin_a0)==1)&&(bandera0==0))
   {
      bandera0=1;
      if(duty<1000)
      {
         duty=duty+100;
      }
      pwm_set_duty_percent(duty);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%02Lu",duty/100);
   }
   
   if((input(pin_a1)==0)&&(bandera1==1))
   {
      bandera1=0;
   }
   if((input(pin_a1)==1)&&(bandera1==0))
   {
      bandera1=1;
      if(duty>0)
      {
         duty=duty-100;
      }
      pwm_set_duty_percent(duty);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%02Lu",duty/100);
   }
}
void main(void)
{
//!/******************************************************************************
//!Configuracion de conversor analogico a digital
//!******************************************************************************/
//!   setup_adc(ADC_CLOCK_INTERNAL);//oscilador RC interno para el adc
//!   setup_adc_ports(sAN0,VSS_VDD);//canal 0 del adc habilitado, vref de 0 a vcc 
//!   set_adc_channel(0);           //selecciona el canal 0
//!/*****************************************************************************/
   lcd_init();             
   lcd_putc("Volt     Amper\n");
   lcd_putc("00");
/*****************************************************************************/
   while(true)
   {
      pulsadores();
      delay_ms(10);
   }
}
Dibujo.PNG
 

Adjuntos

#8
si muy bueno quería hacer algo asi tengo unas dudas cuando lo compilo me da 3 errores,
error 101 "fuente.c" line 13(5,48): library not found "pwm"
error 12 "fuente.c" line 31(27,28):undefined indentifier --pwm_set_duty_percent
error 12 "fuente.c" line 47(27,28):undefined indentifier --pwm_set_duty_percent

porque me marca ese error
 

Fogonazo

Exorcista & Moderador eventual
#9
El error "101"te indica que el compilador no encuentra la librería PWM
Los otros 2 errores son referencias a esa librería.

Revisa la ubicación del archivo correspondiente a la librería.
 
#10
Hola, ya que el problema es exclusivamente sobre el PWM puedo asumir que es por la version de CCS que tienes (#use pwm(ccp1,timer=2,frequency=500,duty=1)) es una prestación que el compilador tiene a partir de su version 4.6 (al meno eso tengo entendido). Yo hice la compilación la version 5 de CCS.
Mas tarde tratare de subir un código mas compatible con tu compilador.

--Editado--

Hola callecuatro1976, esto debería solucionar el problema del error al momento de compilar.
PHP:
/*****************************************************************************/
#include <16f883.h>
/*****************************************************************************/
#fuses   NOFCMEN, NOIESO,INTRC_IO,NOWDT,NOLVP,MCLR,NOPROTECT
/*****************************************************************************/
#use     delay (internal=8MHz)
/*****************************************************************************/
#define  use_portb_lcd true
#include <lcd.c>
/*****************************************************************************/
void pulsadores()
{
   static unsigned int8 bandera0=1;
   static unsigned int8 bandera1=1;
   static unsigned int8 duty;
   unsigned int16       carga;
   if((input(pin_a0)==0)&&(bandera0==1))
   {
      bandera0=0;
   }
   if((input(pin_a0)==1)&&(bandera0==0))
   {
      bandera0=1;
      if(duty<100)
      {
         duty=duty+10;
      }
      carga=(unsigned int16)duty*5;                    //(4*(124+1)/100);
      set_pwm1_duty(carga);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%02u",duty/10);
   }
   
   if((input(pin_a1)==0)&&(bandera1==1))
   {
      bandera1=0;
   }
   if((input(pin_a1)==1)&&(bandera1==0))
   {
      bandera1=1;
      if(duty>0)
      {
         duty=duty-10;
      }
      carga=(unsigned int16)duty*5;                       //(4*(124+1)/100);
      set_pwm1_duty(carga);
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%02u",duty/10);
   }
}
void main(void)
{
/*****************************************************************************/
   lcd_init();             
   lcd_putc("Volt     Amper\n");
   lcd_putc("00");
/*****************************************************************************/
   set_timer2(0);
   setup_timer_2(T2_DIV_BY_16,124,1);//periodo PWM=1ms
   set_pwm1_duty(0);                 
   setup_ccp1(CCP_PWM);
/*****************************************************************************/
   while(true)
   {
      pulsadores();
      delay_ms(10);
   }
}
 
Última edición por un moderador:
#11
si funciona!!! yo tengo la versión 4.140 tengo que comprar la ultima pero como estoy aprendiendo y me cuesta bastante todavía no quiero invertir en el programa ya que lo uso de modo jobista, gracias por el tiempo que dedicaron en resolver mi pregunta , saludos
 
#13
hola callecuatro1976, viendo el esquema que adjuntas puedo comentarte que existe un problema conceptual sobre una salida pwm y una analógica. Para que tu circuito regulador de voltaje funcione correctamente necesita a su entrada una señal analógica y no una pwm, para solucionar ese problema puedes buscar información sobre DAC con PWM y también regulador de voltaje con amp op
 
#14
Si entendí lo que pusiste, estuve leyendo y sería algo así lo que tengo que hacer.

¿Ahora, cómo puedo refinar más la muestra del lcd para que sea más real con el voltaje, o conviene tomar la medición de otra manera?
 

Adjuntos

Última edición por un moderador:
#15
Es mas conveniente que el adc lea el voltaje de salida y ese sea el mostrado en el LCD. Ten en cuenta que el ADC del pic tiene como entrada máxima de 5v y la impedancia de salida del circuito a medir sea menor de 10K[ohm] (eso según la recomendación de la hoja de datos).
 
#16
Hola estuve probando y quedo casi como quiero, lo único no puedo hacer subir el voltaje cuando dejo apretado el pulsador, como puedo cambiar eso?

Estoy probando poner un mosfet en ves del transistor es posible como esta armado el circuito? :unsure:

Te subo el esquema ...(y)
 

Adjuntos

Temas similares

Arriba