Problemas al grabar PIC con codigo C

Hola lo que pasa es que he tenimo un gran problema a la hora de quemar un PIC18F4520 no ha andado bien.

lo que pasa es que meti el circuito al Proteus y pues anda bien

el circuito tiene:
  • LCD 16x2
  • LM35
  • Switch

les anexo un foto de la simulacion SimProteus

y me manda unWarning k dice "[PIC18] PC=0x0480. ADC conversion clock period (4e-06 is below recommenden 1.6 us)"

y bueno no se si eso tenga que ver ya en el PIC que sea lo que lo ahga no funcionar el codigo que tengo es el siguiente

Código:
#include<18f4520.h>
#device ADC=10
#fuses HS,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT
#use delay(clock=40000000)


#include<LCD.c>
#define use_portd_lcd TRUE
int retraso=50;
int checarBomba()
{   
   if(input(PIN_B0)&& !(input(PIN_B1)))
    return 0;
   else
    return 1;   
}
void main(void)
{
   int tAn,tReal;   
   set_tris_a(0xFF);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x00);
   lcd_init();   
   output_c(0);
   setup_comparator(NC_NC_NC_NC);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports(AN0);
   lcd_putc('\f');   
   while(1)
   {
   if(checarBomba())
      {
         output_c(1);
         lcd_putc('\f');
         printf(lcd_putc,"No medible");
         delay_ms(retraso/2);
      }
      else
      {
      output_bit(PIN_C0,0);
        //--Medir
      
       tAn=read_adc();
       delay_ms(1);
       tReal=0.488*tAn;
       lcd_putc('\f');
       printf(lcd_putc,"Temperatura");
       lcd_putc('\n');
       printf(lcd_putc,"  %d °C",tReal); 
       delay_ms(retraso);
      }
   }
}

bueno lo que deberia hacer es checar un condicion que esta dado por dos Switch

solo cuando 1 este prendido y el otro apagado debe iniciar a leer la temperatura y mostrarla en el LCD de lo contrario debe decir No medible

como me falta mucha experiencia pues no se realmente a que se deba que salga en el proteus y no en el PIC

pero supongo que prodria ser por:
tiempo de la conversion, el cual mencione mas arriba
que debo declara diferente algo en la parte de #fuses
No se grabo bien

tambien esta el detalle que este progrma lo hice originalmete para un PIC16F887, y me simulaba bien en el proteus, y cuando lo quise hacer en el 18F4520 me mandaba un error en el MCLR que solucione ene el proteus conectandolo a positivo

cuando lo simulo con el 16f887 me da un warning parecido pero ese dice "[PIC16] PC=0x036A. ADC conversion clock period (5e-07) is possibly invalid for device clock frequency"

por lo poco que se de ingles supongo que si lo grabo en eese pic no serviria de nada, y yo habia emncionado a mis compañeros de equipo que compraramos el 16f887 para grabarlo hay, la ventaja que tendriamos es que lo podriasmos grabar y grabar ene el LAB de mi escuela, pero si nos quedamos con el 4520 tenemos que ir a pagar para que lo grabe alguien mas y como que no.

si alguien sabe por que pasa esto me podria ayudar me serviria de mucho, y otro caso hay alguna forma de que en el proteus se ponga la simulacion mas rigurosa, es decir, que si no me va afuncionar en el PIC simplemente no haga la simulacion, es que ya me a pasado cosas aprecidas con el PIC16f628a, que se simula bien bonito en el proteus y en la proto namas no

de antemano muchas gracias
 

Adjuntos

  • SimProteus.png
    SimProteus.png
    342.9 KB · Visitas: 45
Hola Bazookao tienes que revisar la configuración de tu adc en el datasheet dan las bases de eso y veo varios errores por omision

-> setup_adc(ADC_CLOCK_INTERNAL); esta instrucción determina la velocidad del reloj de tu adc ¿que criterio utilizo para escoger la velocidad del sullo? intenta con esta setup_adc(ADC_CLOCK_DIV_64) ya que tu velocidad de reloj es muy alta #use delay(clock=40000000)

-> no escoges el canal que vas a utilizar esto lo puedes hacer con set_adc_channel(0); antes del siclo while ()

-> Es necesario una espera de por lo menos 10us antes de comenzar la lectura de tu adc y despues de haber escogido el canal esto es necesario ya que se le tiene que dar tiempo para que el adc cargue condensadores y demás

->tu adc esta configurado a 10 bits y la variable que lo almacena es de 8 bits para esto puedes o configirar tu adc #device ADC=8 o tu variable en int16 o hacer conversion explicita tAn = (int)read_adc();

