Autor Tema: problema con "logic contention detected"  (Leído 1208 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cgardoni

  • PIC10
  • *
  • Mensajes: 4
problema con "logic contention detected"
« 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



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


 

anything