Autor Tema: como copilar programa para 18f4550  (Leído 1799 veces)

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

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
como copilar programa para 18f4550
« en: 06 de Diciembre de 2014, 02:09:49 »
ola amigos ando checando este codigo lo que sucede es que no se con que copilador convertirlo a .hex para pasalo al pic ya intente con mplab csc y si lo copila sin problemas pero a la hora de simularlo no hace nada y al grabarlo en el pic lo graba peo no funciona!!! podrian ayudarme para saber en que copilador lo trabajo que funcione>?' '


-----------------------------------------------------------------------------------------------------------------------------------------------
#include <18f4550.h>       //PIC A USAR
#device adc=8              //Usa resolución de 8 bits
#include <math.h>          //PARA OPERACIONES MATEMATICAS
#use delay(clock=4800000)     //CRISTAL A UTILIZAR
#include <LCD.c>           //CONTROLADOR DEL LCD
#fuses INTRC, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOPROTECT,HSPLL
12sw1sdw1svoid main(){

// VARIABLES A USAR
int8 temp1;
float temp;

   output_low(pin_b0);
   lcd_init();
   lcd_gotoxy(6,1);                    //INICIALIZA EL LCD
   lcd_putc("CONTROL");                //IMPRIME EN PANTALLA
   lcd_gotoxy(5,2);                    //COLOCA EL CURSOR EN COLUMNA 7 FILA 2
   lcd_putc("ON -- OFF");              //IMPRIME EN PANTALLA
   delay_ms(5000);                     //ESPERA 5 SEGUNDOS
   lcd_putc("\f");                     //LIMPIA PANTALLA

while(true){
      setup_adc(ADC_CLOCK_INTERNAL);
      Setup_adc_ports(AN0);            //PONE PUERTO RA0 ANALOGO
      set_adc_channel(0);              // INDICA EL PIN A LEER RA0
      delay_us(20);       
      temp1=read_adc();                     //LEE EL VALOR DEL PIN
      temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
      lcd_gotoxy(3,1);                      //COLOCA EL CURSOR EN COLUMNA 1 FILA 1
      lcd_putc("TEMP. ACTUAL");    //IMPRIME EN PANTALLA                                       
      lcd_gotoxy(3,2);                      //COLOCA EL CURSOR EN COLUMNA 4 FILA 2
      printf(lcd_putc," T= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
      delay_ms (1);

   if(temp>=40){
      output_high(pin_b0);            //Si la temperatura es mayor o igual a 40ºC RB1 = 1         
      }
   else{
   if(temp<=25){
      output_low(pin_b0);             //Si la temperatura es menor o igual a 25°C RB0 = 0
      }
   }
  }
}
---------------------------------------------------------------------------------------------------------------------------------

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como copilar programa para 18f4550
« Respuesta #1 en: 06 de Diciembre de 2014, 11:58:30 »
Citar
12sw1sdw1svoid main(){

Ese agregado ahi no es como no da error

Código: [Seleccionar]
      setup_adc(ADC_CLOCK_INTERNAL);
      Setup_adc_ports(AN0);            //PONE PUERTO RA0 ANALOGO
      set_adc_channel(0);              // INDICA EL PIN A LEER RA0

Eso deberia ir fuera del while, ya que es una configuracion y lo haces una sola ves.

Citar
temp=(temp1*0.01960784314*100);
No se como lo tomara el compilador a esa multiplicacion es decir si va a hacer 2 multiplicaciones o una sola pero por las dudas yo pondria el resultado ya multiplicado xD * 1.96
Tambien no so como tomara que estes multiplicando un int contra un float. Esas cosas de C todavia me superan, pero nada que o puedas evitar poniendo temp1 como float y probar.

Citar
#fuses INTRC, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOPROTECT,HSPLL

O es uno o es otro, INTRC es el reloj interno que no pasa por el PLL, mientras que HSPLL es para un cristal externo mayor a 4Mhz y utilizando el PLL, hay que tener consideracion que valores pones por que el PLL necesita de una frecuencia de 4Mhz de entrada, por eso mismo si tenes un cristal de 4Mhz tendrias que poner #FUSES PLL1

Otra de las cosas que para que funcione el LCD, es que tenes que definir los puertos antes del include, algo asi

Citar
#define LCD_RS_PIN PIN_C0
#define LCD_RW_PIN PIN_C1
#define LCD_ENABLE_PIN PIN_C2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7

Creo que no se me ocurre otra... Si con esto no funciona entonces alguno tendra que venir a socorrerte xD

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
Re: como copilar programa para 18f4550
« Respuesta #2 en: 06 de Diciembre de 2014, 17:36:21 »
mira o que sucede que el codigo yo ya lo tengo copilado en .hex y funciona a la perfeccion pero al momento que yo lo abro en mplab y quiero modificar el texto que muestra en el display (en el codigo) y lo vuelvo a copilar con csc copiles de mplab lo copila y no da problemas pero paso el archivo al pic y ya no hace nada supongo q es el copilador !!! o no se por q lo unico que cambio es el texto enlugar de q muestre on --- off quier q mestre otra cosa y lo cambio  copilo y ya no funciona!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como copilar programa para 18f4550
« Respuesta #3 en: 06 de Diciembre de 2014, 19:20:01 »
Separemos un poco las cosas que ya me confundi

Compilar:
Seria generar el .hex,
Esto va a compilar siempre y cuando este bien escrito y o tengas ninguna falla de sintaxis

Simularlo:
Lo podes simular en MPLAB o muchos usan proteus
Si tu programa esta bien seguro que va a andar. Ya que generalmente estas simulaciones no exigen o se restringen de acuerdo a sus fuses


En el PIC:
Cuando lo pasas al PIC involucra todo, que este bien el programa (configuracion de puertos,etc) y los fuses.


Asi que... resumiendo... compilar va a compilar, si simulas y anda pero en el PIC NO anda, es mas que seguro que son los fuses o alguna configuracion del puerto. O el PIC esta quemado. La mayoria de los ejemplos con esa libreria lo hacen igual y no tienen ningun problema y le escriben cualquier cosa dentro del printf(), debe ser otra cosa.

Hay varios errores de programacion en el programa que pasaste. No veo que esten definidos los pines tal como lo especifica el archivo lcd.c (aunque creo que por default te los pone en el puertob) , tenes mal un fuse ni siquiera se que estas usando si el reloj interno o un cristal externo. El main tiene cualquier cosa escrita atras pero supongo que sera un error cuando copiaste y pegaste.
Con todo eso no me extrañaria que no ande en el PIC.

De probar cosas, podrias quitar toda la seccion del ADC ( comentarla ) y probar solo el LCD.
Siempre cuando tengas un problema intenta aislarlo, es decir sacar las posibles otras causas que lo causen. Y asi ir determinando que lo que es.
No te desesperes la programacion es asi, 3 dias buscando por que anda mal y era algo super simple, pero te tomo 3 dias  :5]
« Última modificación: 06 de Diciembre de 2014, 19:34:47 por KILLERJC »

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
Re: como copilar programa para 18f4550
« Respuesta #4 en: 07 de Diciembre de 2014, 21:01:18 »
explicare de new el codigo que puse anteriormente (lo pongo abajo) ya esta generado (.hex) y probado en fisico en el pic, tambien tengo el codigo en programa.c y esta simulado en proteus con el pic y el display... ya funciona super bien el problema es que yo quiero cambiar el texto que aparece en el display lo que dice "CONTROL ON -- OFF", abro mi archivo llamado programa.c con mplab y edito solo esas palabras guardo y compilo nuevamente y no marca ningun error ni nada al compilar, ya que se compilo abro el archivo en proteus y no hace nada solo se queda el display sin letras siendo que lo unico que se cambio al codigo fue el texto!!!  es por eso que no entiendo que es lo que sucede pordrias hacerme el favor de compularlo y ver si a ti te funciona ?? te dejo el archivo simulado en proteus y el codigo!!

-----------------------------------------------------------------------------------------------------------
#include <18f4550.h>       //PIC A USAR
#device adc=8              //Usa resolución de 8 bits
#include <math.h>          //PARA OPERACIONES MATEMATICAS
#use delay(clock=4800000)     //CRISTAL A UTILIZAR
#include <LCD.c>           //CONTROLADOR DEL LCD
#fuses INTRC, NOWDT, NOPUT, NOMCLR, NOBROWNOUT, NOLVP, NOCPD, NOPROTECT,HSPLL

void main(){

// VARIABLES A USAR
int8 temp1;
float temp;

   output_low(pin_b0);
   lcd_init();
   lcd_gotoxy(6,1);                    //INICIALIZA EL LCD
   lcd_putc("CONTROL");                //IMPRIME EN PANTALLA
   lcd_gotoxy(5,2);                    //COLOCA EL CURSOR EN COLUMNA 7 FILA 2
   lcd_putc("ON -- OFF");              //IMPRIME EN PANTALLA
   delay_ms(5000);                     //ESPERA 5 SEGUNDOS
   lcd_putc("\f");                     //LIMPIA PANTALLA

while(true){
      setup_adc(ADC_CLOCK_INTERNAL);
      Setup_adc_ports(AN0);            //PONE PUERTO RA0 ANALOGO
      set_adc_channel(0);              // INDICA EL PIN A LEER RA0
      delay_us(20);       
      temp1=read_adc();                     //LEE EL VALOR DEL PIN
      temp=(temp1*0.01960784314*100);       //CONVIERTE EL VALOR LEIDO DE HEXA AL REAL el numero 0.01960784314 viene de dividir (5/255) y el resultado se multiplica por 100 para alcanzar 150 grados
      lcd_gotoxy(3,1);                      //COLOCA EL CURSOR EN COLUMNA 1 FILA 1
      lcd_putc("TEMP. ACTUAL");    //IMPRIME EN PANTALLA                                       
      lcd_gotoxy(3,2);                      //COLOCA EL CURSOR EN COLUMNA 4 FILA 2
      printf(lcd_putc," T= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA
      delay_ms (1);

   if(temp>=40){
      output_high(pin_b0);            //Si la temperatura es mayor o igual a 40ºC RB1 = 1         
      }
   else{
   if(temp<=25){
      output_low(pin_b0);             //Si la temperatura es menor o igual a 25°C RB0 = 0
      }
   }
  }
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como copilar programa para 18f4550
« Respuesta #5 en: 07 de Diciembre de 2014, 23:53:46 »
   lcd_putc("CONTROL");                //IMPRIME EN PANTALLA
   lcd_putc("ON -- OFF");              //IMPRIME EN PANTALLA
   lcd_putc("\f");                     //LIMPIA PANTALLA
   lcd_putc("TEMP. ACTUAL");    //IMPRIME EN PANTALLA

   printf(lcd_putc," T= %2.2f C",temp);  //MUESTRA EN EL LCD EL VALOR DE TEMPERATURA

Aunque no deberia podrias ponerlo como abajo y probar. Ya si no funciona asi no se que decirte (a mi me sigue haciendo tuido tus fuses aunque vos no lo quieras ver), a lo que me refiero  es ponerlos asi:

  printf(lcd_putc,"CONTROL");
  printf(lcd_putc,"ON -- OFF");
  printf(lcd_putc,"\f");

a lo sumo es un problema con el lcd_put, no lo se. Para hacerlo facil Reemplaza lcd_putc( por printf(lcd_putc, sino puede ser el compilador.
No puedo probarlo por que no poseo CCS ni tampoco el proteus :/

Desconectado echolovay

  • PIC10
  • *
  • Mensajes: 7
Re: como copilar programa para 18f4550
« Respuesta #6 en: 08 de Diciembre de 2014, 02:49:54 »
he intentado lo que me sugieres amigo pero no hay manera simplemente no funciona el display el programa al parecer si pero el display noo!! y digo q el programa si por que tengo programado que se active un led pasando de una temperatura y se apague cuando llegue a otra y eso si se respeta aunq el display no muestra nada!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: como copilar programa para 18f4550
« Respuesta #7 en: 08 de Diciembre de 2014, 11:19:36 »
Bueno, por ultimo y pro que ya no cuesta probar, agregalo un par de delay_ms(100); Luego de cada instruccion al LCD

Código: [Seleccionar]
   lcd_init();
   lcd_gotoxy(6,1);                    //INICIALIZA EL LCD
   delay_ms(100);
   lcd_putc("CONTROL");                //IMPRIME EN PANTALLA
   delay_ms(100);
   lcd_gotoxy(5,2);                    //COLOCA EL CURSOR EN COLUMNA 7 FILA 2
   delay_ms(100);
   lcd_putc("ON -- OFF");              //IMPRIME EN PANTALLA
   delay_ms(5000);                     //ESPERA 5 SEGUNDOS
   lcd_putc("\f");                     //LIMPIA PANTALLA
   delay_ms(100);

Y eliminar problemas de demoras, sino funciona esto busca otra version del CCS o esperar que alguno que sepa mas responda, pero creo haber cubierto cualquier topic.
Si no tendrias que debuggear tu programa en el fisico para saber cual es el problema.


 

anything