Buenas tardes, estoy haciendo un pequeño proyecto, pero en verdad me he quedado un poco trabado.
Estoy empezando a utilizar MikroC para Pics, en particular, el PIC 16F648A.
Anteriormente he usado LCD 16X2 usando Pic Basic Pro, sin ningun problema ni inconveniente, pero con MikroC, he tenido varios, a cada rato, que en general, lo que sucede es que:
- Se sobreescriben caracteres en el LCD, en sitios que no deben estar, e incluso, a veces signos raros -
En concreto, estaba usando el codigo de ejemplo que brinda la ayuda de MikroC para controlar un sensor de temperatura DS18B20, y eso complicaba bastante la impresion en el LCD, es decir, eran muchos mas los caracteres raros. Disminuyendo algunas cadenas de texto que presentaba, o "arrimandolas" de sitio, a veces, lograba "componerlo" pero realmente el problema persiste, y aunque he buscado muchas soluciones, no encuentro nada, he probado bastantes formas, y tampoco.
E incluso con un codigo mas sencillo, tambien pasa. A continuacion un codigo mas sencillo que hice, que tambien me da el problema:
void luz(void);
void temperatura(void);
void uv (void);
void laser(void);
void luzcuarto (void);
sbit LCD_RS at RA0_bit;
sbit LCD_EN at RA1_bit;
sbit LCD_D4 at RA2_bit;
sbit LCD_D5 at RA3_bit;
sbit LCD_D6 at RA4_bit;
sbit LCD_D7 at RA6_bit;
sbit LCD_RS_Direction at TRISA0_bit;
sbit LCD_EN_Direction at TRISA1_bit;
sbit LCD_D4_Direction at TRISA2_bit;
sbit LCD_D5_Direction at TRISA3_bit;
sbit LCD_D6_Direction at TRISA4_bit;
sbit LCD_D7_Direction at TRISA6_bit; // Final de las conexiones del módulo LCD
int i=0, l=0, ok=0, med=0, ilu=0, por=0;
char *ilutxt="000";
const unsigned short TEMP_RESOLUTION = 12;
char *text = "000.0000";
unsigned temp;
void main() {
CMCON=0x07;
l=0;
RB4_bit=0;
RB5_bit=0;
RB6_bit=0;
RB7_bit=0;
RA7_bit=0;
TRISB4_bit=1;
TRISB5_bit=1;
TRISB6_bit=1;
TRISB7_bit=0;
TRISA7_bit=0;
UART1_Init(9600); //Inicializa el USART a 9600 bps.
Delay_ms(100); //Espera a que el USART se estabilice.
LCD_init ();
lcd_cmd(_LCD_CURSOR_OFF); // Comando LCD (apagar el cursor)}
lcd_out (1,6,"FAOMIC");
lcd_out (2,3,"SICPRI v 2.0");
delay_ms(3000);
for (i=0;i<20;i++){
lcd_cmd(_LCD_SHIFT_LEFT);
delay_ms(50);}
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_RETURN_HOME);
lcd_out (1,4, "BIENVENIDO");
lcd_out (2,4, "Todo bien?");
GIE_bit=1; //Interrupciones habilitadas.
RBIE_bit=1; //Interrupcion PORTB habilitada
while (ok==0);
//Entramos a Sistema
PWM1_Init(250);
PWM1_Start(); // start PWM1
PWM1_Set_Duty(ilu);
ok=0;
med=1;
l=0;
Delay_ms(500);
Lcd_Cmd(_LCD_CLEAR); //Entramos ya al menu de pantallas.
while(1){
if (l<0) l=4;
if (l>4) l=0;
switch (l){
case 0: lcd_out(1,1, "TEMPERATURA"), lcd_chr(2,10,223), lcd_out(2,11,"C");break;
case 1: lcd_out(1,1, "LUZ BLANCA ILUM"), lcd_out(2,11,"%"), luz() ;break;
case 2: uv() ;break;
case 3: laser() ;break;
case 4: luzcuarto() ;break;}
}}
void interrupt(void){
if (RB5_bit==1) ok=!ok, med++; //Pulsador presionado.switch (med){
if (RB6_bit==1) l--; //Pulsador presionado.
while (RB6_bit==1);
if (RB4_bit==1) l++; //Pulsador presionado.
while (RB4_bit==1);
INTF_bit=0;
RBIF_bit=0;
}
void luz (void){
while (l==1){
switch (med){
case 1: ilu = 0, ilutxt[2]='0', ilutxt[1] = '0', ilutxt[0]='0';break;
case 2: ilu = 64 , ilutxt[2]='5', ilutxt[1] = '2', ilutxt[0]='0';break;
case 3: ilu = 128 ,ilutxt[2]='0', ilutxt[1] = '5', ilutxt[0]='0';break;
case 4: ilu = 192 ,ilutxt[2]='5', ilutxt[1] = '7', ilutxt[0]='0';break;
case 5: ilu = 255, ilutxt[2]='0', ilutxt[1] = '0', ilutxt[0]='1';break;}
if (med<1) med=5;
if (med>5) med=1;
PWM1_Set_Duty(ilu);
lcd_out(2,1,ilutxt);
}}
void uv (void){
lcd_out (1,1,"LUZ ULTRAVIOLETA");
while (l==2){
if (ok==0) {
lcd_out (2,1, "ON ");
RB7_bit = 0;}
if (ok==1){lcd_out (2,1, "OFF");
RB7_bit = 1;}}}
void laser (void){
lcd_out (1,1,"LUZ LASER ");
while (l==3){
if (ok==0) {lcd_out (2,1,"ON ");
RA7_bit = 0;}
if (ok==1) {lcd_out (2,1,"OFF");
RA7_bit = 1;}}}
void luzcuarto (void){
lcd_out (1,1,"LUZ CUARTO ");
while (l==4){
if (ok==0) {lcd_out (2,1,"ON ");
UART1_Write_Text("LCON");}
if (ok==1) {lcd_out (2,1,"OFF ");
UART1_Write_Text("LCOFF");}
}}
Y adjuntas unas imagenes, de lo que pasa. En concreto, todo parece estar bien, pero en la parte en la que imprimo "LUZ CUARTO" en la primera fila, en realidad proyecta "OFF CUARTO", , y siempre pasa de un modo aparecido, como que "arrastra" palabras o caracteres.
En algunas busquedas que realice, decian que eran por variables convertidas a string, que tenian muchos caracteres, y que era mejor hacerlo manual, pero para evitar esa posibilidad, he retirado esas partes, como ven el codigo, consta de simples impresiones en LCD, que en PBP haria sin problema pero aqui no entiendo cual es el problema.
Como ven, en este caso, el problema se observa en la imagen 5.
Alguien sabe por que sucede esto? Segun yo el codigo es correcto, sencillo incluso, simple presentacion de cadenas especificadas, fijas, y me sale ese problema.
Muchas gracias por su apoyo.