Скачиваний:
29
Добавлен:
09.05.2014
Размер:
3.58 Кб
Скачать
#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
Соседние файлы в папке INCLUDE