Mega2560 PWM

adaly

✩✩✩✩✩✩✩
8 Дек 2019
14
1
@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
 
Изменено:

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
@adaly, Вам стоит слегка подучиться, освоить чтение даташитов, хотя бы с участием гугло-переводчика и ТОЛЬКО ПОТОМ возвращаться к Ардуино.

Не ваше оно .. можно ли "забить на проблему" к сож. я не могу ответить, ибо вижу ИНУЮ проблему (желание лазить туда, куда не следует из-за отстуствия знаний), на которую забивать сильно не советую.

Ну и ещё. Гарантировать работу камней, с которыми Вы так вот поиздевались, лично я бы не стал вовсе.
 

adaly

✩✩✩✩✩✩✩
8 Дек 2019
14
1
@adaly, Вам стоит слегка подучиться, освоить чтение даташитов, хотя бы с участием гугло-переводчика и ТОЛЬКО ПОТОМ возвращаться к Ардуино.

Не ваше оно .. можно ли "забить на проблему" к сож. я не могу ответить, ибо вижу ИНУЮ проблему (желание лазить туда, куда не следует из-за отстуствия знаний), на которую забивать сильно не советую.

Ну и ещё. Гарантировать работу камней, с которыми Вы так вот поиздевались, лично я бы не стал вовсе.

Опыт приходит и с ошибками.
Большое спасибо за столь развернутый ответ!
 
  • Лойс +1
Реакции: Arhat109

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,136
412
Москва
wan-derer.ru
@adaly, Весь смысл предложенного мной теста в том чтобы проверить работу портов автономно, т.е. по одному и посмотреть нет ли влияния одного на другой. Поэтому я предложил прогнать бегущий огонёк (один включен, остальные выключены) и бегущую тень (наоборот)
 
  • Лойс +1
Реакции: Arhat109

Arhat109

★★★★✩✩✩
9 Июн 2019
473
203
Да можно тупо взять пример из типовых библиотек и посмотреть работает или нет.
Поменять в нем таймер, ШИМ-канал (их 2-3шт на таймер!) и проверить по очереди все ШИМ выходы меги.
Затем размножить пример на второй порт, таймер и т.д. и посмотреть меняется ли яркость плавно на всех PWM выходах.
Если есть какие-то косяки - стало быть "что-то погорело", нет ву-а-ля, Вы счастливчик.
В целом дуньку подпалить надо постараться.

Ну и как вывод: не лезть туда, где мало что понимаешь и RTFM в полном объеме..

(* а то все это пока смахивает на старую шутку, прочитанную на одном из форумов по Ардуино, не помню где уже:
-"Я тут решил сделать ваттметр на 220 вольт, купил Ардуино Нано. Подскажите куда тут 220 подключается? *)