Problema con LCD en MikroC

Hola a tod@s:
Estoy rematando el PFC con un display text LCD 4x20, concretamente un EA DIP204-4HNLED de Electronic Assembly.
Le he metido un código sencillo:
******************************************
unsigned char *text;
void main()
{
ADCON1 |= 0x0F;
TRISB = 0x00;
LCD_INIT(&PORTB); //nitialize LCD connected to PORTB
Lcd_config(&PORTB,3,2,0,7,6,5,4); // ILcd_Cmd(Lcd_CLEAR);
Lcd_cmd(LCD_clear);
lcd_Cmd(Lcd_CURSOR_OFF);
text=("MODO SIMETRICO");

for (;;)
{
lcd_out(1,4,text);
Lcd_Out(2,1,"V+: . V I+: . A");
Lcd_Out(4,1,"V-: . V I-: . A");
}
}
*******************************************************
y el display funciona y saca el texto, pero en la segunda linea se repite parte del texto de la primera, y en la cuarta se repite parte del texto de la tercera, tal y como os adjunto en la foto.

lcd.jpg

¿Alguien me puede decir por qué aparecen fenómenos paranormales en mi pantallita LCD?

Un Saludo!
Jorge
 
Hola JimmyKarson


Si quieres te puedo ayudar en lo que me sea posible, pero antes que nada quiero saber algunas cosas:

1) Que PIC utilizas? (o estoy cabreando)
2) Que version de MikroC utilizas?

Mira yo hice un ejemplito con el PIC 16F84A para un LCD de 4x20:

Código:
char *mensaje={"Modo Simetrico"};
void main(void)
{
TRISB=0;
Lcd_Init(&PORTB);
Lcd_Cmd(Lcd_Clear);
Lcd_Cmd(Lcd_CURSOR_OFF);
while(1)
{
Lcd_Out(2,1,mensaje);
Lcd_Out(4,1,"V+: . V I+: . A");
}
}

Lo simulo en Proteus y todo perfecto, a ti tambien te simula bien??

