
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.207] |
![]() |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Интересная штука ))) Нужно будет попробовать. |
Сообщ.
#17
,
|
|
|
KillerXX7, у тебя изначально переменная PWMValue двухбайтная, а контроллер восьмиразрядный, все операции с этой переменной делаются из нескольких инструкций, младший байт -- старший байт. используешь ты ее в прерываниях. Если прерывание происходит в момент когда обрабатывается эта переменная, то в ней оказывается не верное значение и в прерывании ты его считываешь. От этого и была у тебя проблема ошибочных значений шима. Я бы сделал эту переменную размером в байт, а в прерывании сдвигом получал бы нужную разрядность. Или на время работы с этой переменной включал глобальный запрет прерываний.
Добавлено в IAR-овских библиотеках есть специальный модификатор функций для работы в подобных ситуациях, то есть ты с этой переменной работаешь только внутри специально объявленных функций. Таким образом компилятор гарантирует атомарность работы с многобайтными переменными. Tсли память не изменяет, модификатор называется MONITOR. С другой стороны, gcc достаточно мудреный компилятор и мне сдается, что он должен был выдавать тебе варнинг на эту переменную, могу ошибаться. |
Сообщ.
#18
,
|
|
|
Цитата KillerXX7 @ Вот именно на это самое программное подавление я и потратил целый день, прочитав похоже доводы против. Что только не пробовал, оно всёравно глючило. Это весьма не сложно. На конденсаторах ты делаешь интегратор. Сделаем его программно: 1. Запустим таймерную процедуру-интеррапт. Например, 1[мС]. В качестве цифрового интегратора будем использовать реверсивный двоичный счетчик. При таком периоде считать можно до 4-8. Дребезг контактов дольше, как правило, не бывает. 2. В этой процедуре смастерим двоичный реверсивный счетчик (с двумя ограничениями, сверху и снизу). Это и есть аналог интегратора. 3. По прерыванию считываем значение бита. 1 - и нет насыщения сверху - увеличиваем значение счетчика 0 - и нет насыщения снизу - уменьшаем значение счетчика (Чему именно соответствует 0 и 1 зависит от схемы) 4. Достигнутая граница сверху - кнопка нажата, выставим флаг Достигнутая граница снизу - кнопку отпустили, сбросим флаг. Вот так, силой мысли можно сэкономить кучу конденсаторов. ![]() Не знаю - нужно ли приводить исходные тексты ? Это не так уж и сложно. -Added S силовых триодов подключить к земле, а нагрузку подключить между +12V и D силовых триодов. Если ты все-таки решил оставить емкостины для подавления дребезга, включи последовательно с контактом небольшой резистор 50-100 [ом]. Какой пиковый ток пойдет через контакт ? ![]() 5V/(сопротивление контакта и провода). Так обгорают контакты. -Added Цитата KillerXX7 @ Для чего он нужен? Мне кажется он будет просто "греться", хотя могу ошибаться. К тому же на "боевой" схеме на выходе в стабилизаторе стоит делитель напряжения на 2 резисторах, тоесть по сути уже есть поротивление между плюм и землёй. Рассмотрим цепи R1,VD2,C7. VD2 без резистора между +5V и землей "R5vgnd" совершенно бесполезен. Он нужен для того, чтобы емкость C7 быстрее разряжалась при выключении питания по цепи VD2->"R5vgnd". Не факт, что емкостина разрядится через источник питания. Чтобы иметь возможность выключить питание и быстро включить ставят VD2 и "R5vgnd". Если это точно не требуется на них можно сэкономить. |
Сообщ.
#19
,
|
|
|
Цитата MeG @ PWMValue двухбайтная, а контроллер восьмиразрядный, все операции с этой переменной делаются из нескольких инструкций, младший байт -- старший байт. используешь ты ее в прерываниях. Если прерывание происходит в момент когда обрабатывается эта переменная, то в ней оказывается не верное значение и в прерывании ты его считываешь. От этого и была у тебя проблема ошибочных значений шима. Я бы сделал эту переменную размером в байт, а в прерывании сдвигом получал бы нужную разрядность. Или на время работы с этой переменной включал глобальный запрет прерываний. С другой стороны именяю её значение я также только в прерываниях, а до выхода из прерывания все остальные прерывания запрещены. Компилятор никаких варнингов не выдаёт, код компилится вообще молча (что даже странно для сишной проги ![]() Возможно компилятор сам разрулиает с именением переменной и прерываниями, но не факт. Цитата ЫукпШ @ Вот так, силой мысли можно сэкономить кучу конденсаторов. Алгоритм ясен =) Именно такую реализацию не пробовал. Но всётаки осталвлю конденсаторы, очень нраится как с ними работает =))) Резисторы действительно впаяю. Слабо верится что через энкодер может протекать ток около 5 ампер, но цифра в любом случае страшная. Цитата ЫукпШ @ Чтобы иметь возможность выключить питание и быстро включить ставят VD2 и "R5vgnd". Если это точно не требуется на них можно сэкономить. Необходимости в "передергивании" питания нет. Получается что диод в таком случае можно снять, верно? |
Сообщ.
#20
,
|
|
|
Цитата KillerXX7 @ Получается что диод в таком случае можно снять, верно? Да. -Added Цитата KillerXX7 @ С другой стороны именяю её значение я также только в прерываниях, а до выхода из прерывания все остальные прерывания запрещены. Тогда и проблем нет. А если бы было необходимо править эту переменную в фоновой программе, можно было бы на время операции с ней запрещать прерывания. |
Сообщ.
#21
,
|
|
|
[офтоп]
KillerXX7, а можно вопрос? зачем понадобилось использовать энкодеры (кста, этож вроде как колесо от мыши, нет?), почему было не взять ATTiny26 (он с АЦП. ШИМ-каналов правда только 2, а не 4, но тут больше и не используется) и два обычных потенциометра? [/офтоп] |
Сообщ.
#22
,
|
|
|
[офтоп]
Колесо от мышки одна из реализация энкодера =) Те что у меня больше похожи на регуляторы громкости на музыкальных центрах / магнитолах, ну или на выбор времени на микроволновках ![]() Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами + современней и стильней смотрися и ощущается, да и вообще они ближе к цифре чем к аналогу. [/офтоп] |
Сообщ.
#23
,
|
|
|
Цитата KillerXX7 @ [офтоп] Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами [/офтоп] А я делал так - с кнопками UP и DOWN: ссылка |
Сообщ.
#24
,
|
|
|
[офтоп]
Цитата KillerXX7 @ Именно энкодеры потому что упралять или удобней и приятней чем теми же реостатами + современней и стильней смотрися и ощущается, да и вообще они ближе к цифре чем к аналогу. ясн... хотя ИМХО единственный плюс (с точки зрения разработчика) и он же минус (с точки зрения пользователя) энкодера — возможность использовать его для задания нескольких параметров (как в нынешних автомагнитолах делают)... Незнаю, может и есть кто, кому нравится, что для реглировки басов надо четыре раза нажать кнопку, глянуь на магнитолу, убедиться, что она показывает "bass", и только после этого крутить ручку... но мне кажется в миллион раз удобнее на ощупь найти ручку нужного потенциометра и крутнуть её... кстати, в твоём устройстве вроде кнопки энкодеров не задействованы? так мог тоже съэкономить один энкодер, повесив на кнопку функцию переключения управляемого канала [/офтоп] |
![]() |
|
|
Заинтересовался кодом для энкодера с этой темы-
![]() ![]() if((((PIND) & (1<<PD2)) == 0) ^ (((PIND) & (1<<PD3)) == 0)){ PWMValue+=50; setPin(PB0, 1); // - Отладка }else{ PWMValue-=50; setPin(PB0, 0); // - Отладка Я пишу на CVAVR,так же по схеме хочу соединить к меге16, вот это- PIND - не могу понять как написать, не могли бы обьяснить,что это обозначает PIND,какая это нога или ранее запомненное состояние |
Сообщ.
#26
,
|
|
|
PIND, это висьмибитный входной регистр порта D, восемь ножек этого порта соответствуют восьми битам этого регистра. Логический уровень напряжения на ножке порта соответствует значению бита в регистре, если данная ножка сконфигурирована на вход.
|
Сообщ.
#27
,
|
|
|
Вообще-то PIND не регистр. PIND адресуется непосредственно к выводам МК, независимо от того, как они сконфигурированы.
|
Сообщ.
#28
,
|
|
|
Извиняюсь,я знал,что PIND это ножка порта,я думал если написать,например if(PIND==0), то выдаст ошибку,оказывается можно, тогда попробуем на деле этот код.Получается,это обращение к любому выводу порта D
|
Сообщ.
#29
,
|
|
|
Цитата Prince @ Вообще-то PIND не регистр. PIND адресуется непосредственно к выводам МК, независимо от того, как они сконфигурированы вообще-то PIND это регистр синхронизированный с клоком если верить даташиту Атмела на ATtiny2313 http://www.atmel.com/dyn/resources/prod_documents/DOC2543.PDF на странице 54 (рисунок 25) нарисована эквивалентная схема одного пина порта. Через ключ ножка подключается к триггеру шмидта, с него на триггер защелку и далее на синхронный D-триггер (именно он и назван PINxn), то есть, сигнал с ножки доступен для считывания с задержкой в один такт. Ключ перед триггером шмидта управляется сигналом DIGITAL INPUT-ENABLE, то есть, триггер подключен к ножке в случае если порт настроен как цифровой вход. В тоже время, считывать сигнал с D-триггера пина порта (PINxn) можно независимо от того как настроен порт, на вход, на выход или как аналоговый. Если порт не настроен на вход, то, в силу подтяжки к земле перед триггером шмидта, с PINxn будет считываться ноль. С триггера шмидта выходит сигнал DIxn, он используется как входной цифровой сигнал в случае использования порта для альтернативной функции (таблица 23). |
Сообщ.
#30
,
|
|
|
Прости, был неправ. Вспомнил даташит на at90s2313, в нём никаких защелок по входу вроде бы не было. Предположил, что и тут аналогичная схема.
|