TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: efrenpal 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.
-
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!!
-
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
-
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
-
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.
-
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.
-
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!!
-
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.
-
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 Rebotado]()
GRACIAS OSHOW, CUCARACHA Y POCHER.
P.D.: Da algún problema este compilador?
-
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