⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sigtimer.c

📁 ATmega64+12864液晶
💻 C
字号:

/*
file name:intsignal.c 
function:handle the cpu relate signal
author :Einsn
date:2006-12-26

Modify :2007-01-10

*/

#include "sigtimer.h"

#include "avr/interrupt.h"


/*
 * User Configuration, Hardware relation 
 * Can be modify by the specified CPU and application
 * 
 */





/*
 *
 *  the system Max function can be run in the interrupt 
 *
 */
#define TIMERHOOKSIZE    5


/*
 *
 *  The CPU  related Timer start function
 *
 */

#define INITVALUE   (((F_CPU/1000)*TIMERINTERVAL)/1024)

inline static  void SIGTimerStart(uint16 ms){
uint32 temp=F_CPU/1000;
temp*=ms;
temp=temp/1024;
TCNT0=0;
OCR0=(uint8)temp;
//OCR0=(uint8)INITVALUE;
TIMSK|=(1<<OCIE0);//enalbe the interrupt;
TCCR0=(1<<WGM01)|7;
}






/*
 *
 *  The CPU  related Timer stop function
 *
 */
inline static void SIGTimerStop(void){
TIMSK&=~(1<<OCIE0);//disable  the interrupt 
TCCR0=0;//stop the timer;
}


//2007-04-13 add soft timer

#define SOFTTIMERMAXNUM    5

//soft timer  
//16bit  max time is 32768/10  ms  65s

#define CNTSOFTTIMERLOADDEF(x)   (x*(1000/TIMERINTERVAL))

struct SoftTimer{
uint16  InUse:1;
uint16 Cnt:15;
};




typedef struct tagSIGTIMER
{
//uint8  InUse;
#ifdef TIMERHOOK 
SIGNALHOOK  SignalHook[TIMERHOOKSIZE];
void *pData[TIMERHOOKSIZE];
#endif
unsigned char HookCount;

#ifdef SOFTTIMER
volatile struct SoftTimer  SoftTimer[SOFTTIMERMAXNUM];
#endif 
unsigned char SoftTimerConut;

}SIGTIMER,*PSIGTIMER;


static SIGTIMER SigTimer;


#ifdef SOFTTIMER

//volatile  uint16  SoftTimer[SOFTTIMERMAXNUM];

/* 
 * Name:SoftTimerStart
 * Function:
 * 
 * In:ival unit in second
 * Out:
 *
 * Author:Einsn Liu
 * Date:2007-04-11
 * 
 *
*/
timerid  SoftTimerAdd(uint16 isec){
uint8  i;
if(SigTimer.SoftTimerConut>SOFTTIMERMAXNUM)return 0;

for(i=0;i<SOFTTIMERMAXNUM;i++){
	if(SigTimer.SoftTimer[i].InUse==0){
		SigTimer.SoftTimerConut++;
		SigTimer.SoftTimer[i].InUse=1;
		SigTimer.SoftTimer[i].Cnt=CNTSOFTTIMERLOADDEF(isec);
		break;
		}
	}
if(SigTimer.SoftTimerConut==1&&SigTimer.HookCount==0){
	SIGTimerStart(TIMERINTERVAL);
}

if(i<SOFTTIMERMAXNUM) return (i+1);//no free 

return 0;

}

/* 
 * Name:SoftTimerStart
 * Function:
 * 
 * In:ival unit in second
 * Out:
 *
 * Author:Einsn Liu
 * Date:2007-04-11
 * 
 *
*/
void  SoftTimerRestart(timerid id,uint16 isec){
SigTimer.SoftTimer[id-1].Cnt=CNTSOFTTIMERLOADDEF(isec);
}

/* 
 * Name:SoftTimerStartMS
 * Function:
 * 
 * In:ival unit in second
 * Out:
 *
 * Author:Einsn Liu
 * Date:2007-04-11
 * 
 *
*/

void  SoftTimerRestartMS(timerid id,uint16 ims){
SigTimer.SoftTimer[id-1].Cnt=ims/TIMERINTERVAL;
}


/* 
 * Name:SoftTimerRemove
 * Function:
 * 
 * In:ival unit in second
 * Out:
 *
 * Author:Einsn Liu
 * Date:2007-04-11
 * 
 *
*/
void  SoftTimerRemove(timerid id){
if(SigTimer.SoftTimer[id-1].InUse==1){
	
	SigTimer.SoftTimer[id-1].InUse=0;
	SigTimer.SoftTimer[id-1].Cnt=0;
	SigTimer.SoftTimerConut--;
if(SigTimer.SoftTimerConut==0&&SigTimer.HookCount==0){
	SIGTimerStop();
}

}
}


