Развивающая функция миллис ардуино - PullRequest
0 голосов
/ 10 марта 2020

Я ищу, как разработать функцию, аналогичную функции Millis Arduino на языке Fore C (это специальный язык и использовать тот же синтаксис C). Он не поддерживает библиотеку time.h, поэтому я нашел этот метод для разработки функции millis:

int clock;
int millis(){
while(1){
 clock++;
 return clo
}
}

, но когда я вызываю эту функцию в этой функции:

void drive_buzzer()
{

  typedef enum { e_sys_wait_buz, e_play_buz, e_end_buz, e_silence_buz} buz_state_t;
  static unsigned char buz_state = e_sys_wait_buz;
  static unsigned long timer = 0;


 switch ( buz_state ) {
  // Waiting for a sound to emit...
  case e_sys_wait_buz:
    if ( g_snd.snd_evt )
    {
      g_snd.repeat--;
      timer = millis()+g_snd.duration;
      //tone(BUZZER_PIN,g_snd.freq);  
     // pwm(g_snd.freq,0.5);
      printf("%s\n","bbbbbbbbbbbbbbbbbbbbbbbbbbbbeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeepppp" );   
      buz_state = e_play_buz;
      printf("%d\n",millis() );
      printf("%ld\n",timer );
    }
    break;

  // Play the sound
  case e_play_buz:

      if ( millis() > timer ) {
        //noTone(BUZZER_PIN);
        //printf("%s\n","e_play_buz" );   
        buz_state = e_end_buz;
      }
    break;

  // Stop the sound
  case e_end_buz:
    if ( g_snd.repeat != 0 ) { 
        g_snd.repeat--;
        //printf("%s\n","e_end_buz" );  
        timer = millis()+g_snd.interval;
        buz_state = e_silence_buz;
    }
    else
      buz_state = e_sys_wait_buz;
    break;

  // Silence interval between two sounds
  case e_silence_buz:
    if ( millis() > timer ) {
      //tone(BUZZER_PIN,g_snd.freq); 
      //printf("%s\n","e_silence_buz" );   
      timer = millis()+g_snd.duration;
      buz_state = e_play_buz;
    }
    break;
  default:
    break;
 }

}

Это работает только в первом случае :( Любая идея или полезные ссылки, как я могу имитировать поведение часов (без использования какой-либо библиотеки) Спасибо!

1 Ответ

0 голосов
/ 10 марта 2020

Вам необходимо реализовать прерывание по таймеру, которое регулярно обновляет вашу переменную clock. Ваша функция millis() тогда просто вернет значение clock. Чтение clock изнутри millis должно быть атомом c.

...