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="Saint_, post: 1059638, member: 7107"] Hola unifim, lo que pasa es que cuando la interrupción RDA se activa el dato llegado por el puerto serie se guarda en el vector [I]cadena[/I], luego sale de la interrupción y antes de que llegue el o los nuevos datos la subrutina [I]limpiar_buffer()[/I] limpia el dato almacenado en el vector [I]cadena[/I]. Esto sucede para cada uno de los datos que llegan al puerto serie y por eso sucede el problema que comentas. Una solución al problema sin hacer mucho parche es usar un fin de cadena, por ejemplo '\r'(0x0d): [code] #include <16f877a.h> #include <string.h> #include <stdlib.h> #fuses NOWDT,HS,NOLVP #use delay(clock=10M) #use RS232(baud=9600,XMIT=PIN_C6,RCV=PIN_C7,stream=receptor) #bit RB0=0x06.0 #bit RB1=0x06.1 #bit RC3=0x07.3 #bit RC4=0x07.4 #bit RC7=0x07.7 int const length=10; char data; char cadena[length]; short flagcomand=0; signed int16 p=0; #int_RDA void RDA_isr(void) { static unsigned int8 i; data=fgetc(receptor); if(data=='\r') { cadena[i]=0; //fin de cadena de texto i=0; flagcomand=1; } else { cadena[i++]=data; } } void limpiar_buffer() { int j; for(j=0;j<length;j++) { cadena[j]=0x00; } } #INT_EXT // directiva de interrupcion por cambio de estado en RB0 void interrupcion_RB0() { if(RB0==1) { ext_int_edge(H_TO_L); if(RB1==1) { p=p+1; } } else { ext_int_edge(L_TO_H); if(RB1==1) { p=p-1; } } //putc(p); //puts(p); printf("\r%Ld",p); } void main() { //char valorRec[4]; //variable donde se recibira desde la cadena char c; int d; set_tris_b(0xFF); //configuro portb=in set_tris_c(0x80); //solo el Rx esta como entrada RC3=0; RC4=0; //configuracion pwm setup_ccp1(CCP_PWM); setup_timer_2(T2_DIV_BY_16,255,1); //Tpwm=1.63ms--->el ciclo de trabajo sera de 0-255 set_timer2(0); set_pwm1_duty(0); enable_interrupts(INT_RDA); enable_interrupts(INT_EXT); //habilito interrupcion RB0 ext_int_edge(L_TO_H); //configuro interrupcion por flanco de subida enable_interrupts(GLOBAL); // habilito interrupcion global while(TRUE) { //gets(valorRec); c=cadena[0]; if(flagcomand==1) { flagcomand=0; switch(c) { case 's': { //printf("%3Lu",p); //putc(p); //printf("%3u",pv); //delay_ms(500); break; } case 'i': { RC3=0; RC4=1; break; } case 'd': { RC3=1; RC4=0; break; } default: { d=atoi(cadena); set_pwm1_duty(d); //putc(p); //printf("%3Lu",p); break; } } limpiar_buffer(); } } } [/code] [/QUOTE]
Verificación
Responder
Foros
Diseño digital
Microcontroladores y sistemas embebidos
Problema con CCS (Interrupción RDA)
Arriba