unsigned char *text;
void main()
{
ADCON1 |= 0x0F;
TRISB = 0x00;
LCD_INIT(&PORTB); //nitialize LCD connected to PORTB
Lcd_config(&PORTB,3,2,0,7,6,5,4); // ILcd_Cmd(Lcd_CLEAR);
Lcd_cmd(LCD_clear);
lcd_Cmd(Lcd_CURSOR_OFF);
text=("MODO SIMETRICO");

for (;
{
lcd_out(1,4,text);
Lcd_Out(2,1,"V+: . V I+: . A");
Lcd_Out(4,1,"V-: . V I-: . A");
}
}
 
Gracias iDan por contestar tan rápido. He probado tu código y vuelve a ocurrir el mismo problema que tenía, exáctamente igual.
Algo debo haber hecho mal, que se me escapa. Voy a probar a conectarlo a otro puerto que no sea el B, cambiar de PIC y si sigue dando el mismo problema cambiaré a la conexión con 8 bits de datos a ver si se soluciona.
Ahora mismo estoy usando un PIC 16f876 y la versión 8.0.0 de MiKroC, no lo he simulado en Proteus.
Repito, muchas gracias IDan. Informaré de los progresos que vaya teniendo por si alguien alguna vez tiene este mismo problema.

Un Saludo!
 
Hola amigo... mira hice un programa con tus indicaciones con un PIC16F877 usando 8 Bits para controlar la LCD asi que te adjunto el programa hecho en MikroC y el circuito simulado en Proteus; pruebalo y me avisas para ver cual sera el problema.
 

Adjuntos

  • Circuito y programa.zip
    34.6 KB · Visitas: 341
Gracias Idan por contestar tan rápido!!

He estdo fuera por motivos de trabajo, tengo tres trabajos a la vez y me resulta un poco complicado conectarme de forma regular.
En cuanto tenga un ratillo probaré a conexionarlo a 8 cables a ver si funciona el código que me has pasado.


Un saludo!
 
Ok amigo... cualquier cosa que necesites y yo pueda ayudarte con mucho gusto te ayudo... se ve que eres muy trabajador... (y):apreton:


Saludos...
 
saludos compañeros soy realmente nuevo en cuanto a programar en mikrobasic tengo el siguintes problema: el programa me al hacer el "built" va todo bien no me da error el problema resulta cuando lo corro paso por paso llego al lcd_init() y se me queda pegado en cierta rutina cuando hace sus respectivo delay específicamente en "L__Delay_5500us13:" hace eso un millón de veces y no me pasa de alli alguien sabe le ah pasado?' porfavor es super urgente quie les anexo el programa
 

Adjuntos

  • contador.txt
    2.2 KB · Visitas: 33
Hola, intento usar MikroC para programar y simular un PIC16F877 y controlar un LCD LM032L en proteus. Al momento de compilar el programa, usando el comando:

Lcd_Init(&PORTB); me marca error, el codigo es bien simple y no se porque, jamas he programado un PIC, asique no se cual es el problema

El codigo es el siguiente:

char *text = "Hello World!";
char mytext[3];
int i;
void main() {
// pic16f887
// ANSEL = 0x00; //Digital I/O for PORTA
// ANSELH = 0x00; //Digital Input for PORTB

// pic16f877A

CMCON = 0x07; //Set PORTA to Digital input
TRISB = 0; // PORTB is output
TRISA = 0x07; //PORTA as the input/output 0000 0111
i=0;
Lcd_Init(&PORTB); // Initialize LCD connected to PORTB
Lcd_Cmd(Lcd_CLEAR); // Clear display
Lcd_Cmd(Lcd_CURSOR_OFF); // Turn cursor off
Lcd_Out(1, 1, text); // Print text to LCD, 2nd row
while(1){
while(i<200){
IntToStr(i,mytext);
Lcd_Out(2,1,mytext);
Delay_ms(500);
i++;
}

i=0;
}
}


Pero como les comento en las lineas de codigo Lcd_Init, Lcd_Cmd, me marca error, ya intente varias cosas como incluir TODAS la librerias, o no incluir esas lineas, pero diganme como lo hago

O pasenme un tuto para aprender a programar un LCD con el pic16f877 ojala y alguien pueda hecharme la mano gracias
 
Puedes empezar con esto:

PHP:
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections

char *text = "Hello World!";
int i;                               // Loop variable
char mytext[5];

void main(){
  Lcd_Init();                        // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);               // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off

  Lcd_Out(1,6,text);                 // Write text in first row
  Lcd_Cmd(_LCD_SECOND_ROW);
  IntToStr(i,mytext);
  
  while(1) {                         // Endless loop
    for(i = 0; i < 100; i++){
       IntToStr(i,mytext);
       Lcd_Out(2, 7, myText);
       Delay_ms(500);
     }
  }
}


LCD.jpg

Saludos
 

Adjuntos

  • LCD.zip
    105.2 KB · Visitas: 42
Hola estimados, necesito de su ayuda ya que estoy haciendo un cto con una pic 16f628a y un lcd 2*16, y resulta que en proteus lo simulo y me muestra el texto variable de proceso y set point, pero no me muestra los valores de cada variable.
En verdad soy nuevo en este tema y me interesaría aprender mucho mas y espero me puedan echar una mano con este error, alomejor es de principiante pero de verdad me esta complicando.

De ante mano muchas gracias por su ayuda :)

Adjunto imagen del cto en proteus y de la programacion en mikroc 5.61
 

Adjuntos

  • mikro c.jpg
    mikro c.jpg
    146.5 KB · Visitas: 42
  • proteus.jpg
    proteus.jpg
    147.8 KB · Visitas: 22
  • proteus on .jpg
    proteus on .jpg
    146.5 KB · Visitas: 27
que tal compañero un saludo,,



bueno nunca he utilizado esa librería de cambiar entero a string, yo lo hago e otra manera pero bueno te dejo un video que hice a ver si te sirve, al igual que tu no se mucho pero ps hago mi lucha jejeje Saludos....

