Externi interrupt parametricky

admin.mtech admin.mtech@gmail.com
Úterý Prosinec 16 09:17:55 CET 2008


Možno pomôže táto idea.

Ja používam pri AVR  timer1 pre viacero udalostí.
Tak to riešim tak, že do prerušenia "inštalujem" funkciu ktorá má v 
danej časti programu zavolať od prerušenia od timer1.

// ********************************************************* start modul 
timer.c
// deklarácie:
//function pointer
FuncPtr FUN_Ptr_0;
FuncPtr FUN_Ptr_1;
FuncPtr FUN_Ptr_2;
_Bool              T1_IRQ_Handler[3];


// *************************************************
// T I M E R     T  1 -----------------------------
// *************************************************
// obsluha prerusenia - pre rozne kompilery
//++++++++++++++++++++++++++++++++++++++++++ TIMER Compare A
 #ifdef __ICCAVR__                                                   // 
IAR C
 #pragma vector = TIMER1_COMPA_vect
  __interrupt void TIMER1_COMPA_Name()
 #elif __GNUC__ > 0                                                // GNU C
  ISR(TIMER1_COMPA_vect)
 #elif __IMAGECRAFT__                                                   
// Image Craft C
  #pragma interrupt_handler iv_TIMER1_COMPA_Name:iv_TIMER1_COMPA        
                          
  void iv_TIMER1_COMPA_Name(void)
 #elif __CODEVISIONAVR__                                        // HP 
InfoTech Code Vision AVR
  interrupt [TIM1_COMPA] void TIM1_COMPA_name(void)
 #elif 
__CROSSWORKS                                                                                              
// Rowley CrossWorks C
  void TIMER1_COMPA_Name(void) __interrupt[TIMER1_COMPA_vect]
 #else
  #error "Neznamy kompiler !"
 #endif
{
 DI;
 //Debug_Message("IRQ TIMER1_COMPA_vect\r\n");
 if(T1_IRQ_Enable[0]==_TRUE)                 // mame toto IRQ povolene?
 {
  if(T1_rCounter[0]>0)T1_rCounter[0]--;
  else
  {          // nastav priznak, zakaz prerusenie
   if(T1_IRQ_Handler[0]) FUN_Ptr_0();    // ak je nainstalovana obsluha 
prerusenia, tak ju zavolaj...
   //Debug_Message("IRQ TIMER1_IRQ!!!\r\n");
   T1_IRQ_CMP_Flag[0] = _TRUE;             // nastav priznak, zakaz 
prerusenie
  }     
 }
 OCR1A = TCNT1 + T1_OCR_Reload[0];
 EI;
}


// nainstaluje lubovolnu funkciu doi prerusenia od timera 1 index INDEX.
// tasto rutina sa zavola vzdy ked nastane prerusenie od nastaveneho casu...
void Install_Timeout_T1_Handler(void (*FuncPtr)(void), unsigned char 
T1TimerIndex)
{
 switch(T1TimerIndex)
 {
  case 1: FUN_Ptr_1 = FuncPtr; break;
  case 2: FUN_Ptr_2 = FuncPtr; break;
  default:FUN_Ptr_0 = FuncPtr; break;
 }
 T1_IRQ_Handler[T1TimerIndex] = _TRUE;
}
// ********************************************************* end modul 
timer.c


// ********************* niekde v programe......
void RF_Reset_RX(void)        // funkcia volana pri zlom prijme.... od 
timeoutu.
{
 DI;
 //Debug_Message("Timeout Reset. BitCount:%d",RX_bit_count);
 RX_Char = 0;
 RX_bit_count = 0;
 EI;
}


..
..
..
//cast funkcie ktora inicializuje prijem dat. Pokial nastane timeout 
medzi datami, zavolaj RF_Reset_RX()
 Install_Timeout_T1_Handler(&RF_Reset_RX, RX_TimeoutTimer );            
        // nainstaluj prerusovaciu, resetovaciu rutinu pre timeout
.. // a teraz prijmam data s tym, ze ked nastane timeout, program sa 
dostane do funckie RF_Reset_RX()...
..
..



dúfam že pomôže.....

-mt-



Marek Sembol  wrote / napísal(a):
> No pro zacatek by mozna nebylo od veci vedet o jaky MCU se jedna...
> Marek
>
> 2008/12/14 trm83 <trm83@seznam.cz>:
>   
>> Dobry den,
>>
>> mel bych otazku na zkusenejsi kolegy. Delam s mikrokontrolerem aplikaci, kde si
>> uzivatel moji softwarove knihovny pri inicializaci zvoli port a pin na kterem
>> pobezi nejaka komunikace. Kdyz zacnou prichazet data, spusti se externi
>> interrupt na tom vybranem vstupnim pinu a tim me upozorni ze mam zacit prijimat.
>> V obsluze externiho preruseni se mi uz zavola nejaka moje funkce pro prijem
>> dat.
>>
>> Problem je, ze nevim jak obsluhu toho preruseni udelat parametricky - uzivatel
>> muze v inicializaci vybrat porty A-E a ja budu muset do vsech techto peti obsluh
>> interruptu napsat volani me funkce?
>>
>> Hezky vecer.
>> Martin Poller.
>>
>> _______________________________________________
>> HW-list mailing list  -  sponsored by www.HW.cz
>> Hw-list@list.hw.cz
>> http://list.hw.cz/mailman/listinfo/hw-list
>>
>>     
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>   




Další informace o konferenci Hw-list