вобщем есть такие фрагменты кода из проекта, которые еще работает только частично.
#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бит пременную.