Por favor ve al minuto 7:00 me parece que ahí empieza algo similar a tu problema. (y)


 
Última edición por un moderador:
Hola estimados, necesito de su ayuda ya que estoy haciendo un cto con una pic 16f628a y un lcd 2*16, y resulta que en proteus lo simulo y me muestra el texto variable de proceso y set point, pero no me muestra los valores de cada variable.
Aclarando un poco tu pregunta...
Estás usando un PIC16F628A para leer un potenciómetro, y ese PIC no tiene conversores de analógico a digital.
Tan solo tiene comparadores analógicos. Otro detalle, es que configuras el puerto A como salidas,
y RA0 debería ser entrada, para poder leer el potenciómetro. (Si fuera un PIC16F88 se podría)
Lo que no entiendo es como el compilador te permite usar la instrucción ADC_Read(Channel) :confused:
Quizás en tu proyecto declaraste otro PIC con ADC y en la simulación usaste un 16F628A.

Cambia de PIC por otro con ADC y posiblemente funcione tu programa.

Saludos.
 
Buenas tardes, estoy haciendo un pequeño proyecto, pero en verdad me he quedado un poco trabado. :oops:
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:

Código:
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.
 

Adjuntos

  • 1.JPG
    1.JPG
    88.4 KB · Visitas: 28
  • 2.JPG
    2.JPG
    91.5 KB · Visitas: 20
  • 3.JPG
    3.JPG
    110.3 KB · Visitas: 21
  • 4.JPG
    4.JPG
    99.8 KB · Visitas: 18
  • 5.JPG
    5.JPG
    114.6 KB · Visitas: 23
Estoy desarrollando un tablero deportivo con mikroC por for PIC. Tengo algunos problemas con un Lcd de 16x4, todo funciona correctamente pero aleatoriamente aparencen caracteres
extraños en la pantalla del Lcd. Creo que es por un problema de timing entre el Lcd y el programa. Estoy usando las librerias Lcd de mikroc, sí pongo algunos delays
despues de mostrar los datos el problema parece resolverse pero como necesito contar tiempo no lo puedo utilizar.
El problema aparece tanto en la simulacion con proteus como en el circuito real. Adjunto el codigo, imagen del proteus e imagenes de los problemas en el circuito real.

Código:
#define ON 0
#define OFF 1


// Lcd pinout settings
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;

// Pin direction
sbit LCD_RS_Direction at TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;

//variables
unsigned short bin_code,gol_L, gol_V,fal_V,fal_L,periodo_juego;
volatile bit bandera, marcador, resta,programe_mode;
volatile bit seg_si, min_si, gol_l_si, gol_v_si, falta_l_si, falta_v_si;
char temp[2],str_format[2];
bit fin_libre_L,fin_libre_v;
volatile int cont;
volatile short int minuto,minuto_sub,segundo_sub, segundo;
volatile short  xx[4] = {0x0, 0x40, 0x10, 0x50};

//Rutina de dos digitos
char *format_num(int valor, char str_format[]) {
     str_format[0] = valor / 10 + '0';
     str_format[1] = valor % 10 + '0';
     return str_format;
//
}

//Rutina de posicionamiento del cursor Lcd 16x4
void Dsp_Txt (int x, int y, char *texto){
int cmd_pos = 0;
cmd_pos = 0x80 +xx[x-1] + y - 1;
Lcd_Cmd (cmd_pos);
Lcd_Out_Cp(texto);
}

int falta_libre(int total_faltas ){
  int resto_faltas, entero_faltas;
  resto_faltas = total_faltas % 5;
  entero_faltas = total_faltas / 5;
  if ((entero_faltas>1 && resto_faltas==0))
        return 0;
  else
      return 1;

}



//interrupcion por rb0
void InitTimer1(){
  T1CON         = 0x01;
  TMR1IF_bit         = 0;
  TMR1H         = 0xD8;
  TMR1L         = 0xEF;
  TMR1IE_bit         = 1;
  INTCON         = 0xC0;
}