-> tReal=0.488*tAn; tReal no tiene el suficiente espacio ni el formato para esta multiplicacion tReal la declaro como entero de 8 bits.
 
Muchas gracias, me parece muy completa tu explicacion, lamentablemente no puedo hacer la prueba en el PIC de inmediato, pero cuando la haga ya comentare lo pertinente

use setup_adc(ADC_CLOCK_DIV_64) pero en el proteus me daba un warning parecido

entonces use

setup_adc(ADC_TAD_MUL_2); y ya no me dio ningun warning en el proteus, ademas las variables las cambie por float en lugar de los int

saludos
 
Última edición:
Desgraciadamente aun no sirve modifique el codigo y la grabe pero nada

Código:
#include<18f4520.h>
#device ADC=10
#fuses XT,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT
#use delay(clock=40000000)

#include<LCD.c>
#define use_portd_lcd TRUE
int retraso=50;
int checarBomba()
{
   /*
   pines
   B0 Relay Alto
   B1 Relay Bajo
   */
   if(input(PIN_B0)&& !(input(PIN_B1)))
    return 0;
   else
    return 1;   
}
void main(void)
{
   float tReal,tAn;
   set_tris_a(0xFF);
   set_tris_b(0xFF);
   set_tris_c(0x00);
   set_tris_d(0x00);
   output_c(0);
   lcd_init();  
   setup_comparator(NC_NC_NC_NC);
   delay_ms(retraso);
   setup_adc(ADC_TAD_MUL_2);
   delay_ms(retraso);
   setup_adc_ports(AN0);
   delay_ms(retraso);
   set_adc_channel(0);
   delay_ms(retraso);
   lcd_putc('\f');   
   while(1)
   {
   if(checarBomba())
      {
         output_c(1);
         lcd_putc('\f');
         printf(lcd_putc,"No medible");
         delay_ms(retraso/2);
      }
      else
      {
      output_bit(PIN_C0,0);     
      
       delay_ms(retraso);
       tAn=read_adc();
       tReal=0.488*tAn;
       lcd_putc('\f');
       printf(lcd_putc,"Temperatura");
       lcd_putc('\n');
       printf(lcd_putc,"  %3.0f °C",tReal); 
       delay_ms(retraso);
      }
   }
}


y ahora nisiquiera me muestra warning en el proteus, la version que tengo es la 7.2 SP6

¿que hago?
 
Última edición:
mira bazokao

--el primer detalle que veo en tu programa es la velocidad de tu cristal no estoy muy seguro pero si existe ese cristal con esa capacidad anotalo ahi si no te recomiendo usar un o de 20MHz
--Las variables que utilizas para guardar el valor del adc es muy pequeño si indicas que manejas una resolucion de 10 bits te recomiendo trabajar a 8
-- La funcion checar bomba esta bien estructurada pero te recomiendo esa meterla dentro del ciclo infinito y no como parte de una funcion independiente
-- despues declaras con los set_tris a,b,c,d (que no son necesarios) que tus puertos son digitales com entradas y salidas pero mas adelantes indicas que el puerto a almenos una terminal vas a utilizarla como ADC por lo que no correponde no cres
--Dentro del ciclo infinito marcas que sea evaluada con un if la funcion checar bomba pero no le dices contra que debe evaluarse.
-- Los retardos que estas manejando si tines ese cristal de 40MHz debes manejar un os retardos para lectura de ADC minimo de 100ms si el cristal disminuye puedes disminuir el tiempo tambien por eso anterior mente te mandaba el error "[PIC18] PC=0x0480. ADC conversion clock period (4e-06 is below recommenden 1.6 us)" porque microchip menciona que debe existir un tiempo minimo de lectura en canales de 100ms y tu no lo hacias

con todo esto tu programa seria mas o menos asi

PHP:
//***********Definicion de micro******************
#include<18f4520.h>
#device ADC=10
#fuses XT,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT
#use delay(clock=40000000)

#include<LCD.c>
#define use_portd_lcd TRUE
int retraso=50;
float tReal,tAn;
//***************Funcion principal**************
void main(void)
{
   lcd_init();  
   setup_adc(ADC_TAD_MUL_2);
   setup_adc_ports(AN0);
   set_adc_channel(0);
//***********Ciclo infinito**********************
 while(1)
   {
//***********Evaluacion de termianles****************
if(input(PIN_B0)&& !(input(PIN_B1)))
      {
//********si se cumple la condicion******************
         output_c(1);
         lcd_putc('\f');
         printf(lcd_putc,"No medible");
         delay_ms(retraso/2);
      }
      else
      {
//********Si no se cumple la condicion****************
       output_low(PIN_C0);     
       delay_ms(retraso);
       tAn=read_adc();
       delay_ms(100);
       tReal=0.488*tAn;
       lcd_putc('\f');
       printf(lcd_putc,"Temperatura");
       lcd_putc('\n');
       printf(lcd_putc,"  %3.0f °C",tReal); 
       delay_ms(retraso);
      }
   }
}
 
