Menú
Foros
Nuevos mensajes
Buscar en foros
Novedades
Nuevos mensajes
Nuevos recursos
Última actividad
Recursos
Últimas revisiones
Buscar recursos
Acceder
Registrarse
Novedades
Buscar
Buscar
Buscar sólo en títulos
De:
Nuevos mensajes
Buscar en foros
Menú
Acceder
Registrarse
Install the app
Instalar
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Problema con CCS (Interrupción RDA)
JavaScript está desactivado. Para una mejor experiencia, por favor, activa JavaScript en el navegador antes de continuar.
Estás usando un navegador obsoleto. No se pueden mostrar este u otros sitios web correctamente.
Se debe actualizar o usar un
navegador alternativo
.
Responder al tema
Mensaje
[QUOTE="Psyke, post: 1042432, member: 266754"] Hola, no quise abrir otro hilo porque me pareció mejor publicar acá. Disculpen si hice lo incorrecto. Estoy trabajando con dos PICs, un 16f877a y un 18f4550. Los estoy comunicando por USART, y el primero es el emisor, y el 18f es el receptor. Bien, en el emisor hice una pequeña estructura para enviar datos constantemente, un while con un putc cada 250 ms, detallado a continuación. Lo que deseo hacer es un protocolo de comunicación. No sé si se hacen así, pero es lo que se me ocurrió. La idea es tener un arreglo de 5 enteros en el emisor, y el 4 entero tiene el dato que utilizo para realizar acciones. [code]while(true) { for(i=0;i<5;i++) { putc(DATOS[i]); delay_ms(250); } }[/code] El emisor ya comprobé que envía bien los datos. El problema viene con el receptor. He hecho otros programas sencillos y recibía bien, pero con este no quiere funcionar, y lo necesito para continuar con el desarrollo. Lo dejo a continuación. [code]#include <18f4550.h> #fuses INTRC_IO,NOWDT,PLL1,CPUDIV1,NOFCMEN,NOPUT,BROWNOUT,NOLVP,NOMCLR,NOWRT,NOCPD #use delay(clock=8000000) #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, ERRORS) int DATOS[5]; //0=SINCRO, 1=INICIO, 2=DIREC, 3=DATO, 4=CHECKSUM int i,j; #int_RDA void RDA_isr() { if (i<5) { DATOS[i] = getc(); if (DATOS[0] == 0xAA) { output_toggle(pin_b7); i++; } else { output_toggle(pin_b6); i=0; } //printf("%u",DATOS[i]); } } void main() { setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_PLL_OFF); enable_interrupts(INT_RDA); enable_interrupts(GLOBAL); while(1) { } } [/code] Poniendo además un output_toggle(pin_b7) dentro de la interrupcion, tampoco producía nada. Lo que me llamaba la atención es que al alimentar el circuito, el LED comenzaba encendido. Así que presumo que entra a la interrupción por una vez y no sale. Y ya estoy tomando el dato que llega, por lo que descarto que el error sea que no se quita el flag de la interrupción. Tambien probé con clear_interrupt(int_rda) y nada. EDITO: Si quito el if(i<5) en la interrupcion, funcionan los LEDs. Pero obviamente deja de cumplir la función que quiero que haga. Resumiendo, se ve que el if(i<5) "no le gusta", pero ya probe con un while(i<5) y tampoco. así que ya no se. Quedaría así [code]#int_RDA void RDA_isr() { DATOS[i] = getc(); if (DATOS[0] == 0xAA) { output_toggle(pin_b7); i++; } else { output_toggle(pin_b6); i=0; } //printf("%u",DATOS[i]); clear_interrupt(INT_RDA); }[/code] [/QUOTE]
Verificación
Responder
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Problema con CCS (Interrupción RDA)
Arriba