void Interrupt(){
  if (intf_bit){
      bin_code = porta;
      marcador = 1;
      intf_bit = 0;
      if(bin_code==0){
       if(bandera==OFF){
          gol_L_si = ON;
          if(resta==ON){
             gol_L--;
             resta=OFF;
          }
         else {
            gol_L++;
         }
       }
       resta=OFF;
       portd.f5=0;
      }
      if(bin_code==1){
       if(bandera==OFF){
             gol_V_si = ON;
             if(resta==ON){
                 gol_V--;
                 resta=OFF;
             }
            else {
                gol_V++;
            }
       }
       resta=OFF;
       portd.f5=0;
      }
      if(bin_code==2){
       bandera = ~bandera;
      }
      if(bin_code==4){
        falta_l_si = ON;
       if(resta==ON){
         resta=OFF;
         fal_L--;
         portd.f5=0;
       }
       else{
        fal_L++;
        fin_libre_L=0;
       }
      }
      if(bin_code==5){
        falta_v_si = ON;
       if(resta==ON){
          resta=OFF;
          fal_V--;
          portd.f5=0;
       }
       else{
         fal_V++;
         fin_libre_V=0;
       }
      }
      if(bin_code==8){
        if(bandera==OFF){
          programe_mode=ON;
          portd.f3=1;
        }
      }
      if (bin_code == 9){
         resta = ON;
         portd.f5=1;
      }  
      if (bin_code == 10){
      }
  }
  if (TMR1IF_bit){
    TMR1IF_bit = 0;
      TMR1H         = 0xD8;
    TMR1L         = 0xEF;
   if(bandera==ON){
     cont++;
      if(cont==100){
       segundo--;
       segundo_sub++;
       seg_si = ON;
       cont=0;
         if (segundo < 0){
           min_si = ON;
           minuto--;
           segundo = 59;
           minuto_sub++;
           segundo_sub = 0;
         }
      }
   }
  }
}


//comienza programa
void main() {
  Trisa = 0b00001111;
  Trisb = 0b00000001;
  Trisc = 0;
  portc = 0;
  Trisd = 0;
  portd = 0;
  Trise = 0;
  porte = 0;
  porta = 0;
  InitTimer1();
  INTE_bit = 1;
  GIE_bit = 1;
  adcon1 = 0b00000111;
  cont=0;
  periodo_juego = 1;
  bandera=OFF;
  gol_L=0;
  gol_V=0;
  segundo=0;
  minuto=25;
  fal_L = 0;
  fal_V = 0;
  portd.f2 = 1;         //encendido y pic andando
  portd.f6 = 1;         //comunicacion establecida
  programe_mode=ON;
  resta = OFF;
  fin_libre_L=1;
  fin_libre_V=1;
  min_si = OFF;
  seg_si = OFF;
  gol_l_si = OFF;
  gol_v_si = OFF;
  falta_l_si = OFF;
  falta_v_si = OFF;
  Lcd_Init();
  Lcd_Cmd(_LCD_CLEAR);
  Lcd_Cmd(_LCD_CURSOR_OFF);
  delay_ms(50);
  Dsp_Txt(1,1,"Tiempo  25:00");
  Dsp_Txt(1,11,":");
  Dsp_Txt(2,1,"Goles");
  Dsp_Txt(2,7,"L:00");
  Dsp_Txt(2,12,"V:00");
  Dsp_txt(3,1,"Falta");
  Dsp_Txt(3,7,"L:00");
  Dsp_Txt(3,12,"V:00");
  Dsp_Txt(4,1,"Periodo");
  Dsp_Txt(4,9,"1");
  Dsp_Txt(4,11,"00:00");
  marcador = 0;



  do{
      if (min_si == ON) {
        Dsp_Txt(1,9,format_num(minuto,str_format));
        Dsp_Txt(4,11,format_num(minuto_sub,str_format));
        min_si=OFF;
      }
      if (seg_si == ON){
        Dsp_Txt(1,12,format_num(segundo,str_format));
        Dsp_Txt(4,14,format_num(segundo_sub,str_format));
        seg_si = OFF;
      }
      if(gol_l_si == ON){
          gol_L_si = OFF;
          Dsp_Txt(2,9,format_num(gol_L,str_format));
          delay_ms(50);
        }
      if (gol_v_si == ON){
       Dsp_Txt(2,14,format_num(gol_V,str_format));
       gol_v_si = OFF;
       delay_ms(50);
      }
      if( falta_l_si == ON){
        Dsp_Txt(3,9,format_num(fal_L,str_format));
        falta_l_si = OFF;
      }
      if(falta_v_si == ON){
        Dsp_Txt(3,14,format_num(fal_V,str_format));
        falta_v_si = OFF;
      }
      while((bandera==OFF)&&(bin_code==6)&&(portb.f0==1)){
        portd.f0 =1;

      }
      if(fin_libre_L==0 && falta_libre(fal_L)==0){
        bandera= OFF;
        fin_libre_L=1;
        portd.f0=1;
        delay_ms(500);
        portd.f0=0;
      }
      if(fin_libre_V==0&&falta_libre(fal_V)==0){
        bandera= OFF;
        fin_libre_V=1;
        portd.f0=1;
        delay_ms(500);
        portd.f0=0;
      }
      portd.f0=0;
      if(bandera==OFF)portd.f4=1;
      else portd.f4=0;
   }while(1);


}
 

