Autor Tema: Pic no respeta la abilitacion de interruciones  (Leído 1377 veces)

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

Desconectado oman

  • PIC10
  • *
  • Mensajes: 14
Pic no respeta la abilitacion de interruciones
« en: 18 de Mayo de 2011, 13:51:05 »
buen dia a todos.

tengo un ploblema que no he podido resolver, quisiera que ustedes me orientaran.
el proble radica en que el pic no respeta la habilitacion/desabilitacion de las interrupciones.

enseguida parte de mi codigo:

#int_rda
void serial_isr() // Interrupcion recepcion serie USART
{
   rcvchar=0x00;  //inicializo el caracter recibido
   if(kbhit())          //si hay algo pendiente por recibir
   {
      rcvchar=getchar();   // lo descargo
      addcbuff(rcvchar); //lo añado al buffer
   }
  return;
}


void main()
{
     disable_interrupts(global);                                                                                        //
     disable_interrupts(int_rda);                                                                                      //
                                                                                                                                  //
     instruccion x;                                                                                                          //
     intruccion x+1;  // Son intrucciones ajenas a la recepcion de mensajes por la usart.     // en este lapso no me interesa guardar los datos que me estan llegando.
     intruccion x+n;                                                                                                        //


      enable_interrupts(global);
      enable_interrupts(int_rda);                                                                          // de aqui en adelante si me interesa recibir lo que se me manda.

     
     instruccion y;     //Este lapso de tiempo es el que me interesa para que el pic empiese a recibir lo que se le manda.
     intruccion y+1;  // Son intrucciones ajenas a la recepcion de mensajes por la usart.
     intruccion y+n; 


         int i;     
         for(i=0; i<=85 ;i++)      //A qui solo muestro en una lcd lo que me llega al pic.
         {
             printf(lcd_putc,"\fcbuff= %c",cbuff);
             delay_ms(2000);
         }
         printf(lcd_putc,"\f%s",cbuff);

  }   


el problema que solo se muestra codigos que me llegan al pic, pero lo que no entiendo de esto, es que son caracteres que me llegan cuando tengo desabilitado las interrupciones:

     disable_interrupts(global);
     disable_interrupts(int_rda);

pero yo supongo que el pic actua como sino respetara estas intrucciones. que estoy haciendo mal.

si no quedo claro y necesitan mas datos para entenderme mejor por favor aganmelo saber.

agradesco cualquier tipo de ayuda que me puedan dar.

saludos a todos.




Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re: Pic no respeta la abilitacion de interruciones
« Respuesta #1 en: 18 de Mayo de 2011, 20:29:28 »
Yo programa en asm pero me parece que lo que te esta faltando es configurar las entradas de datos o sea los pines que van a generar las interrupciones como entrada o salidas. Si no recibe los datos por los pines del puerto no se va a generar la interrupcion, me parece. Fijate en esos fuses que te faltan.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Pic no respeta la abilitacion de interruciones
« Respuesta #2 en: 18 de Mayo de 2011, 20:47:23 »
Hola oman.

kbhit() se usa cuando quieres saber si en el bufffer de recepcion de hardware hay un dato, cuando usas interrupcion, el hard te levanta la indicacion de interrupcion cuando hay data en el buffer, por lo que preguntar nuevamente es redundante, mejor dicho no es necesario.

El return dentro de la funcion de interrupcion no es necesario ya que el compilador realiza el procedimiento con los registros necesarios por ti, mejor dicho no es necesario.

cuando haces uso de pausas por soft: delay_ms(2000) te hara que pierdas datos recibidos por el puerto serie, mejor usa un indicador de que hay dato para enviar por USART, por ejemplo usa una variale tipo int1, en la funcion de interrupcion colocala a 1, y en el bucle principal pregunta si esta a 1 para que muestres en LCD al mismo tiempo que la colocas a 0 para que no este enviando a cada momento.

espero te sea util.

saludos
« Última modificación: 18 de Mayo de 2011, 20:49:45 por KALLITOS »
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything