TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sha en 28 de Enero de 2011, 05:25:33
-
Hola a todos.
Tengo un problemilla con un programa.
cuando meto tensión al pic aveces se inicia y otras no, y esto pasa cuando meto en el programa lo relacionado con pantalla lcd.
El programa es este:
#include <18f4550.h>
#include <STRING.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN
#use delay (clock=8000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8) //manejo del RS232
#use standard_io(a)
#use standard_io(e)
#define use_porta_lcd TRUE
#define use_porte_lcd TRUE
#include <flex_lcd.h>
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
set_tris_a(0x00);
set_tris_b(0xff);
set_tris_c(0b00000000);
set_tris_d(0x00);
set_tris_e(0x00);
lcd_init();
lcd_putc("Esperar");
delay_ms(1000);
printf("AT+CPIN=2805\r\n");
while(true)
{
output_high(PIN_D7);
delay_ms(1000);
output_low(PIN_D7);
delay_ms(1000);
}
}
Se que es algún tema relacionado con configuración. Pero...
Los pines de LCD son:
RS--->RA0
RW--->RA1
E----->RA2
D4--->RA3
D5--->RA5
D6--->RE0
D7--->RE1
Gracias antes de nada
-
Hola compañero,
¿Que es lo que no se inicia el pic o el LCD?
Podria ser un problema de una falsa conexion, suele ocurrir en placas de pruebas.
Tambien podria ser que alimentas con las misma fuente el pic y el LCD y la fuente
no da suficiente chicha para todo el circuito.
Tambien podría ser una mala conexión fijate si pusiste bien las conexiones del LCD o del pic.
fijate si tienes algún cortocircuito.
Fijate si las conesiones del circuito coinciden con la del codigo fuente.
Un saludo
-
A mi me ha pasado tambien, el problema puede estar en la configuracion del reloj.
Te recomiendo que leas el siguiente articulo para que tengas una mejor idea como se hace
Consiguiendo 4 Mhz para los 48 Mhz necesarios en los PIC's con USB 2.0 (http://picmania.garcia-cuervo.net/conceptos.php#USB4Mhz)
Aunque no se si estes trabajando con el usb, la explicacion es valida para configurar el reloj
Tambien si no tienes bien regulada la fuente de alimentacion suele suceder, el hecho de que funcione al menos una ves
nos dice que el programa esta bien, y el problema esta en otro lado.
Para salir de dudas, coloca un condensador de 1000 uf/16v a la fuente de alimentacion, mide la tencion usando el voltimetro y mira si el voltaje es constante, todo el tiempo.
-
Hola sha, esta definición de pines:
Se que es algún tema relacionado con configuración. Pero...
Los pines de LCD son:
RS--->RA0
RW--->RA1
E----->RA2
D4--->RA3
D5--->RA5
D6--->RE0
D7--->RE1
debe estar declarada antes o en el encabezado de #include <flex_lcd.h>
estando asi, elimina estas líneas:
#define use_porta_lcd TRUE
#define use_porte_lcd TRUE
y estas también:
set_tris_a(0x00);
set_tris_e(0x00);
El uso de printf para LCD lo debes hacer así:
printf(lcd_putc, "AT+CPIN=2805\r\n");
Saludos!
-
Qué tal todos!
El uso de printf para LCD lo debes hacer así:
printf(lcd_putc, "AT+CPIN=2805\r\n");
bmb, me parece que en esa línea sha lo que desea es mandar algo por puerto serial, no para el LCD -cualquier cosa corrige sha-, así que sí estaría bien tal como está ahí:
Por otro lado -corrijan los maestros si estoy equivocado- para enviar caracteres al lcd sí se puede usar sin el printf, tal como lo colocó sha acá:
La ventaja de hacerlo con el printf como tú muy bien lo colocaste, es que permite trabajar con las demás funcionalidades del printf, como reconocer los símbolos especiales "\r", "\n" y definir el tipo de variable numérica a usar, la cantidad de decimales, etc... sobre todo si lo que se está mandando al LCD son variables numéricas, la forma que tú colocas es la mejor. Pero si sólo se está enviando una cadena de caracteres, la forma de sha es válida también.
Sha, lo de las definiciones de pines antes del #include <flex_lcd.h> si es crítico... posiblemente ese sea el problema...
Ojalá puedas resolverlo pronto...
Saludos a todos, nos leemos! :mrgreen:
-
Hola a todos y gracias por contestar.
Ahora estoy probando con este mini programa:
#include <18f4550.h> //archivo de cabecera
#fuses HS,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL1,CPUDIV1,NOVREGEN,NOPBADEN
#use delay(clock=20000000)
#define LCD_DB4 PIN_A3
#define LCD_DB5 PIN_A5
#define LCD_DB6 PIN_E0
#define LCD_DB7 PIN_E1
#define LCD_RS PIN_A0
#define LCD_RW PIN_A1
#define LCD_E PIN_A2
#include <flex_lcd.h>
void main()
{
SETUP_TIMER_0(RTCC_DIV_256|RTCC_INTERNAL|RTCC_8_BIT);
Port_B_Pullups(FALSE);
Setup_ADC_Ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
delay_ms(5000);
lcd_init();
lcd_putc("esperar");
delay_ms(1000);
lcd_putc("esp");
while(true)
{
delay_ms(1000);
output_high(PIN_D7);
delay_ms(1000);
output_low(PIN_D7);
}
}
Todavía no lo he podido solucionar.
Pero he echo pruebas.
Para llegar a este cto y este pic comencé haciendo un programa con 16f876 con una paca de agujeritos y con ella el lcd me funciona. por lo que no creo sea fuente alimentación.
Luego he probado a conectar los pines del lcd de esa placa ( la del 16f876) al zocalo de la placa que he hecho para el 18f4550 y funciona el lcd. por lo que la conexión del lcd a la placa del 18F4550 no es.
Y por último probé a conectar el 16f876 a la placa del 18f4550 y me hace lo mismo que antes. hay veces que arranca y otras que no, es decir, hay veces que metes tensión y no hace nada el pic, ni siquiera apagar y envender salida. otras escribe algo, no todo. y otras funciona bien.
Y si, lo que quería con printf era comunicarme con puerto serie.
Gracias.
-
Hola, me parece que asi como está debería funcionar. No se que versión de tantas que hay de flex_lcd.h estás usando. Las últimas versiones del CCS permiten la configuración de pines para el LCD. Fijate en la librería LCD.C del CCS y si tu versión es reciente, verás que te permite configurar también los pines. Si es asi, te recomiendo la propia que trae CCS. Las pullups por defecto están dehabilitadas, asi que las dos líneas: port_b_pullups(FALSE); (la tienes repetida) te sobran. También podrías formatear un poco lo que va a mostrar el LCD con lcd_gotoxy(x,y) y lcd_putc(c) usando \a, \f, \n por ejemplo, o con printf() y sus opciones de formateo como te indiqué antes (cuando es para el LCD, claro). Por lo demás, todo parece indicar que tienes problemas en las conexiones del circuito o con la fuente o tal vez no le tienes condensador de desacoplo en la entrada de alimentación del PIC.
Saludos!
-
Qué tal todos!
Para llegar a este cto y este pic comencé haciendo un programa con 16f876 con una paca de agujeritos y con ella el lcd me funciona. por lo que no creo sea fuente alimentación.
Luego he probado a conectar los pines del lcd de esa placa ( la del 16f876) al zocalo de la placa que he hecho para el 18f4550 y funciona el lcd. por lo que la conexión del lcd a la placa del 18F4550 no es.
Y por último probé a conectar el 16f876 a la placa del 18f4550 y me hace lo mismo que antes. hay veces que arranca y otras que no, es decir, hay veces que metes tensión y no hace nada el pic, ni siquiera apagar y envender salida. otras escribe algo, no todo. y otras funciona bien.
Sha, ahora si tienes la configuración del flex_lcd como Dios manda! ;-) :D
Entonces dices que cuando pruebas insertando el PIC en la placa que tienes para el 18F4550 es que no funciona -ni el 18F ni tampoco el 16F-, entonces eso descartaría que fuera un problema de software... al parecer la cosa es por hardware como bien dijo bmb... creo que el siguiente paso es revisar las pistas y soldaduras, capaz que haya algo en cortocircuito en la parte del zócalo del PIC o lo que te dijo bmb:
todo parece indicar que tienes problemas en las conexiones del circuito o con la fuente o tal vez no le tienes condensador de desacoplo en la entrada de alimentación del PIC.
Ánimo Sha, ya estás cerca de resolverlo! :)
Nos avisas por aquí eh! Saludos y nos leemos! :mrgreen:
-
Buenas a todos.
Por fin lo he conseguido.
Cambie la configuración y cambie el cristal y ya funciona siempre en la placa que hice.
Este programa esta hecho para un cristal de 4 MHz.
He hecho un programa, ya puestos, para que valga para todo el mundo que empieza, para lcd, con interrupción de tmr0 y comunicacion con ordenador por puerto serie rs232.
#include <18f4550.h> //archivo de cabecera
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOPBADEN,NOLVP,NOCPD,NODEBUG,NOWRT,NOVREGEN,CPUDIV1
#use delay(clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#include <flex_lcd.h>
char rcvchar=0x00;
long con_tim=0x00;
short seg_si=0;
short enc_si=0;
#INT_TIMER0
void timer0() //Interrupción del timer 0
{
SET_TIMER0(0xC2); //Ponemos el valor 0x87 en el TIMER0
con_tim++; //Incrementamos la variable intermedia con_tim
if (con_tim>=300) //Comprobamos el valor de con_tim
{
seg_si=1; //Si es mayor o igual que 250 ponemos a uno seg_si
con_tim=0x00; //Y además ponemos a cero con_tim
}
}
#int_rda
void serial_isr()
{
disable_interrupts( INT_Timer0 );
if(kbhit())
{
rcvchar=getc();
putc(rcvchar);
lcd_putc(rcvchar);
}
enable_interrupts( INT_Timer0 );
}
void main()
{
SETUP_TIMER_0(RTCC_DIV_256|RTCC_INTERNAL|RTCC_8_BIT);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
Setup_ADC_Ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
port_b_pullups(FALSE);
setup_wdt(WDT_OFF);
setup_oscillator(False);
SET_TIMER0(0xC2);
enable_interrupts( INT_Timer0 );
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
delay_ms(5000);
lcd_init();
lcd_putc("esperar");
delay_ms(1000);
lcd_putc("esp");
while(true)
{
delay_ms(1000);
output_high(PIN_D7);
delay_ms(1000);
output_low(PIN_D7);
}
}
-
Hola sha, debes cambiar el fuse HS por XT para 4Mhz. Me alegra mucho que hayas logrado hacer funcionar el circuito!
Saludos!
-
Felicitaciones Sha!! Enhorabuena! :-/ :-/ :-/
Entonces era el cristal... Bueno excelente que hayas podido resolverlo... y muchas gracias por el aporte al foro! :)
Seguro le servirá a otra persona que esté haciendo algo parecido a lo que tú hiciste.
De nuevo felicidades y esperamos seguirte viendo por acá..
Saludos, nos leemos! :mrgreen: