Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/09/2015 #1

Avatar de callecuatro1976

Fuente con cronometro
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);
   }
}
...
30/09/2015 #2

Avatar de andreslozano97

Usas varios if prueba usando switch case es útil y así mejoras los recursos de tu código...

Saludos,
01/10/2015 #3

Avatar de ruben90

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.
05/10/2015 #4

Avatar de callecuatro1976

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
05/10/2015 #5

Avatar de ruben90

Pues con el pic solucionas lo del reloj, voltimetro y pwm, seria cuestion del codigo, suerte
13/10/2015 #6

Avatar de callecuatro1976

estoy cambiando un poco la idea y quiero hacer la fuente con pulsadores y no se como seguir
Archivos Adjuntos
Tipo de Archivo: rar fuente pulsador.rar (54,4 KB (Kilobytes), 8 visitas)
13/10/2015 #7

Avatar de Saint_

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);
   }
}
Imágenes Adjuntas
Tipo de Archivo: png Dibujo.PNG (27,7 KB (Kilobytes), 106 visitas)
Archivos Adjuntos
Tipo de Archivo: rar fuente.rar (65,6 KB (Kilobytes), 4 visitas)
14/10/2015 #8

Avatar de callecuatro1976

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
14/10/2015 #9
Moderador general

Avatar de Fogonazo

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.
14/10/2015 #10

Avatar de Saint_

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.
Código 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);
   }

14/10/2015 #11

Avatar de callecuatro1976

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
16/10/2015 #12

Avatar de callecuatro1976

Estoy haciendo estas modificaciones.
¿Se podrán mostrar los voltios en forma decimal y cómo estabilizar la salida del transistor?
Archivos Adjuntos
Tipo de Archivo: rar fuente pulsador.rar (61,6 KB (Kilobytes), 5 visitas)
16/10/2015 #13

Avatar de Saint_

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
16/10/2015 #14

Avatar de callecuatro1976

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?
Archivos Adjuntos
Tipo de Archivo: rar 16f883.rar (16,3 KB (Kilobytes), 3 visitas)
17/10/2015 #15

Avatar de Saint_

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).
19/10/2015 #16

Avatar de callecuatro1976

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?

Te subo el esquema ...
Archivos Adjuntos
Tipo de Archivo: rar fuente pulsador.rar (67,0 KB (Kilobytes), 8 visitas)
05/11/2015 #17

Avatar de callecuatro1976

esta es la fuente que estoy tratando de copiar y no logro hacer subir y bajar la tensión correctamente y esta tiene mosfet en ver de transistor, como controlo el mosfet como una fuente con el pic?
Imágenes Adjuntas
Tipo de Archivo: jpg 11391764_948115908572192_4911070773403353147_n.jpg (196,1 KB (Kilobytes), 17 visitas)
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.