Добавил:
Eatmore
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:отчеты по лабораторным работам / будильник / Alarm5 / INCLUDE / timers
.h#ifndef __TIMERS__H
#define __TIMERS__H
// *.c file include "aduc812.h"
// *.c file include "interrupt.h"
// define modes of timer0 & timer1
#define TM_MODE_13 0x00
#define TM_MODE_16 0x01
#define TM_MODE_8_AUTO_RELOAD 0x02
#define TM_MODE_8_SPLIT 0x03
#define TM_MODE_COUNTER 0x04
#define TM_MODE_GATE 0x08
#define TM_MODE_16_AUTO_RELOAD 0x10
#define TM_MODE_16_CAPTURE 0x30
// define timer states
#define TM_IS_FULL(tm_num) ((tm_num>=2)? TF2 :((tm_num)? TF1 : TF0))
#define TM_RUN(tm_num) ((tm_num>=2)? TR2 :((tm_num)? TR1 : TR0))
#define TM_ENABLED(tm_num) ((tm_num>=2)? ET2 :((tm_num)? ET1 : ET0))
// define timer's data registers
#define TM_DATAH(tm_num) ((tm_num>=2)? TH2 :((tm_num)? TH1 : TH0 ))
#define TM_DATAL(tm_num) ((tm_num>=2)? TH2 :((tm_num)? TL1 : TL0 ))
//
#define TM_GET_MODE(tm_num) ((tm_num>=2)?\
(CAP2 ? TM_MODE_16_CAPTURE : TM_MODE_16_AUTO_RELOAD)|(CNT2 ? TM_MODE_COUNTER : 0)\
:((tm_num)? TMOD >> 4 : TMOD & 0x0F)\
)
//
#define TM_SET_MODE(tm_num, mode) {\
if(tm_num>=2) \
{\
if(mode & 0x20) CAP2 = 1; \
else CAP2 = 0; \
\
if(mode & TM_MODE_COUNTER) \
CNT2 = 1; \
else CNT2 = 0; \
}\
else\
{\
TMOD &= (tm_num)? 0x0F : 0xF0; \
TMOD |= ((mode)&0x0F)<<((tm_num)<<2);\
}\
}
//
#define TM_INIT(tm_num, mode, T) {\
unsigned int tick_cnt; \
TM_RUN(tm_num) = 0; \
TM_SET_MODE(tm_num, mode) \
if(tm_num>=2) \
{\
tick_cnt = 0xFFFF - T; \
RCAP2H = tick_cnt >> 8; \
RCAP2L = tick_cnt & 0xFF;\
}\
else\
switch(TM_GET_MODE(tm_num)) \
{\
case TM_MODE_13: \
tick_cnt = 0x1FFF - T; \
TM_DATAH(tm_num) =(tick_cnt)>>5; \
TM_DATAL(tm_num) = tick_cnt & 0x1F;\
break; \
\
case TM_MODE_16: \
tick_cnt = 0xFFFF - T; \
TM_DATAH(tm_num) = tick_cnt >> 8; \
TM_DATAL(tm_num) = tick_cnt & 0xFF;\
break; \
\
default: \
tick_cnt = 0xFF - T; \
TM_DATAH(tm_num) = tick_cnt & 0xFF;\
TM_DATAL(tm_num) = tick_cnt & 0xFF;\
}\
TM_ENABLED(tm_num) = 1; \
TM_RUN(tm_num) = 1; \
}
//
#define TICK_PER_MS 922
#define TM_DEF_MS_TIMER(ms_timer) \
INTERRUPT(tm_ms_intr, (ms_timer)*2+1,\
tm_ms_cnt++; \
if(ms_timer < 2)\
TM_INIT( \
ms_timer, \
TM_MODE_16, \
TICK_PER_MS \
);\
)
#define TM_INIT_MS_TIMER(ms_timer)\
{\
if(ms_timer > 2) \
return; \
\
tm_ms_cnt = 0; \
setUserVector(ms_timer*2+1, (void *)tm_ms_intr); \
TM_INIT( \
ms_timer, \
((ms_timer)==2)? TM_MODE_16_AUTO_RELOAD : TM_MODE_16, \
TICK_PER_MS \
)\
}
//
void tm_ms_delay (unsigned long);
//
#define TM_DEF_FUNCS \
unsigned char tm_get_mode(unsigned char tm_num) \
{ return TM_GET_MODE(tm_num); } \
\
void tm_set_mode(unsigned char tm_num) \
TM_SET_MODE(tm_num, mode) \
\
void tm_init(unsigned char tm_num, unsigned char mode, unsigned int T)\
TM_INIT(tm_num, mode, T) \
#endif //__TIMERS__H