ПИК микроконтроллер с использованием 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)
...