Autor Tema: Prioridad de interrupciones Timer0 18F4550  (Leído 3513 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Prioridad de interrupciones Timer0 18F4550
« en: 26 de Marzo de 2011, 21:16:44 »
Hola a todos!

He realizado un programa muy sencillo el cual mediante una interrupción hace parpadear un led conectado a RC2.

Como es un programa que estoy utilizando para aprender a manejar las interrupciones decidí solo por capricho que la interrupción sea de alta prioridad.

El programa funciona bien, pero me he quedado con una duda...

¿Como indico que cuando el timer 0 desborda quiero que el programa vaya a la rutina de alta o baja prioridad? por lo que he podido ver solo puedo indicarle al timer si quiero o no que ejecute la interrupción mediante el bit TMR0IE.

En el registro INTCON puedo configurar la prioridad, pero eso es para las interrupciones en general creo...

Si tengo que aclarar algo más háganmelo saber.

Muchas Gracias!

Saludos.
Código: [Seleccionar]
/*declaración de funciones*/
void DelayFor18TCY(void);
void DelayPORXLCD(void);
void DelayXLCD(void);

void high_isr(void);

/*interrupciones*/

#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
     INTCONbits.TMR0IF = 0; //limpio el flag de interrupcion
           LATCbits.LATC2=1; //prendo el led
           Delay1KTCYx(120); // delay 10mseg
           LATCbits.LATC2=0; //apago el led
}



/*****Programa principal******/

void main (void)
{

TRISB=0b00000000;      // Puerto B como salidas
LATB=0b00000000;       //todas las salidas abajo
TRISC=0b00000000;      // Puerto C como salidas
LATC=0b00000000;       //todas las salidas abajo



OpenXLCD(FOUR_BIT&LINES_5X7);   //inicializamos LCD con varias lineas y caracteres 5x7
while( BusyXLCD() );
WriteCmdXLCD(LINE_0); // Nos posicionamos en la posición 0
while( BusyXLCD() );
putrsXLCD("T0 interrupt");
while( BusyXLCD() );
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);



INTCONbits.GIEH = 1; //Habilita todas las interrupciones de alta prioridad

OpenTimer0 ( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_128 );

while(1)
      {}
     
     
     
}   


Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prioridad de interrupciones Timer0 18F4550
« Respuesta #1 en: 26 de Marzo de 2011, 23:31:00 »
Existe el bit IPEN que habilita las prioridades, y además cada fuente de interrupción (excepto INT0) tiene el bit xIP para seleccionar prioridad.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Re: Prioridad de interrupciones Timer0 18F4550
« Respuesta #2 en: 27 de Marzo de 2011, 06:35:54 »
Suky, muchas gracias por tu respuesta, ahora pude ver en el datasheet todo claramente, tenía una mezcla en la cabeza y tu comentario me ayudo a encontrar lo que bucaba.

Gracias!!

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Prioridad de interrupciones Timer0 18F4550
« Respuesta #3 en: 27 de Marzo de 2011, 09:44:55 »
Hola! No había visto el código y hay un detalle, las interrupciones deben ser cortas y rápidas, no debe usarse delays o printf, ect. En casos sencillos no es problema, pero cuando hay varias interrupciones si, ya que no la atenderás como corresponde.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Re: Prioridad de interrupciones Timer0 18F4550
« Respuesta #4 en: 27 de Marzo de 2011, 19:33:12 »
Comprendido. Lo voy a tener en cuenta, en este caso era solo para poder verificar visualmente el funcionamiento de la interrupción.

Saludos! y Gracias nuevamente!