ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
1046557 Топик полностью
VLLV (23.10.2020 17:50, просмотров: 862) ответил Tpoeшник на Правильно ли я понимаю, что предлагается внутри прерывания детектить ноль в счетчике программного таймера и генерить евент в систему или некое прерывание?
Угу, вот такое УГ 




volatile uint8_t background;

volatile uint16_t valve_close_delay;

volatile uint8_t blink_count;

volatile uint8_t blink_flag;



volatile uint16_t sec_count;

volatile uint8_t wdt_count;

volatile uint16_t _500ms_count;

volatile uint16_t _100ms_count;

volatile uint16_t _200ms_count;

volatile uint16_t capt_timer;

volatile uint32_t op_count;

volatile uint32_t beep_time;

volatile uint16_t beeps_count;

volatile uint16_t sound_count;



// #define bSound	0x01

#define	b100ms	0x02

#define	b200ms	0x04

#define b500ms	0x08

#define bSec 0x10

#define bOpOver	0x20

#define bWdt	0x40

#define bMin 0x80



//******* DELAY SUPPORT *******//

volatile uint32_t delay_count;

// volatile u8 wdt_flag;

// volatile s32 last_CU_time;



void StartDelay(uint32_t ms)

{	__disable_interrupt();

 delay_count=ms;

 __enable_interrupt();}



void DelayMs(uint32_t ms)

{	StartDelay( ms * 10L );

   while(delay_count>0)

 CheckTimeAndResetWDT()

   ;



// WDT_RESET();

}



void Delay(uint32_t _100us)

{	StartDelay( _100us );

   while(delay_count>0)

 CheckTimeAndResetWDT()

   ;

}



void StartOperation(uint32_t time)

{ op_count = time;

 background&=~bOpOver;

}



char DelayOver(void)

{	return (delay_count==0); }



void	Restart100ms(void)	{ _100ms_count=N10Hz; background&=~b100ms;	}

void	Restart500ms(void)	{ _500ms_count=N2Hz; background&=~b500ms;	}

void	RestartSecond(void)	{ sec_count=N1Hz;	background&=~bSec;	}



#ifdef APPL



/*

void Beep (uint16_t ms, char beeps)

{	if (se[nSound] == sndALWAYS_OFF)

  return;

    beep_time=ms;

 beeps_count=beeps<<1;

    sound_count=ms;

}

*/



#endif



void BackgroundService100us(void)

{



/*



 if (com1.timeout)

  com1.timeout--;



 if (com1.rx_timeout<255)

  com1.rx_timeout++;



 if (com3.timeout)

  com3.timeout--;



*/

 if (opto_tx_busy)

 {	opto_rx_disable=1;

  opto_rx_delay = 0;

 }

 else

 {	if (opto_rx_delay < OPTO_RX_DELAY)

   opto_rx_delay++;

  else

   opto_rx_disable = 0;

 }



 if (valve_close_delay)

  valve_close_delay--;



 if (delay_count)

   delay_count--;



 if (op_count)

  op_count--;



 if (opto_timeout)

  opto_timeout--;



 if (sec_count)

  sec_count--;

 else

 {	sec_count=N1Hz;

  background|=bSec;

 }



 if (_500ms_count)

  _500ms_count--;

 else

 {	_500ms_count=N2Hz;

  background|=b500ms;

 }



 if (_200ms_count)

  _200ms_count--;

 else

 {	_200ms_count=N5Hz;

  background|=b200ms;

 }



 if (_100ms_count)

  _100ms_count--;

 else

 {	_100ms_count=N10Hz;

  background|=b100ms;

 }



 if (wdt_count)

  wdt_count--;

 else

 {	wdt_count=N50Hz;

  background|=bWdt;

 }



}



tEVENT GetTimerEvent(void)

{

 if (background&b100ms) {	background&=~b100ms; return (ev100ms);	}

 if (background&b200ms)	{	background&=~b200ms; return (ev200ms);	}

 if (background&b500ms)	{	background&=~b500ms; return (ev500ms);	}

 if (background&bSec) {	background&=~bSec; return (evSec);	}

 if (background&bMin)	{	background&=~bMin; return (evMin);	}

 return(evNo);

}



void CheckTimeAndResetWDT(void)

{if	(background&bWdt)

 {	background&=~bWdt;

//	TogglePin(PulseWdt);

 }

}



void BackgroundInit(void)

{	background=0;

 wdt_count=1;

 _100ms_count=2;

 _500ms_count=4;

 sec_count=5;

//	min_count=6;

}