ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
4 июля
110061 Топик полностью
Vit (13.01.2008 15:27, просмотров: 73) ответил sda на С удовольствием проработаю Ваш вариант.
Как-нибудь так  unsigned int pre; unsigned int last; unsigned int lo_out_val; unsigned long hi_out_val; unsigned long hi_counter_val; BOOL Capture_XFlag; void main(void){ ... pre = TCNT; last = pre; while(1){ ... __disable_interrupt();//начало атомарной процедуры last = TCNT; if(last < pre){ hi_counter_val++; } pre = last; __enable_interrupt;//конец атомарной процедуры } ... if(Capture_XFlag){ //вместо флага можно было бы проверять значение на >0, но нужно обеспечить //атомарное чтение и нельзя определить переполнение переменной удлинения //обработчик события, установка началльных значений, возможный перезапуск ... hi_out_val = 0; lo_out_val = 0; } } ISR(Timer_Capture){ last = TCNT; if(last < pre){ hi_counter_val++; } pre = last;//только уже нафиг нужно // можно было бы вставить костыль для случая возникновения Capture // во время запрещённых прерываний в фоне, но оно нафиг не нужно, // потому как если в фоне нашли переполнение, то до возникновения прерывания от Capture // (т.к. last было недавно равно pre) last будет не меньше pre. hi_out_val = hi_counter_val; lo_out_val = last; Capture_XFlag = true; }