TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: sha en 15 de Noviembre de 2010, 14:16:32
-
Estoy haciendo un programa para recibir de PC.
Cuando no habilito la interrupción y pulso teclas en teclado, despúes no me funciona la interrupción.
Me podrías decir porque es esto.
Gracias.
-
Si no habilitas la interrupción, no va a funcionar la interrupción. O no te has explicado correctamente :mrgreen:
-
Soy malo explicandome.
Lo que digo es que si yo mando algo desde PC a PIC sin estar habilitadas las interrupciones.
Después cuando las habilito, ya no me funciona la interrupción.
Gracias por contestar.
Lo dicho soy malo explicando.
-
Soy malo explicandome.
Lo que digo es que si yo mando algo desde PC a PIC sin estar habilitadas las interrupciones.
Después cuando las habilito, ya no me funciona la interrupción.
Gracias por contestar.
Lo dicho soy malo explicando.
Tampoco se entendió mucho, pero asegúrate de que el buffer está vacío, y si hubo un overflow borrar los bits correspondientes y reiniciar la comunicación. En el datasheet del microcontrolador se explica eso.
Saludos!
-
Hola de nuevo.
He echo este programa de prueba.
Lo tengo conectado a hyperterminal.
Cuando pulso PIN_A0 habilito interrupción, pulso cualquier tecla PC y me aparece en LCD.
Si pulso PIN_A1 deshabilito interrupción, pulso cualquier tecla en teclado de PC y no me aparece en LCD pero en cuanto pulso PIN_A0 me aparecen los caracteres que había pulsado cuando estaba deshabilitada la interrupción.
Si pulso muchas teclas estando deshabilitada interrupción se queda colgado PIC.
Este es el programa.
Gracias.
#include <16F876.h>
#include <STRING.h>
#fuses XT,NOWDT,PUT,NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8) //manejo del RS232
#include <flex_lcd.h>
void serial_isr (void);
void Add_buffrec (char c);
#int_rda
void serial_isr()
{
output_low(PIN_B0);
if(kbhit())
{
Add_buffrec(getc());
}
}
void Add_buffrec (char c)
{
output_low(PIN_B1);
lcd_putc(c);
}
void main (void)
{
SET_TRIS_A(0xFF); //Configuramos Puerto A como entradas
SET_TRIS_B(0x00);
OUTPUT_B(0x00);
lcd_init();
lcd_putc("Esperar");
delay_ms(5000);
lcd_init();
while (true)
{
if (input(PIN_A0))
{
enable_interrupts(GLOBAL);
enable_interrupts(int_rda);
output_high(PIN_B0);
while (input(PIN_A0))
{
}
}
if (input(PIN_A1))
{
disable_interrupts(int_rda);
while (input(PIN_A1))
{
}
}
}
}
-
Es que una cosa es que deshabilites la interrupción, y otra muy distinta que deshabilites la USART. Se te llena el buffer y por eso se te cuelga.
Tendrás que deshabilitar la USART aunque no sé cómo se hace en CCS.
-
Gracias por contestar a todos.
Si pongo setup_uart(false) o setup_uart(true), lo habilito o no.
y me funciona.
Muchas gracias.
Lo vi en el include del PIC.
-
Perfecto, pues ya aprendí cómo se hace :D
-
Hola muchachos que tal? saben que tengo un problema parecido al que tenia sha... Estoy trabajando con un GPS y la INT_RDA! pero que sucede? cuando solicito la trama que filtro para obtener los valores de la misma el PIC lo hace muy bien, pero cuaNDo envio la trama al pic por segunda vez no lo hace,o sea, solo lo hace una vez! :S para que lo vuelva a hacer debo reiniciar el micro.. mi pregunta es.... el buffer esta lleno? como lo limpiaria? por lo menos yo en mi codigo cada vez que me llega un dato limpio el registro tx.. bueno si saben como podria solucionar me avisan.. gracias desde venezuela!