ПИК микроконтроллер с использованием C

Я пытаюсь заставить этот код работать в MM:SS:FFFFFF, где MM - минуты, SS секунды и FFFFFF микросекунды, но мои минуты работают как бот. Вместо того, чтобы получать что-то вроде 01:05:873098, я получаю 00:65_873098. Спасибо за любой совет.

#include <prototype.h>
int16 overflow_count;
#int_timer1
void timer1_isr(){
overflow_count++;
}

void main(){
int32 time;

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
enable_interrupts(int_timer1);
while(TRUE){
  enable_interrupts(global);

  while(input(PUSH_BUTTON)); //Wait for press
  set_timer1(0);
  overflow_count=0;

  while(!input(PUSH_BUTTON)); //WAIT FOR RELEASE
  disable_interrupts(global);
  time=get_timer1();
  time=time+((int32)overflow_count<<16);
  time-=15; //substract overhead
  printf("Time is %02lu:%02lu.%06lu minutes.\r\n",
  time/1000000000, (time/6000000), (time/5)%1000000);
   }
}

2 ответа

Я бы предложил вам ввести некоторые промежуточные переменные, такие как "ticks", "microsecs", "secs" и "mins". Делайте вычисления шаг за шагом, от наименьшей единицы к наибольшей, не забывая вычесть каждую часть перед преобразованием следующей большей части. Убедитесь, что единицы работают на каждом этапе преобразования (например, не складывайте и не вычитайте значения, которые имеют разные единицы). Подумайте, как бы вы сделали это карандашом и бумагой: вероятно, не так, как вы это написали! Когда вы разобьете это так, вам будет проще понять логику.

Вы никогда не вычитаете целые части

если time время в микро... что-то вроде:

time = time % (24 * 60 * 60 * 1000); //mod out any extra days
int hours = time / (60 * 60 * 1000);
time = time %  (60 * 60 * 1000); // or time -= hours*(60 * 60 * 1000)
int min = time / (60 * 1000);
time = time % (60 * 1000); // or time-= min*(60*1000)
...
Другие вопросы по тегам