Autor Tema: LCD para 16F876  (Leído 4208 veces)

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

Desconectado efrenpal

  • PIC10
  • *
  • Mensajes: 9
LCD para 16F876
« en: 14 de Octubre de 2004, 18:29:00 »

Hola a tod@s.

Tengo un programa el cual esta funcionando en el que visualizo los datos en un PC a través de una comunicación serie asíncrona. Hasta ahí me va todo bien, osea, el circuito está funcionando y hace lo que pretendo hasta ahora.

El problema surge cuando quiero visualizar esos datos en una LCD (es la primera vez que lo intento...). La LCD tiene acoplado el Driver HD44780. El programa es el siguiente:

#include "16F876.h"         
#device PIC16f876 ADC=10

#use delay (clock=4000000)      
#include <LCD.c>
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP,NOPROTECT,NOCPD,NOWRT

#byte PORTA=0x05
#byte PORTB=0X06
#byte PORTC=0x07


static int cont=0;
long int pto=0,pulse=0;

main()   
         
{


set_tris_A(0b001010);                                                            
set_tris_B(0b11000000);

enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

setup_adc_ports(A_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
SET_ADC_CHANNEL(1);

lcd_init();                                
lcd_gotoxy(1,1);                            
lcd_putc("r.p.m.:";  



INICIO:

portb=(0b00000001);
pulse=0;cont=0;pto=0;

                   
set_timer1(3036);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);


while(cont<10)                            
    {
    output_low(PIN_B1);
    while((pto<160)&&(cont<10))
    {delay_us(5);
     pto=read_adc();
        }
   
     output_high(PIN_B1);
   
     while((pto>=155)&&(cont<10))
    {
     delay_us(5);
     pto=read_adc();
    }
    pulse++;
   }

pulse--;

pulse=pulse*12;

lcd_gotoxy(1,2);                          
printf(lcd_putc,"%ld",pulse);

setup_timer_1(T1_DISABLED);


goto inicio;

}



#INT_TIMER1

interrupcion_timer1()

{

setup_timer_1(T1_DISABLED);
cont++;

set_timer1(3036);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

}

..........................................................................................................

Quiero aclarar que el mismo, quitando todo lo referente a la LCD me compila y funciona perfectamente. En este me da el siguiente error:

Error[23]   16f876.h 2 : Can"t change device type this far into the code  
Halting build on first failure as requested.


Alguien me puede decir que es lo que hago mal?

Gracias.






Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: LCD para 16F876
« Respuesta #1 en: 14 de Octubre de 2004, 19:20:00 »
A ver...
cambia a:
#device ADC=10
No se de donde sacastes que había que poner lo de 16F876...

y añade esto a continuación:
#define use_portb_lcd true

Esto último no se si es correcto... Pero así compila, luego supongo que sí. Creo que es como lo hacía Pocher, que modificó ese archivo para el LCD. Creo que era eso lo que hacía. Si no es así a ver si el te guía en eso.

Luego tiene algunos fallos más el programa, pero eso ya te toca a tí... Si te sirve de ayuda, en el archivo 16F876.h viene como configurar los AD, las opciones que tienes, entre otras cosas... Bueno, a no ser que lo hayas modificado... ya que pones #include "16F876.h" para que busque antes en el directorio donde se encuentra el .c

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: LCD para 16F876
« Respuesta #2 en: 15 de Octubre de 2004, 00:35:00 »
Je, je hola Cuca, a que fastidia escribir en un sitio y que otros respondan al mismo tema en otro sitio ... a mí también me paso.

Efrenpal pón un aviso en el otro tema diciendo que se sigue en el subforo de C, de lo contrario habrá alguién que todavía conteste allí.

Efrenpal el error que te sale:

Error[23] 16f876.h 2 : Can"t change device type this far into the code

se soluciona haciendo lo que ya te comentamos los tres (Cuca, Oshow y yo mismo). Debe dar error, supongo,  porque el tipo de PIC ya lo tienes definido en el include y si lo pones en el device se vuelve a repetir. Quizá sea porque estes usando una versión antigua del compilador (han cambiado algunas cosas respecto de versiones "antiguas" a las nuevas)

A parte de los errores que te ha corregido Oshow, había otro error en setup_adc_ports(A_ANALOG_RA3_REF)

Procura depurar estos errores antes de enviar el código y más si como comentabas a tí te compilaba bien.

Un saludo

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: LCD para 16F876
« Respuesta #3 en: 15 de Octubre de 2004, 04:57:00 »
Vaya lio que nos hemos hecho todos con este mensaje, pero bueno, seguimos por aquí y aquí no ha pasado nada.

De acuerdo con Pocher y Cucaracha, si pones el archvio cabecera "16f876.h" (que ya incluye el #device 16f876) no puedes volver a ponerlo en la segunda linea, #device 16f876 ADC=10, tendrás que decir solo #adc=10 en la segunda linea.

También  Pocher tiene razón en cuanto a lo de las versiones antiguas, el código que te puse en el otro hilo, compila perfectamente con una versión antigua (3.187) y si quieres compilarlo con una moderna (3.206) tienes que modificar la linea
setup_adc_ports(A_ANALOG_RA3_REF) por la siguiente: setup_adc_ports(ANALOG_RA3_REF) para que pueda compilar perfectamente.

Y creo que no hay más errores, pero bueno ya nos contarás de su funcionamiento...aun así, si sigues sin poder compilarlo, puedes volver a pegar el código por aquí.

En cuanto a lo que me preguntabas del goto, pues bien, el lenguaje C es un lenguaje secuencial, es decir las sentencias se ejecutan secuencialmente, desde la primera hasta la ultima o dicho de otra forma de "arriba a abajo", y el salto hacia una parte de codigo se debe realizar mendiante funciones, bucles o cualquier otro tipo de sentencias pero no la sentencia goto, (los profesores suelen ser muy estrictos con esto, uno que tuve yo amenazaba con suspender la asignatura si veia algun goto en el examen). Lo que argumentan para no usarlo es que si pones varios "saltos" en el codigo, se pierde el hilo dle programa, es más dificil de entender y la norma fundamental es "Un programa debe ser claro, estar bien organizado y que sea fácil de leer y entender. " y la sentencia goto lía los programas y los hace ilegibles.

Mira este enlace, recalca lo importante que son estas cosas en C, el uso de goto, indentaciones y modularizacion de código, muy importante, (tambien los profesores suelen ser muy pesados con esto...) echale un vistazo si tienes tiempo:

http://polaris.lcc.uma.es/docencia/ITInd/finformatica/normasC.html

Un saludo.

PD:Este tema continua el de este hilo: http://miarroba.com/foros/ver.php?foroid=6510&temaid=2694986

Desconectado efrenpal

  • PIC10
  • *
  • Mensajes: 9
RE: LCD para 16F876
« Respuesta #4 en: 15 de Octubre de 2004, 10:50:00 »

Hola.

He cambiado lo que los 3 me decis, osea:

#device PIC16f876 ADC=10    por   #device ADC=10
y me sigue dando el mismo error:

Error[23]   16f876.h 2 : Can"t change device type this far into the code  
Halting build on first failure as requested.

Tambien he probado con  #define use_portb_lcd true    y lo mismo.

De todas formas no creo que eso tenga importancia porque el siguiente programa (osea, el mismo pero con la comunicacion serie asincrona) me compila bien y funciona perfectamente:

#include "16F876.h"         
#device PIC16f876 ADC=10

#use delay (clock=4000000)   
#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,bits=8)
#fuses HS,NOWDT,PUT,BROWNOUT,NOLVP,NOPROTECT,NOCPD,NOWRT

#byte PORTA=0x05
#byte PORTB=0X06
#byte PORTC=0x07


static int cont=0;
long int pto=0,pulse=0;

main()   
         
{


set_tris_A(0b001010);                                                          
set_tris_B(0b11000000);

enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

setup_adc_ports(A_ANALOG_RA3_REF);
setup_adc(ADC_CLOCK_INTERNAL);
SET_ADC_CHANNEL(1);



INICIO:

portb=(0b00000001);
pulse=0;cont=0;pto=0;

                   
set_timer1(3036);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);


while(cont<10)                            
    {
    output_low(PIN_B1);
    while((pto<160)&&(cont<10))
    {delay_us(5);
     pto=read_adc();
        }
   
     output_high(PIN_B1);
   
     while((pto>=155)&&(cont<10))
    {
     delay_us(5);
     pto=read_adc();
    }
    pulse++;
   }

pulse--;

pulse=pulse*12;

printf("
r.p.m.=%ld",pulse);

setup_timer_1(T1_DISABLED);


goto inicio;

}



#INT_TIMER1

interrupcion_timer1()

{

setup_timer_1(T1_DISABLED);
cont++;

set_timer1(3036);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);

}


..........................................................................................................


En cuanto a lo de los GOTO ,oshow, ya lo se que tienes razon, tuve un profesor al que no le parecio muy bien que los pusiera.
Supongo que has estudiado industriales en Gijon.





               
   

     



Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: LCD para 16F876
« Respuesta #5 en: 15 de Octubre de 2004, 11:44:00 »
Bueno, creo que ya está claro, es el compilador.

¿Qué versión es?

De todas formas aunque fuese una versión "antigua" no tendría porque dar el error que te dá al incluir el fichero de la LCD. A ver si va a ser una de las versiones mal crakeada y que nos han dado a más de uno un disgusto. ¿Qué versión es?

Con la versión que tenemos nosotros y haciendo los cambios que te hemos indicado compila perfectamente.

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: LCD para 16F876
« Respuesta #6 en: 15 de Octubre de 2004, 20:05:00 »
Sí, debe ser problema de la versión... Quizás sea esa posterior a la 3.190 que dió problemas... No recuerdo si era la 3.200 o por ahí...
Yo la instalé, compilé un programa y me daba un error raro... quizás ese. No recuerdo. La desinstalé al instante.
Seguramente sea la versión, ya que como te comenta pocher a nosotros nos compila.

Saludos!!
Saludos desde Huelva (ESPAÑA)

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: LCD para 16F876
« Respuesta #7 en: 16 de Octubre de 2004, 07:50:00 »
Otra vez tengo que darle la razón a los dos cracks (un saludo coleguis), hubo ciertas versiones que no funcionaron como debieran, y también sé que hubo algún bug con el tema del #ADC, se que lo leí alguna vez en el foro de ccs pero ya no recuerdo si era una versión concreta del compilador o que leches era(hace tiempo de esto y mi memoria deja bastante que desear).... en fin, si necesitas "resolver" el problema de tu compilador mándame un privado .

Un saludo.

Desconectado efrenpal

  • PIC10
  • *
  • Mensajes: 9
RE: LCD para 16F876
« Respuesta #8 en: 21 de Octubre de 2004, 18:33:00 »

Hola.

Perdón por el retraso con el que respondo. La versión del compilador que utilizo es la 3.0.0.9 y la versión del MPLAB la 6.30

He puesto la versión 3.3.0.49 y efectivamente me ha dado el error en la segunda línea que todos habeis comentado. Haciendo lo propio (lo que me dijisteis) compila perfectamente!!!!!    Rebotado

GRACIAS OSHOW, CUCARACHA Y POCHER.

P.D.: Da algún problema este compilador?

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: LCD para 16F876
« Respuesta #9 en: 22 de Octubre de 2004, 00:00:00 »
No dá problemas, va bastante bien. Si la versión está mal crakeada pués entonces va mal, eso no es culpa del compilador.

A medida que van subiendo en las versiones hay definiciones que las redefinen, otras simplemente las quitan y además añaden nuevas definiciones de funciones y demás.

Tenías una versión, un tanto antigua.

Un saludo


 

anything