TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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