Очень развернуто, но да я немного слаб в ардуино и микроконтроллерах, но как я понял можно так сказать забить на эту проблему? просто странно что если не статическое значение то все работает потому думал можно исправить.@Wan-Derer, Нормально он будет компилироваться. Открываем io.h, видим что для Мега2560 подключается файл iom2560.h, в котором основные макросы берутся из iomxx0_1.h и смотрим что представляют из себя макросы:
#define TCCR4B _SFR_MEM8(0xA1), в свою очередь определено в sfr_defs.h как (режим несовместимости с асмом, ибо С/С++):
#define _SFR_MEM8(mem_addr) _MMIO_BYTE(mem_addr), и выше находим:
#define _MMIO_BYTE(mem_addr) (*(volatile uint8_t *)(mem_addr))
, подставляя одно в другое получаем:
#define TCCR4B (*(volatile uint8_t *)(0xA1))
Разворачивая оператор присваивания получаем с учетом предвычисления констант компилятором:
(*(volatile uint8_t *)(0xA1)) = (*(volatile uint8_t *)(0xA1)) & B11111001;
Что может быть развернуто в код только так, ибо volatile:
lds Rxx, 0x00A1 ; получить значение регистра таймера
lds Ryy, 0xF9 ; загрузить константу в другой регистр
and Rxx, Ryy ; домножить побитово
sts Rxx, 0x00A1 ; загрузить результат в регистр взад.
и никаких чудес. Остается только смотреть даташит что за регистр по этому адресу .. а там (и тут я был не прав, забыл ужо):
(0xA1) TCCR4B ICNC4 ICES4 reserved WGM43 WGM42 CS42 CS41 CS40 стр.160, т.е. имеем установку:
ICNC4=1, ICES4=1, reserved=1, WGM43=1, WGM42=1, CS42=0, CS41=0, CS40=1
на стр. 160 имеем:
• Bit 7 – ICNCn: Input Capture Noise Canceler
Setting this bit (to one) activates the Input Capture Noise Canceler. When the Noise Canceler is
activated, the input from the Input Capture Pin (ICPn) is filtered. The filter function requires four
successive equal valued samples of the ICPn pin for changing its output. The input capture is
therefore delayed by four Oscillator cycles when the noise canceler is enabled.
Бит фильтрации ноги "захват таймера" по 4 замерам и соответственно задержка на 4 такта таймера выставления значения в нем при успешной попытке захвата значения. Кмк, на столько же будет задержано и прерывание по захвату таймера4
• Bit 6 – ICESn: Input Capture Edge Select
This bit selects which edge on the Input Capture Pin (ICPn) that is used to trigger a capture
event. When the ICESn bit is written to zero, a falling (negative) edge is used as trigger, and
when the ICESn bit is written to one, a rising (positive) edge will trigger the capture.
When a capture is triggered according to the ICESn setting, the counter value is copied into the
Input Capture Register (ICRn). The event will also set the Input Capture Flag (ICFn), and this
can be used to cause an Input Capture Interrupt, if this interrupt is enabled.
When the ICRn is used as TOP value (see description of the WGMn3:0 bits located in the
TCCRnA and the TCCRnB Register), the ICPn is disconnected and consequently the input cap-
ture function is disabled.
Нога захват таймера работает на генерацию прерывания: 0 - по заднему фронту захвата, 1 - по переднему фонту захвата. Прерывания должны быть разрешены в ICF бите.
• Bit 5 – Reserved Bit
This bit is reserved for future use. For ensuring compatibility with future devices, this bit must be
written to zero when TCCRnB is written.
Дальше можно не смотреть. Что там погорело в таймере или перклинило и как он будет дальше работать - производитель, насколько помню НЕ ГАРАНТИРУЕТ.
В общем, тема - прекрасный образчик того, что ПРЕЖДЕ ЧЕМ ЛЕЗТЬ в регистры напрямую НАДО ЧИТАТЬ RTFM.
Автор, похоже Вы "сам себе злобный Буратино" (ССЗБ)
Данные значения регистра(там в спойлере для меги 2560) были взяты вот отсюда http://hi-dev.ru/osveshenie-rabochego-stola-svoimi-rukami
Изменено: