вобщем есть такие фрагменты кода из проекта, которые еще работает только частично. #define F_CPU 8000000 //тактовая частота #define TIC0 ((unsigned char)(F_CPU/(1024*255))) //столько раз в секунду переполняется таймер 0 #define SCROLL_TIME ((unsigned char)(0,5*TIC0))
SIGNAL(TIMER0_OVF_vect) { tics.led_scroll++; }
main() { //тактовая для таймера0 = F_CPU/1024 //разрешаем прерывание по переполнению таймера0 TCCR0=(1<<CS02) | (1<<CS00); TIMSK|=(1<<TOIE0);
if ( tics.led_scroll == SCROLL_TIME ) { tics.led_scroll = 0; и тд прокрутка бегущей строки. } }
в общнм проблема: по логике вещей таймер переполняется 8000000(такт частота) / ( 1024(делитель)*256(разрядность счетной переменной) ). если ето сделать через дефайн, то работает, прокручивается на глаз где-то за пол секунды. если посчитать на калькуляторе то получим значение 30. но компилятор вычисяляет значение 124(выводил на индикатор). при том если поставить в условие 30, то прокрутка становится очень быстрой. то есть таймер срабатывает в несколько раз чаще чем должен и при этом дефайн вычисляется во столько же раз больше. ето не поддается моему пониманию. я думаю что как то неверно преобразуются типы. но все равно ничего не понимаю. если в формуле дефайна делить на 255 то работает, а если на 256 (что точнее), то программа даже не заходит в прокрутку, бегущая строка замирает. все типы uint8_t. warning: integer overflow in expression в условии сравнения. WinAVR-20070525 в архиве все что я накодил. бегущая строка работают, кнопки не не так как должны(срабатывает длинное нажатие, но это все из за этих глючных дефайнов). в принципе можно смириться, но охото понять почему так, и для длительной задерки 5сек для кнопки не охото вводить 16бит пременную.
|