TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: cgardoni en 21 de Septiembre de 2015, 14:26:38

Título: problema con "logic contention detected"
Publicado por: cgardoni en 21 de Septiembre de 2015, 14:26:38
Buen dia a todos!

Soy novato en el mundo de los PIC
Hace un tiempo estoy metiéndome en el tema y empece con un libro que se llama “Compilador Ccs C y simulador proteus para microcontroladores PIC” el cual me esta sirviendo mucho y llegue hasta la parte de teclado 3 x 4 donde me dispuse a hacer el ejemplo 5, el cual es en apariencia simple.

El ejemplo en si utiliza un teclado 3 x 4 y un LCD 16 X 2 donde al apretar un botón, ecepto el *, se muestra en el LCD el valor del carácter, tanto numérico como ascii.
En primer termino lo hice como en el libro indicaba, con el uso de standart_io() y me tiro el bendito error “logic contention detected”, el cual investigue y trate de solucionar usan do terminales en vez de “cables”, usando el disabled_interruption(GLOBAL) pero no se soluciona.
Luego cambie el standard_io por el fast_io() usando el set_tris_b() según correspondía, con lo cual arranco a funcionar a lo primero, pero luego dejo de hacerlo y me tiro el error “Attemped to read controller data busy whilsh busy”, con lo cual ya no se que hacer je.

la imagen del circuito en protesus es la siguiente
(http://src="C:\Users\Cristian\Desktop\circuito_ejemplo5.jpg")


El código que use en primer instancia con standart_io es
#include <16f876.h>

#fuses XT,NOWDT, NOPROTECT,NOLVP

#use delay (clock= 4000000)//4mhz, esto habilita el delay_ms()

#define lcd_data_port getenv("sfr:portb")
#include <lcd.c>


#include <kbd.c> /*la libreria ya esta editada para que se pueda usar el puerto B*/


#use standard_io(B)

void main()
{        char k=0;
         int x;
         lcd_init();//se enciende el lcd, de 2 filas X 16 columnas
         delay_ms(50);
         kbd_init();// se habilita el teclado
         delay_ms(50);
         //disable_interrupts(GLOBAL);
         port_b_pullups(true);// SE pone en 0 el bit 7 del option_reg
        lcd_putc("\fListo...\n");
         while(1)
         {
       
           k=kbd_getc();//esta funcion lee el caracter que se apreta en el teclado de 3x4
       
           x=k-48;//conversion numerica
           if (k!=0){
                   
                     if (k=='*')
                        lcd_putc('\f');
                     else{
                       
                         printf(lcd_putc,"\f car=%c",k); //imprime caracter
                         delay_ms(500);
                         printf(lcd_putc,"\f car=%u",k); //imprime valr ascii
                         delay_ms(500);
                         printf(lcd_putc,"\f car=%u",x); //imprime valor numerico
                         delay_ms(500);
                         lcd_putc("\f Listo...");
                        }//fin del else
         }
         
         }//fin de while


//enable_interrupts(GLOBAL);

}

por otra parte, el código que use con fast_io() es el siguiente

#include <16f876.h>

#fuses XT,NOWDT, NOPROTECT,NOLVP

#use delay (clock= 4000000)//4mhz, esto habilita el delay_ms()

#define lcd_data_port getenv("sfr:portb")
#include <lcd.c>


#include <kbd.c> /*la libreria ya esta editada para que se pueda usar el puerto B*/


#use fast_io(B)

void main()
{        char k=0;
         int x;
         lcd_init();//se enciende el lcd, de 2 filas X 16 columnas
         delay_ms(50);
         kbd_init();// se habilita el teclado
         delay_ms(50);
        // disable_interrupts(GLOBAL);
         port_b_pullups(true);// SE pone en 0 el bit 7 del option_reg
        lcd_putc("\fListo...\n");
         while(1)
         {
           set_tris_b(0b11111111);
         
           k=kbd_getc();//esta funcion lee el caracter que se apreta en el teclado de 3x4
       
           x=k-48;//conversion numerica
           set_tris_b(0b00000000);
         
           if (k!=0){
                   
                     if (k=='*')
                        lcd_putc('\f');
                     else{
                       
                         printf(lcd_putc,"\f car=%c",k); //imprime caracter
                         delay_ms(500);
                         printf(lcd_putc,"\f car=%u",k); //imprime valr ascii
                         delay_ms(500);
                         printf(lcd_putc,"\f car=%u",x); //imprime valor numerico
                         delay_ms(500);
                         lcd_putc("\f Listo...");
                        }//fin del else
         }
         
         }//fin de while


//enable_interrupts(GLOBAL);

}


POR FAVOR AYUDA!!!!!!!!
Desde ya muchas gracias!!

Cristian