Спасибо за заметку, для себя я так не комментирую, все сделано для легкой адаптации кода в проектах тех, кто нуждается в подобных алгоритмах и хочет не просто использовать, а разобраться в методе и быть может, переписать код более компактно или более быстро, ведь оптимизация — как звездное небо: сегодня звезда кода горит, а завтра потухла и вместо нее зажглась новая — более яркая.
говорится следующее:
Таймер настроен на совпадение со значением в регистре OCR0A, на частоте 9.6 МГц.
Тогда если выбрать предделитель на 8:
TCCR0B = 1 << CS01; // prescaler 8
Получим частоту 14400.
Теперь чтобы добиться меньшей частоты, необходимо увеличить задержку, через увеличение регистра сравнения:
OCR0A = 75, тогда 14400/75=192, 14400-9600=4800, 4800/192=25.
Получается такой код:
Включает бойлер на 2 часа в 5 часов вечера и 5 утра.
Где из этого:
int StartTime= (StartH*3600)+(StartM*60)+StartS;
int EndTime= (EndH*3600)+(EndM*60)+EndS;
Следует, что 17*3600=61200 = (int)-28443, а 86400 = (int) -20865
После чего Вы полученные значения преобразуете в отрицательные часы, минуты и секунды,
а потом вызываете вывод их на дисплей, честно говоря — не знаю как себя поведет весь остальной код.
ЗЫ: возможно в переводе на единицу ошибся, тем не менее, попробуйте проверить тут.
сплю почти, не успел: INT — знаковый -32767...+32767
То есть ошибка, скорей всего — погрешности Ваших вычислений времени.
Используйте другие типы для этих переменных.
Ну и советы выше — не навредят.
Ради интереса написал, отличается от стандартного, как я и говорил ниже, на пару слов, и как Вы сказали — cli и sei
Максимум для первого и третьего режима получилось 85666 Гц, с учетом сдвига маски через перенос (3 слова). Но и это — уже перебор.
При отрицательном сдвиг не выполняется, да читайте Вы код в конце концов:
00000023 LSL R24 Logical Shift Left
00000024 ROL R25 Rotate Left Through Carry
00000025 DEC R18 Decrement
00000026 BRPL PC-0x03 Branch if plus
00000027 MOV R14,R24 Copy register
1. У тини нет CTC, таймер сбрасывается в начале и в конце каждой фазы.
2. Доступ к ПЗУ медленнее чем к регистрам и к SRAM, а чтение из массива раздувает код.
говорится следующее:
Таймер настроен на совпадение со значением в регистре OCR0A, на частоте 9.6 МГц.
Тогда если выбрать предделитель на 8:
Получим частоту 14400.
Теперь чтобы добиться меньшей частоты, необходимо увеличить задержку, через увеличение регистра сравнения:
OCR0A = 75, тогда 14400/75=192, 14400-9600=4800, 4800/192=25.
Получается такой код:
И Вашим словам:
Где из этого:
Следует, что 17*3600=61200 = (int)-28443, а 86400 = (int) -20865
После чего Вы полученные значения преобразуете в отрицательные часы, минуты и секунды,
а потом вызываете вывод их на дисплей, честно говоря — не знаю как себя поведет весь остальной код.
ЗЫ: возможно в переводе на единицу ошибся, тем не менее, попробуйте проверить тут.
То есть ошибка, скорей всего — погрешности Ваших вычислений времени.
Используйте другие типы для этих переменных.
Ну и советы выше — не навредят.
Максимум для первого и третьего режима получилось 85666 Гц, с учетом сдвига маски через перенос (3 слова). Но и это — уже перебор.
Сказанное в статье на эту тему, было попыткой не отталкивать новичков.
Про линейку вкурсе :)
ISR (TIM0_COMPA_vect, ISR_NOBLOCK)
+2 байта кода,
во втором:
ISR (TIM0_COMPA_vect, ISR_NAKED)
-4
Массив в регистрах с R10 по R16
2. Доступ к ПЗУ медленнее чем к регистрам и к SRAM, а чтение из массива раздувает код.