Autor Tema: Interrupcion ISR  (Leído 1761 veces)

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

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Interrupcion ISR
« en: 07 de Diciembre de 2010, 14:40:05 »
Hola a todos  :), soy nuevo me acabo de registrar en el foro aunque ya tengo tiempo leyendo varios temas que me han sido mucho de ayuda. Sin embargo hoy me he quedado atorado en la interrupcion por TX, resulta que logro leer mediante la interrupcion por TX una cadena que se me envia desde una computadora, con configuraciones para el microcontrolador, el problema es que la computadora me envia la cadena muy seguido y me interrumpe demasiado el programa por lo que quiero que solo cada cierto tiempo lea el puerto TX. He intentado activar y desactivar las interrupciones cada cierto tiempo pero el programa despues de un tiempo se queda colgado si hago eso. Espero y me puedan ayudar aqui pongo parte del codigo:

Interrupcion
Código: [Seleccionar]

#pragma code Interrupcion = 0X0008
void VectorInterrupcion(void){
_asm goto ISRRecepcion _endasm
}
#pragma code

// Rutina de Interrupcion.-
#pragma interrupt ISRRecepcion
void ISRRecepcion(void){
if(PIR1bits.RCIF==1)
{

while(!DataRdyUSART());
getsUSART(Data,12); // Leemos Cadena
Delay10TCYx(70);

parametro=Data[0]; // Obtengo los datos de la cadena
comando=Data[1];
Mo_PC=Data[2];

PIR1bits.RCIF=0;       //Borro bandera

   
}
}


Principal

Código: [Seleccionar]
void main (void)
{

OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,25);

RCONbits.IPEN=0;
INTCONbits.PEIE=1;
INTCONbits.GIE=1;


contador=0;

while(1)
{
putrsUSART (" PARAMETRO: ");
putcUSART (parametro);
while(BusyUSART());
putrsUSART (" COMANDO: ");
putcUSART (comando);
while(BusyUSART());
putrsUSART (" MODULO: ");
putcUSART (Mo_PC);
while(BusyUSART());
}
}

Desconectado Diamel

  • PIC10
  • *
  • Mensajes: 13
Re: Interrupcion ISR
« Respuesta #1 en: 13 de Diciembre de 2010, 21:04:32 »
Buenas, decidi obtener los datos por el puerto serie de otra forma puesto que aunque funciona con las interrupciones se pone lento otro proceso paralelo que tengo a la lectura. Lo hize poniendo el siguiente codigo en el programa principal dentro de un while.
Código: [Seleccionar]
while(1)
{

if(PIR1bits.RCIF==1){



for(k=0; k<=1; k++)
{
while(!DataRdyUSART());
Datos[k]=getcUSART();
}

PIR1bits.RCIF=0;
gotoxyXLCD(1,2);
putsXLCD(Datos);

}

.... Contina programa



o lo que es lo mismo

Código: [Seleccionar]

while(1)
{

if(PIR1bits.RCIF==1){


getsUSART(Datos,2);
PIR1bits.RCIF=0;
gotoxyXLCD(1,2);
putsXLCD(Datos);


}


El problema ahora es que cuando intento leer una cadena de 3 o mas datos el programa se queda parado, solo me funciona de la forma que puse anteriormente pero me lee los 2 primeros caracteres de la cadena incluso en el proteus pasa lo mismo, cosa que se me hace raro pues con el metodo de la interrupcion si puedo obtener la cadena completa.

Salu2.


 

anything