Adjuntos

  • foro.jpg
    foro.jpg
    31.1 KB · Visitas: 26
  • mikro_forum.jpg
    mikro_forum.jpg
    125.2 KB · Visitas: 27
Si ya tienes el proyecto en mikroC y una simulación; ¿por qué no adjuntas todo dentro de un archivo comprimido?
Recuerden que los proyectos de mikroC son configurados dentro del entorno.
También incluyendo el archivo de simulación hacen más fácil la tarea a quien desee colaborar con el problema.
 
Adjunto un archivo rar con el simulador y el proyecto en mikroc por si alguien me puede dar una mano. Gracias
 

Adjuntos

  • Proyecto Teblero deportivo.rar
    22.3 KB · Visitas: 14
Hola que tal!! Me pasa algo parecido a vos!!! Yo en mi caso estoy usando el Mikro C para 8051 con el DS1307 y el programa ejemplo del mikro C. Lo analice y analice y no parece estar nada mal. Pero lo que me hace es que muestrea bien---al segundo---muestrea mal---bien---mal--bien ---mal . Los caracteres fijos no los modifica ( : : ) y ( / / ) pero lo de los valores si, salta del año 2014 al 2125 por ejemplo. Nose que pasa!!! Gracias!
 
Estoy desarrollando un tablero deportivo con mikroC por for PIC.
Tengo algunos problemas con un LCD de 16x4.
Todo funciona correctamente, pero aleatoriamente aparecen caracteres extraños en la pantalla del Lcd. Creo que es por un problema de timing entre el LCD y el programa.
Estoy usando las librerías LCD de mikroC, sí pongo algunos delays después de mostrar los datos el problema parece resolverse pero como necesito contar tiempo no lo puedo utilizar.
El problema aparece tanto en la simulación con proteus como en el circuito real.
La librería de mikroC no controla LCD 16x4, únicamente LCD 16x2.
Así que, modifiqué algunas cosas para hacerlo funcionar.
Utilicé las instrucciones nativas para resolver el problema.
Los cambios están comentados y las instrucciones eliminadas también.
Espero que con estos cambios se resuelva el problema ya que no tengo esa pantalla para hacer pruebas.

Suerte.
 

Adjuntos

  • Proyecto Tablero deportivo.rar
    70.6 KB · Visitas: 39
Muchas gracias por la ayuda D@rkbytes. Ahora lo pruebo!



Sigue teniendo el mismo problema. Puede ser que estoy mandando los datos del microcontrolador muy rapido para la lectura del LCD?
 
Última edición:
Desafortunadamente no tengo esa pantalla para hacer pruebas en físico.
En la simulación con el programa modificado ya no existe el problema de los caracteres raros.
Sigue teniendo el mismo problema. ¿Puede ser que estoy mandando los datos del microcontrolador muy rápido para la lectura del LCD?
Será de escritura.
La lectura del LCD se realiza cuando lees los datos de la CGROM.

Las pantallas LCD son rápidas para lo que están hechas (Mostrar datos visuales), a velocidades de trabajo muy elevadas algo así como mostrar los milisegundos de un cronometro, se pierde visibilidad.
Lo que tú quieres es mostrar cantidades que no requieren altas velocidades de visualización.
¿Acaso anotan muy rápido los goles? :D

Experimenta con los retardos que tienes en el programa para ver si lo puedes resolver.

Saludos.
 
Atrás
Arriba