реклама на сайте
подробности

 
 
> Потенциальный баг при работе с PWMLER?
GetSmart
сообщение Jun 8 2010, 22:24
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



(название темы на жаргоне лотереи 1010 белайна smile.gif)

По логике работы (аппаратной) он чем-то похож на xxIR регистры таймера и PWM-а. То есть сам сбрасывает биты. Но...

Кто как работает с этим регистром в многоканальном ШИМе?

PS. после стольких смсок от 1010 с утверждением что я потенциальный победитель приза в 30 лимонов я просто обязан назвать сей косяк (вопрос только чей) - багом biggrin.gif

PPS. забыл указать что проц LPC2132, но думаю PWM и у других камней LPC аналогичный.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KRS
сообщение Jun 9 2010, 20:21
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Кстати, хороший вопрос!
Если PWMы не зависимы (например разные яркости) и значения меняются независимо друг от друга.
Как правильно писать PWMLER?
Код
  PWMMRx = val;
  PWMLER = (1<<x);

или

Код
  PWMMRx = val;
  PWMLER |= (1<<x);


По хорошему у этого регистра должно быть - запись 0 без эффекта!
Потому что |= не атомарная операция. И возможно второй раз бит установится. Хотя в большинстве случаев это не критично.

Надо будет завтра проверить.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Jun 10 2010, 09:13
Сообщение #3


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(KRS @ Jun 10 2010, 01:21) *
Надо будет завтра проверить.

Если в процессе работы программы будут исполняться такие куски кода
Код
  PWMMRx = val;
  PWMLER = (1<<x);

то в случайном порядке некоторые каналы не будут прописываться.
Далее. Если есть допустим такая инициализация
Код
  PWMTCR = 0x02;
  PWMPR  = 0;
  PWMMR0 = PCLK / 1000;
  PWMMCR = 0x03;
  PWMPCR = 0x2400;
  PWMTCR = 0x09;

  PWMMR2 = 0;
  PWMMR5 = 0;
  PWMLER = 0xff;
  PWMIR = 0xff;
  PINSEL0_bit.P0_7 = 2;
  PINSEL1_bit.P0_21 = 1;

а потом ещё до окончания первого периода PWM будет исполнено
Код
  PWMMRx = val;
  PWMLER = (1<<x);

то начальная инициализация PWMMR2 и PWMMR5 рискует не состояться.

И наконец реальный баг (?). Если выполнить данную инициализацию, а потом (через любое время) два раза подряд
Код
  PWMMRx = val;
  PWMLER = (1<<x);

с небольшим промежутком между ними (внутри периода ШИМа) то исполнявшийся первым канал всё таки обновится, но не реальным значением из PWMMRx, а возможно значением из теневого регистра и у меня почему-то это значение равно какому-то максимуму, то есть на выходе пина PWMx устанавливается значение 3.3V (Vcc). А уже второй или третий такой "глюк" выводит на пин PWMx значение, похожее на записанное в PWMMRx.

Из всего этого следует что наименьшим злом будет использование
Код
  PWMLER |= (1<<x);

Ещё как вариант можно в PWMLER всегда записывать маску всех каналов, которые меняются в процессе работы проги.

Но может быть возможны ситуации, в которых это будет вызывать глюки.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 06:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01411 секунд с 7
ELECTRONIX ©2004-2016