TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: vinnymoy en 20 de Marzo de 2011, 19:43:55
-
Estoy usando un PIC16f877A y resulta que dependiendo de en qué valor se encuentra un valor del adc en el A3 me tiene que salir un mensaje por el lcd.
Es decir: Si en el A3 tengo 120 (ya convertido con el ADC) tiene que mostrar algo, y si está 250 otra cosa.
Simplemente no funk... Y ya le he dado las vueltas y las vueltas y la verdad no encuentro el error...
#include "C:\Users\Vinicio\Documents\Micho\Cajita mágica\Programa.h"
#include <LCD.C>
#include <string.h>
float tiempo, tadc;
unsigned int madc, band, band1;
char mensaje[];
void mensajelcd(unsigned int band);
//!#int_RB
//!void RB_isr(void)
//!{
//!
//!}
//!
void main()
{
port_b_pullups(TRUE);
setup_adc_ports(AN0_AN1_AN3);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DIV_BY_16,255,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(0);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
enable_interrupts(INT_RB);
enable_interrupts(GLOBAL);
// TODO: USER CODE!!
while(true)
{
set_adc_channel(0);
tadc= read_adc();
tiempo= tadc*7.84;
delay_us(100);
set_adc_channel(3);
madc= read_adc();
if(madc>=0 && madc<=25) band=0;
if(madc>=26 && madc<=50) band=1;
if(madc>=51 && madc<=75) band=2;
if(madc>=76 && madc<=100) band=3;
if(madc>=101 && madc<=125) band=4;
if(madc>=126 && madc<=150) band=5;
if(madc>=151 && madc<=175) band=6;
if(madc>=176 && madc<=200) band=7;
if(madc>=201 && madc<=225) band=8;
if(madc>=226 && madc<=255) band=9;
if(madc<0 && madc>255) band=10;
mensajelcd(band);
// if(band1=!band) lcd_putc('\f');
band1=band;
}
}
void mensajelcd(unsigned int band)
{
unsigned int i;
switch (band) {
case 0 : mensaje= "PRUEBA 0"; break;
case 1 : mensaje= "PRUEBA 1"; break;
case 2 : mensaje= "PRUEBA 2"; break;
case 3 : mensaje= "PRUEBA 3"; break;
case 4 : mensaje= "PRUEBA 4"; break;
case 5 : mensaje= "PRUEBA 5"; break;
case 6 : mensaje= "PRUEBA 6"; break;
case 7 : mensaje= "PRUEBA 7"; break;
case 8 : mensaje= "PRUEBA 8"; break;
case 9 : mensaje= "PRUEBA 9"; break;
default : mensaje= "INDEFINIDO"; break;
}
printf(lcd_putc,"%s", mensaje); //AQUI NO ME IMPRIME NADA.
delay_us(tiempo);
lcd_gotoxy(1,1);
}
-
yo para imprimir un caracter en el lcd utilizo lcd_putc();
con que programa estas haciendo tu codigo?
podrias adjuntar la simulacion en proteus?
printf(lcd_putc,"%s", mensaje);
yo lo escribiria asi:
lcd_putc("%C", mensaje);
pero seria interesante que adjuntes un archivo proteus para probar.
Saludos
-
pero seria interesante que adjuntes un archivo proteus para probar.
Hola, como dice korpaztk, sería de mucha ayuda que postearas no solo tu circuito para ver donde estás conectando el LCD, sino también el contenido del archivo Programa.h para ver los fuses.
Esta forma de mostrar una cadena en el LCD es correcta:
printf(lcd_putc,"%s", mensaje);
Con %c es para mostrar un solo caracter. Claro que se podría usar con un bucle for para que imprima cada caracter de la variable.
De todos modos antes de seguir especulando lo primero sería ver en el circuito en donde tienes conectado el LCD.
Saludos!
-
que compilador usas? en tu programa no hace falta el include del pic?
-
que compilador usas? en tu programa no hace falta el include del pic?
Hola jhozate, el código que muestra vinnymoy parece estar escrito para CCS C. Si es así, el include del PIC debe estar en el archivo Programa.h que es una de las cosas que le estoy pidiendo que nos muestre.
Saludos!
-
Amigos pues les cuento que el problema no era del compliador CCS C, ni del lcd, ni de printf, sino de una característica de c que un amigo en otro foro me explicó así:
Con un tipo int -pero tambien, char, float, double y similares- se puede inicializar una variable de dicho tipo.
Código:
int a = 5;
y también se puede modificar su valor:
Código:
a = 3;
Una cadena de caracteres sólo la puedes inicializar con una cadena literal. Nunca modificar.
Código:
char mensaje[] = "PRUEBA 0";
Si lo que quieres es modificar una cadena tienes que modificar carácter por carácter o usar la función strcpy() de la librería string.
ese código ya compilaría bien en el caso de que inicializaras:
Código:
char mensaje[] = "PRUEBA 0";
printf("%s", mensaje);
Ahora bien, si este sólo es una simplicicación de lo que quieres hacer. Te doy el trozo de código usando strcpy().
Código:
char mensaje[16];
strcpy( mensaje, "PRUEBA 0");
printf("%s", mensaje);
googleando pudes encontrar muchas referencias sobre la librería string de C i la función strcpy().
Así que mañana lo pruebo y si es que funk les cuento!!! Porque la verdad esto sí resulto nuevo para mí...
-
Pues sí... eso mismo era... funcionó perfectamente!!!
Queda confirmado que con las cadenas de caracteres obligatoriamente se tiene que utilizar funciones especiales para manipularlas.
Ahora la pregunta.... como hago para que se corran las letras en el lcd a lo largo del tiempo:
Pantalla del lcD:
PRUEBA 1
RUEBA 1 P
UEBA 1 PR
EBA 1 PRU
Y asi???
Alguna idea???
-
en el foro hay mucha info sobre eso...
rapidamente se me viene a los ejemplos que hizo vszener
http://www.todopic.com.ar/foros/index.php?topic=4530.0
el numero 27 habla sobre mover texto en lcd, pero creo que hay otros ejemplos.
Saludos.-