Última edición por un moderador:
Aprovecho el titulo de este post para preguntar una cosa, tiene que ver en algo el tipo de lenguaje que se usa al grabar el pic?, o sea, si yo programo en asm o C es el compilador el que se encarga de darme el .hex, no? porque he visto preguntas del tipo "tal programador graba pic en C?"

saludos
 
Efectivamente.... el compilador es el que da como resultado el .hex que se graba en el PIC, pero para programar en C usualmente se tiene que añadir un modulo al MPLAB que interpreta el lenguaje de alto nivel y lo traduce a codigo maquina...
 
MAchacándome con el ASM y veo que con C se hace en mucho menos tiempo impresionante proyectos grandes en un plis plas.

La ventaja de adaptarse muy rapidamente a los AVR.
 
mira bazokao

--el primer detalle que veo en tu programa es la velocidad de tu cristal no estoy muy seguro pero si existe ese cristal con esa capacidad anotalo ahi si no te recomiendo usar un o de 20MHz
--Las variables que utilizas para guardar el valor del adc es muy pequeño si indicas que manejas una resolucion de 10 bits te recomiendo trabajar a 8
-- La funcion checar bomba esta bien estructurada pero te recomiendo esa meterla dentro del ciclo infinito y no como parte de una funcion independiente
-- despues declaras con los set_tris a,b,c,d (que no son necesarios) que tus puertos son digitales com entradas y salidas pero mas adelantes indicas que el puerto a almenos una terminal vas a utilizarla como ADC por lo que no correponde no cres
--Dentro del ciclo infinito marcas que sea evaluada con un if la funcion checar bomba pero no le dices contra que debe evaluarse.
-- Los retardos que estas manejando si tines ese cristal de 40MHz debes manejar un os retardos para lectura de ADC minimo de 100ms si el cristal disminuye puedes disminuir el tiempo tambien por eso anterior mente te mandaba el error "[PIC18] PC=0x0480. ADC conversion clock period (4e-06 is below recommenden 1.6 us)" porque microchip menciona que debe existir un tiempo minimo de lectura en canales de 100ms y tu no lo hacias

con todo esto tu programa seria mas o menos asi

PHP:
//***********Definicion de micro******************
#include<18f4520.h>
#device ADC=10
#fuses XT,NOWDT,NOLVP,MCLR,NOPROTECT,NOPUT
#use delay(clock=40000000)

#include<LCD.c>
#define use_portd_lcd TRUE
int retraso=50;
float tReal,tAn;
//***************Funcion principal**************
void main(void)
{
   lcd_init();  
   setup_adc(ADC_TAD_MUL_2);
   setup_adc_ports(AN0);
   set_adc_channel(0);
//***********Ciclo infinito**********************
 while(1)
   {
//***********Evaluacion de termianles****************
if(input(PIN_B0)&& !(input(PIN_B1)))
      {
//********si se cumple la condicion******************
         output_c(1);
         lcd_putc('\f');
         printf(lcd_putc,"No medible");
         delay_ms(retraso/2);
      }
      else
      {
//********Si no se cumple la condicion****************
       output_low(PIN_C0);     
       delay_ms(retraso);
       tAn=read_adc();
       delay_ms(100);
       tReal=0.488*tAn;
       lcd_putc('\f');
       printf(lcd_putc,"Temperatura");
       lcd_putc('\n');
       printf(lcd_putc,"  %3.0f °C",tReal); 
       delay_ms(retraso);
      }
   }
}

Muchas gracias, algo que no mencione por que pues no sabia muy bien es que quiero usar el oscilador interno del PIC ya cambie el XT por el INTRC_IO, que segun es para el oscilador interno

y segun yo con esta instruccion es para trabajarlo

Código:
   setup_oscillator(OSC_4MHZ|OSC_INTRC);

y conesta otra
Código:
setup_adc(ADC_CLOCK_INTERNAL|VSS_VDD);
para que el ADC trabaje con el oscilador interno

y bla bla bla... jiji bueno mi proyecto se entrega mañana y no he podido grabar el PIC bien unsa sola vez.. deseenme buena suerte chicos y chicas del foro

ya els cuento como me va


PD: si ya vi algunos videos en youtube, estan buenos nos vemos
 
Atrás
Arriba