/* 
 * Name:SoftTimerTest
 * Function:
 * 
 * In:
 * Out:1:is time to ;0 no
 *
 * Author:Einsn Liu
 * Date:2007-04-14
 * 
 *
*/
uint8  SoftTimerTest(timerid id){
if(SigTimer.SoftTimer[id-1].InUse==1)
	return SigTimer.SoftTimer[id-1].Cnt==0?1:0;
return 0;
}


#endif 

/*
name:SIGTimerInit()
function:
author:einsn
date :2006-12-26

modify :2007-01-10
redesign the timer system

*/
void SIGTimerInit(void){
uint8 i;
#ifdef TIMERHOOK
SigTimer.HookCount=0;
for(i=0;i<TIMERHOOKSIZE;i++){
	SigTimer.SignalHook[i]=NULL;
	SigTimer.pData[i]=NULL;
		}
#endif 
#ifdef SOFTTIMER
//initial the soft timer 
SigTimer.SoftTimerConut=0;
for(i=0;i<SOFTTIMERMAXNUM;i++){
	SigTimer.SoftTimer[i].InUse=0;
	SigTimer.SoftTimer[i].Cnt=0;
	}
#endif 
}



#ifdef TIMERHOOK

/*
file name:SIGTimerLoad.c 
function:handle the cpu relate signal
author :Einsn
date:2006-12-26

modify :2007-01-10
redesign the timer system

*/

int8 SIGTimerLoad(SIGNALHOOK SignalHook,void *pdata){
uint8 i;
PSIGTIMER pSIGTimer=(PSIGTIMER)&SigTimer;
if(pSIGTimer->HookCount>=TIMERHOOKSIZE){//not enough buf
	return -1;
	}

for(i=0;i<TIMERHOOKSIZE;i++){
	if((pSIGTimer->SignalHook[i]==SignalHook)&&(pSIGTimer->pData[i]==pdata)){//the hook has already exist
		return -1;
		}
	}
//if not exist.to if have 
for(i=0;i<TIMERHOOKSIZE;i++){
	if(pSIGTimer->SignalHook[i]==NULL){
		pSIGTimer->SignalHook[i]=SignalHook;
		pSIGTimer->pData[i]=pdata;
		pSIGTimer->HookCount++;
		break;
		}
	}
if(pSIGTimer->SoftTimerConut==0&&pSIGTimer->HookCount==1){
	SIGTimerStart(TIMERINTERVAL);
}

return 0;
}


int8 SIGTimerRemove(SIGNALHOOK SignalHook,void *pdata){
uint8 i;
PSIGTIMER pSIGTimer=(PSIGTIMER)&SigTimer;

if(pSIGTimer->HookCount==0){//not enough buf
	return -1;
	}

for(i=0;i<TIMERHOOKSIZE;i++){
	if((pSIGTimer->SignalHook[i]==SignalHook)&&(pSIGTimer->pData[i]==pdata)){
		pSIGTimer->SignalHook[i]=NULL;
		pSIGTimer->pData[i]=NULL;
		pSIGTimer->HookCount--;
		break;
		}
	}

if(i>=TIMERHOOKSIZE){
	return -1;
	}

if((pSIGTimer->SoftTimerConut==0)&&pSIGTimer->HookCount==0){
	SIGTimerStop();
}

return 0;
}


#endif 

/***
   *
   *   system timer interrupt function
   *   2007-1-10
   *
 ***/

SIGTimerSignal(){
uint8 i;
//sei();//enable the interrupt.
//2007-04-13 add for soft timer
#ifdef SOFTTIMER
for(i=0;i<SOFTTIMERMAXNUM;i++){
	if(SigTimer.SoftTimer[i].Cnt>0){
		SigTimer.SoftTimer[i].Cnt--;
		}
	}
#endif 
#ifdef TIMERHOOK
for(i=0;i<TIMERHOOKSIZE;i++){
	if(SigTimer.SignalHook[i]!=NULL){
		SigTimer.SignalHook[i](SigTimer.pData[i]);
		}
	}
#endif 
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -