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