PDA

Просмотр полной версии : Скан-код POWER



LeonT
06.11.2010, 19:39
Джентльмены, кто-нить знает, какая последовательность генерируется при нажатии на комповой клаве кнопки "power"?
Делаю инфракрасное устройство управления WinAmp-ом с функцией выключения компа. Пульт - обычный телевизорный, коих у меня ящик. Конструктивно - это переходник для клавиатуры с IR приёмником. IR часть сделал без проблем на AVR-ке, а с кодами затык.
Пробежался по гуглу - иногда говорят о каком-то однобайтном значении.
Посмотрел осциллоскопом - два байта нажатие и три байта отпускание.
Причём, без повторов, поэтому точно срисовать затруднительно.
Можно конечно, записать на аудио, и потом просмотреть в аудиоредакторе, но лениво громоздить второй комп на запись, инсталлить саундфорж и т.д.
Поделитесь, если кто располагает инфою, плз. :ups:

POP
06.11.2010, 20:44
Шаг первый.
С помощью команды showkey получаем скан коды нащих клавиш.
Я, в ниже проилюстрированном примере, получил скан коды клавиш Wake, Sleep, Power соответственно.


Elvenhome root # showkey -s
режим клавиатуры был XLATE
нажмите на клавишу 'any' (она на системном блоке)...
Программа завершается после 10 секунд 'покоя' (не нажимается ни одна клавиша)
0xe0 0x63 0xe0 0xe3 //Первых две позиции - клавиша нажата, следующих две отпущена.
0xe0 0x5f 0xe0 0xdf //аналочично.
0xe0 0x5e 0xe0 0xde //аналогично.


http://linuxportal.ru/entry.php/1707_0_3_0/

Не оно?

harinalex
06.11.2010, 20:44
Джентльмены, кто-нить знает, какая последовательность генерируется при нажатии на комповой клаве кнопки "power"?
Делаю инфракрасное устройство управления WinAmp-ом с функцией выключения компа. Пульт - обычный телевизорный, коих у меня ящик. Конструктивно - это переходник для клавиатуры с IR приёмником. IR часть сделал без проблем на AVR-ке, а с кодами затык.
Пробежался по гуглу - иногда говорят о каком-то однобайтном значении.
Посмотрел осциллоскопом - два байта нажатие и три байта отпускание.
Причём, без повторов, поэтому точно срисовать затруднительно.
Можно конечно, записать на аудио, и потом просмотреть в аудиоредакторе, но лениво громоздить второй комп на запись, инсталлить саундфорж и т.д.
Поделитесь, если кто располагает инфою, плз. :ups:

стр 11 в этом файле (размер 400к)

LeonT
06.11.2010, 21:01
Пасибки! Там оказывается, были возможны два варианта...
Скорее всего, SET2 из PDF-ки. ( E0h 37h - E0h F0h 37h) поскольку в наличии именно три байта отжатия, а шоукей выдаёт только два. Первый байт - E0 удалось прочесть осциллоскопом...

Проверю в железе - отпишусь. :)

ZMIY
06.11.2010, 22:05
ЛеонТ, а можно поподробней про это:

IR часть сделал без проблем на AVR-ке
Ибо я сейчас как раз на АВРке делаю приёмник-дешифратор ПДУ и... ну вообщем туго идёт пока (вот здесь часть проблем описал: http://forum.easyelectronics.ru/viewtopic.php?f=14&t=2775&start=0)
Собственно скан код как раз звуковухой и писал. Проблема как теперь это всё програмно обработать, чтобы однозначно идентифицировать факт нажатия/отпускания и собственно нажатую кнопку.
Сижу вот сейчас атмеговский мануал курю. Но он плохо курится ибо на буржуйском, а я его со словарём с трудом... :( Ну и плюс ассемблер с детства основательно подзабыл.

harinalex
06.11.2010, 23:06
Пасибки! Там оказывается, были возможны два варианта...
Скорее всего, SET2 из PDF-ки. ( E0h 37h - E0h F0h 37h) поскольку в наличии именно три байта отжатия, а шоукей выдаёт только два. Первый байт - E0 удалось прочесть осциллоскопом...

Проверю в железе - отпишусь. :)
а почему так сложно выключать надо . Почему нельзя воспользоваться консольной командой shutdown ?

LeonT
07.11.2010, 00:24
на АВРке делаю приёмник-дешифратор ПДУ О, а я думал, что один такой. :)
По IR ПДУ существуют ЕМНИП готовые решения (в смысле асм.кода, надо смотреть на форумах программистов), но у меня была задача приспособить всего лишь шесть команд от завалявшегося пульта. Задачи обрабатывать отдельно нажатие, удержание, отпускание не ставил. Выбрал из кучи пульт, у которого команды удержания для каждой кнопки различны (бывают такие, где они одинаковы). Не мудрствуя лукаво, снял осциллоскопом коды в режиме "постоянно нажатая кнопка", и под их отлов сделал приёмник. Принцип прост - выход ИК сенсора завёл на INT0, и в процедуре этого прерывания, проверяю сначала соответствие заголовка посылки (он свой для каждой системы ДУ), если нет - выхожу из прерывания без результата, если да -проверяю оставшуюся часть - один ли это из шести нужных мне кодов.
После корректного обнаружения кода удержания нужной мне кнопки пульта, генерирую код нажатия клавы, затем паузу, примерно соответствующую продолжительности нажатия на клаве, затем код отжатия, затем опять паузу. Потом выход из прерывания и опять отлов кнопок на пульте.
В результате должны примерно получаться или отдельные нажатия, или подобие серии нажатий. Удерживать не выйдет, но этого мне пока не нужно.

PS ИК сенсор у меня TSOP48, поэтому упомянутых по ссылке проблем не было. Он малочувствителен к шумам и наводкам, а на выход выдаёт сформированный ТТЛ сигнал. Т.е вопрос фильтрации шумов вообще не стоит.

PPS когда-то у меня был случай, когда помехи ИК ДУ шли от "энергосберегающей" лампы. У низ как раз частота преобразования 30...40 кГц, и может совпадать с частотой заполнения импульсов ДУ. А поскольку амплитуда и частота излучения лампы модулирована частотой сети, то 50 или 100 герцовая помеха вполне может пролезть через фильтр ИК сенсора.



а почему так сложно выключать надо Ну, хоцца сваять чисто аппаратную примочку - типа переходника. :)

ZMIY
07.11.2010, 02:27
Спасибо за разъяснения. Буду дальше думать и пробовать. Просто пока любой алгоритм попробовать не на чем - индикации нет, а мерять после каждого нажатия ножки вольтметром - проще застрелиться. Вот спаял линейку из восьми диодов, чтобы можно было спихивать результат дешифрации в память или регистр и побайтно выводить на этот "монитор" :D

LeonT
07.11.2010, 11:37
Всегда пожалста. :) Ещё обращаю ваше внимание на необязательность знать/вычислять задуманные разработчиками коды команд из спецификаций интерфейса. Поскольку кодирование в системах ИКДУ довольно своеобразное, это лишняя головная боль. Просто снимите сигналограммы нужных кнопок, наложите на них такт, и получите псевдокод, с которым и оперируйте в дальнейшем.

Кроме того, необходимо довольно точно измерить и выдержать частоту "выборок" по которым будет происходить дешифрация. Посему начните с распознавания коротких фрагментов кодов, для начала - первых нескольких битов. Потом добавляйте длину фрагмента и корректируйте частоту.


линейку из восьми диодов :) вам проще, а у меня маловыводная Tiny25, тут вообще вся надежда только на осциллоскоп. :D

ZMIY
07.11.2010, 13:51
Всегда пожалста. :) Ещё обращаю ваше внимание на необязательность знать/вычислять задуманные разработчиками коды команд из спецификаций интерфейса. Поскольку кодирование в системах ИКДУ довольно своеобразное, это лишняя головная боль. Просто снимите сигналограммы нужных кнопок, наложите на них такт, и получите псевдокод, с которым и оперируйте в дальнейшем.

Кроме того, необходимо довольно точно измерить и выдержать частоту "выборок" по которым будет происходить дешифрация. Посему начните с распознавания коротких фрагментов кодов, для начала - первых нескольких битов. Потом добавляйте длину фрагмента и корректируйте частоту.

:) вам проще, а у меня маловыводная Tiny25, тут вообще вся надежда только на осциллоскоп. :D
Прости, а как понять "наложите на них такт" ? А насчёт нужных кнопок... даже незнаю, у меня их много задействовано будет, минимум 17, может и больше.
А насчёт проще, это с какой стороны посмотреть. Во первых у меня нет осциолоскопа :( Во вторых, в родном Магнитогорске в радиомагазинах (ага во всех двух) просто нет никаких AVRок. Хорошо так случилось, что когда я это всё затеял, по делам нужно было в Челябинск съездить. Там и купил. Так что сейчас у меня на руках AT16A-PU (40 ножек аж) и AT8A-AU (мелкая под smd пайку). И если вдруг спалю - то за новой 300 км в одну сторону ехать :)

USSR_Rik
07.11.2010, 14:23
ZMIY, если пульт отдает протокол NEC, то вот http://coreyl.wordpress.com/projects/nec-ir-decoder/ практически готовый сишный модуль обработки сырых данных. Я на его основе делал себе управление цифровым транспортом. Прикрутить дешифратор и мелочи по вкусу. Модуль рабочий, только там в комменте-дополнении вроде типичная ошибка (в теле if сравнение вместо присваивания). Меги8 с кварцем 16 МГц вполне хватает с запасом, можно и на внутреннем RC такте делать.

А вот тут http://altor1.narod.ru/Articles/IRC.pdf отличное описание протоколов ИК ДУ с таймингами. В конце статьи есть словесный аолгоритм обработки - можно прямо брать и писать код.

Zorge
07.11.2010, 15:52
А можно я вставлю свои пять копеек?

Есть такая штука, как E-LAB AvrCo http://www.e-lab.de/index_en.html
У этой штуки есть бесплатная Lite версия - AVRсо mega8.
Работает только с ATmega8 и ATmega88, но для этих целей - вполне достаточно.

Ну а дальше - в этом E-LAB есть готовая библиотека по приему с ИК-пульта в кодировке RC5, а также не менее готовая библиотека для эмуляции шины I2C, которая используется в клавиатуре. Главное, объявить AVR-ку ведомым шины (slave) - и все будет работать.
Язык Паскаль (немного нестандартный диалект, правда), никакой астмы, минимум кода.
Программа будет выглядеть примерно так:



var
RC5a, RC5d: byte;

procedure KeyPress(w: word);
begin
SPIout(Lo(w));
SPIout(Hi(w));
end;
begin
// тут всякая инициализация
while true do
if RC5recv(RC5a, RC5d) then
if (RC5a = $A1) and (RC5d = $01) then KeyPress($0215)
elsif (RC5a = $A2) and (RC5d = $02) then KeyPress($0147)
elsif ...
....
endif;
endif;
end_while;
end.

При этом эта штука будет работать с любым пультом стандарта RC5, и прикидываться обычной AT-клавиатурой на разъеме PS/2.
Естественно, нужно будет написать обработчики по приему данных от компьютера (реакция на сигнал RESET, например)
Ну и коды команд с пульта и скан-коды поставить реальные, а не то что я набросал "от балды".
Фотодиод приемника можно цеплять на любую свободную ножку контроллера, главное указать это при подключении библиотеки.
Разъем для подключения вместо клавиатуры - на ножки SDA и SCL соответственно DATA и CLOCK.

P.S. Библиотека RC5-передатчика и сканируемой матрицы кнопок там тоже есть, так что если сильно захочется можно и свой пульт сваять.

ZMIY
07.11.2010, 17:40
Спасибо за советы. Но... тут дело вот в чём.
Во первых протокол (судя по анализу "осциолограммы") похож на RC5. Но внимательно изучив описание RC5 и сверив с тем что имею - похоже, но в сей стандарт не вписывается. Это во первых. Во вторых имея перед глазами живую команду, сел и стал думать как её можно опознать. Придумал. Потом стал думать как составить алгоритм опознания. Придумал. Потом учёл всякие подводные камни и тонкости. Вообщем сейчас есть помехоустойчивый алгоритм дешифрования.
Дело за малым закатать его в ассемблере. Вот тут пока затык, ибо с детства я его основательно забыл, да и ассемблер для микроконтроллера несколько отличается от ассемблера для компа.
Короче сейчас буду сидеть, обложившись справочниками, писать код.
Как накатаю буду пробовать.
Готовые листинги/прошивки не хочу использовать по двум причинам. Первая - просто интересно самому (да и алгоритм получился достаточно простой и красивый). Вторая - обучение. Ведь расшифровкой сигналов с пульта дело не заканчивается. Нужно потом принимать решения что делать с этими нажатиями, управлять исполнительными миханизмами (со своими ограничениями) и много чего ещё. Короче основную программу я с Интернета не скачаю, её точно придётся писать самому. Поэтому надо осваиваться с ассемблером, чтобы дальше проще было.

LeonT
07.11.2010, 21:21
как понять "наложите на них такт" ? в данном случае, это значит выбрать такие промежутки между выборками входного сигнала, при которых, он может быть полностью идентифицирован по этим выборкам.
Не обращаем внимания на то, что первая выборка - старт-бит, а последняя - возможно, стоп-бит, и на то, что кодировка восьмибитного числа в ИК кодах может занимать вовсе не 8 бит.
Например код, изображённый на рисунке, можем тупо представить как ADAh и работать с этим значением, несмотря на то, что оно совершенно не соответствует передаваемому коду.

USSR_Rik
07.11.2010, 21:29
1. Зачем (ну зачем?) тебе париться с ассемблером, когда Си вполне хватает даже при тактовой 8 МГЦ и тактировании от внутреннего RC-генератора? AVR-Studio бесплатна, WinAVR тоже, библиотек миллион.
2. Если есть проблема с протоколом, настоятельно рекомендую изучить пдф-ку по моей второй ссылке. В неё сведены данные по большинству протоколов и временнЫми интервалами преамбул и посылок. Написана очень просто и читается влёт.

Это как раз тот случай, когда "Лучше день потерять и за 5 минут долететь" ((С) Крылья, ноги и хвосты)

Добавлено. Я, собственно, не уговариваю (да и не являюсь специалистом, так.... кое-какие навыки остались) - просто непонятны причины упорства с ассемблером. Ну понимаю 20 лет назад (дохлое целевое железо, средства разработки малодоступны), понимаю еще, когда жесткие временнЫе рамки циклов - но в приемнике стандартных протоколов ДУ... не понимаю.

LeonT
07.11.2010, 21:51
Ну, что касаемо меня, то просто привык к Асму. Не знать, что лежит в каком регистре, как-то неуютно. Да и в малышах с 1..2 К флэша, на языке высокого уровня ПМСМ не особо развернёшься. Опять же, быстродействие ассемлерного кода повыше, хоть это и редко бывает актуальным. Но с ростом объёмов флеша и скоростей процессоров, поголовный переход на более высокоуровневые языки конечно, неизбежен. А жаль... :)

Вспоминаю, как в детстве, не зная Ассемблера, писал программки для Z-80 непосредственно в машинных кодах: ... 21 00 3Е .... :D

Zorge
07.11.2010, 22:58
Ну, что касаемо меня, то просто привык к Асму. Не знать, что лежит в каком регистре, как-то неуютно. Да и в малышах с 1..2 К флэша, на языке высокого уровня ПМСМ не особо развернёшься.
Не знаю, не знаю. По-моему современные компиляторы по части эффективности кода если не превзошли "гуру ассемблера", то уж простого чайника - точно.

У меня тут железяка трудится, делает следующее:
- Измеряет два канала переменного напряжения 220 вольт. Оценивает невыход напряжения за пределы допустимого, а также появление резких скачков напряжения.
- Измеряет температуру воздуха в помещении.
- Бдит состояние пожарных датчиков и контактных датчиков сигнализации на окнах и дверях.
- Когда центральный компьютер дозванивается до ее модема, делится запрошенной информацией через UART (модем подключен через RS-232).
- По команде с центрального компьютера может выключить или включить кондиционер (обычный такой, БК-2000) посредством его обесточивания или подачи питания через бистабильное реле.
- Выводит вышеперечисленную информацию на ЖК-экран, а также показывает дату и время (которые получает с системных часов центрального компьютера).

Причем половину кода занимает логика распознавания длинных команд типа 'get temperature' или 'set relay off', и выдачи на них ответов вида 'temperature is 26.5 centigrades' или незамысловатого 'ok'. Ну или злорадного 'bad command' или 'bad parameter 2'. Оно еще и backspace, стрелки и delete правильно обрабатывает (при исправлении команды).

И все это помещается в 14 килобайт кода ATmega16. В основном все на Паскале.
Ассемблер - только для измерения переменки trueRMS и отслеживания скачков напряжения.




Вспоминаю, как в детстве, не зная Ассемблера, писал программки для Z-80 непосредственно в машинных кодах: ... 21 00 3Е .... :D
На пятом курсе института в машинных кодах программировал x86 (был у нас на лабораторках по микропроцессорным системам такой стенд).
Ох и веселое это занятие - машинные коды для CISC-процессора. Одной только команды mov десятка два разных вариантов, и все разной длинны. А во что в таких условиях превращается расчет адреса перехода... %)

ZMIY
08.11.2010, 02:56
в данном случае, это значит выбрать такие промежутки между выборками входного сигнала, при которых, он может быть полностью идентифицирован по этим выборкам.
Не обращаем внимания на то, что первая выборка - старт-бит, а последняя - возможно, стоп-бит, и на то, что кодировка восьмибитного числа в ИК кодах может занимать вовсе не 8 бит.
Например код, изображённый на рисунке, можем тупо представить как ADAh и работать с этим значением, несмотря на то, что оно совершенно не соответствует передаваемому коду.
"У дураков мысли сходятся" (с) поговорка. :D
Ну собственно именно такой алгоритм я и придумал :)


Вспоминаю, как в детстве, не зная Ассемблера, писал программки для Z-80 непосредственно в машинных кодах: ... 21 00 3Е .... :D
Коллега ! :beer:
Именно тогда и зародилась любовь к ассемблеру. А сформировалась она когда я о нём впервые узнал и узнал, что ассемблер это те самы машинные коды и есть, только в виде слов :)

1. Зачем (ну зачем?) тебе париться с ассемблером, когда Си вполне хватает

Да не могу я в Си ! Не понимаю я этот дурацкий язык ! Сколько раз порывался его изучить, столько изматерившись бросал. Если уж мне нужен высокоуровневый язык программирования, я уж лучше на Паскале. А Паскаль с ассемблерными вставками - так вообще на мой взгляд идеальная вещь.


Если есть проблема с протоколом, настоятельно рекомендую изучить пдф-ку по моей второй ссылке. В неё сведены данные по большинству протоколов и временнЫми интервалами преамбул и посылок. Написана очень просто и читается влёт.

Да прочитал я её и ещё с десяток подобных. Я уже этот протокол наизусть почти знаю. Проблема в том, что я могу вручную его расшифровать, а надо не мне, надо контроллеру объяснить как его расшифровывать. Т.е. прогу написать. Дошёл до того, что не зная английского атмеловский документ с описанием алгоритма дешифровки со словарём прочитал. И понял, что это блин черезчур сложно и нафик не нужно. Сел и придумал свой алгоритм - такойже как до меня придумал LeonT. Сейчас вот потихоньку сижу ассемблер по новой изучаю :) Засада даже не столько в ассемблере, сколько в том, что на каждом шагу приходится особенности контроллера учитывать, попутно узнаю о его архитектуре подробности которые пригодятся и в будущем. Цель то не только в том чтобы заиметь готовое устройство, но и в том чтобы вообще научиться электронике, схемотехнике и программированию. Планов то вагон, а если тупо копипастить схемы и прошивки из Инета, то мало чему научусь и ничего своего сваять не смогу. Так что сейчас тяжело, голова пухнет, но через недельку-другую освоюсь и будет куда проще.
Поэтому тут я согласен:


Это как раз тот случай, когда "Лучше день потерять и за 5 минут долететь" ((С) Крылья, ноги и хвосты)

Zorge
08.11.2010, 09:23
Да не могу я в Си ! Не понимаю я этот дурацкий язык ! Сколько раз порывался его изучить, столько изматерившись бросал. Если уж мне нужен высокоуровневый язык программирования, я уж лучше на Паскале. А Паскаль с ассемблерными вставками - так вообще на мой взгляд идеальная вещь.
Аналогично. Засим E-LAB AvrCo и пользуюсь.
Как раз получается Паскаль с ассемблерными вставками.

Никто не мешает в учебных целях не использовать штатные библиотеки, а написать свои обработчики для конкретных железяк.
Ну а если "нада" и "срочна" - накидал стандартных библиотек - и вперед.

LeonT
08.11.2010, 11:45
на каждом шагу приходится особенности контроллера учитывать
"Эт точно"(С) т.Сухов... Самое обидное, что не успеваешь закончить изучение одного МК и "вкусить плодов знания", как его снимают с производства, и выпускают на замену новый, со своими нюансами, которые приходится изучать заново. :D
Так что коллега, спрашивайте если будут вопросы. В личке, или в этой теме (всё равно, благодаря коллегам, ответ на главный вопрос уже получен, и она утратила актуальность). По крайней мере тем, что уже удалось понять, поделимся. :)

USSR_Rik
08.11.2010, 22:20
Именно тогда и зародилась любовь к ассемблеру. А сформировалась она когда я о нём впервые узнал и узнал, что ассемблер это те самы машинные коды и есть, только в виде слов :)Дык и я с ассемблера начинал, только давно это было. Аксакалы может помнят еще машинки БК-0010 (система команд PDP-11). И продолжал я тоже Паскалем... потом забросил всё.

Но писать подобные программы сейчас на ассемблере можно либо из чистой любви к искусству, либо для тренировки. Если же цель получить работающий продукт за разумное время... То же самое касается и использования/неиспользования готовых библиотек. Ассемблер для таких задач не нужен. Знание архитектуры контроллера - нужно обязательно в любом случае. Не нравится С - есть Паскаль, есть прога, которую Zorgeподсказал.


Я уже этот протокол наизусть почти знаю. Проблема в том, что я могу вручную его расшифровать, а надо не мне, надо контроллеру объяснить как его расшифровывать.Значит, проблема не в языке программирования.

Повторюсь, это не нравоучения, я на них права не имею. Просто я на разных форумах насмотрелся на аналогичные ситуации - на эти грабли не наступал только ленивый.

ZMIY
09.11.2010, 14:05
Написал тестовую программу (ну чтобы убедится что всё работает как задумано).
Она должна:
- при старте зажечь светодиоды
- перейти к циклу опроса кнопки
- гонять цикл, пока кнопка не нажата
- как нажата переключить светодиоды в инверсное положение (т.е. включить или выключить, в зависимости от того, что на текущий момент)
- Уйти на подпрограмму ожидания (чтобы дребезг контакта исключить)
- В подпрограмме ожидания включается таймер и гоняется цикл, пока не натикает 1 секунда (на самом деле для устранения дребезга столько не нужно, но для простоты отладки сделал секунду)
- После возврата опять начинается цикл опроса кнопки.

Или то же, но кратко - включились после старта светодиоды. И горят пока кнопку не нажмёшь. Нажал - потухли, ещё раз нажал - опять включились и так до бесконечности.

Так вот, это так должно быть ! А на самом деле, после включения они начинают мигать со скоростью 1 раз в секунду. Если нажать на кнопку и держать - состояние переключается и фиксируется. При отпускании - состояние переключается и они опять погнали мигать.
Что за фигня не могу понять, при пошаговом выполнении в AVR-Studio, всё чётко работает как и задумано, а в живом контролере такая вот фигня :(

UPD: Всё, нашлась бага.

Zorge
09.11.2010, 18:02
UPD: Всё, нашлась бага.
Есть одна умная софтинка. Proteus называется. Лично я пользуюсь версией 7.7. Восьмерка, пока, говорят, бажная.

Ну так вот что в ней можно сделать:
- Нарисовать схемку, в которой участвует микроконтроллер со всеми свистелками: датчиками, внешним АЦП-ЦАП, памятью, экраном, светодиодами, подключением виртуального RS-232 или USB (причем RS-232 можно вообще вывести в соответствии с реальным COM-портом, и подцепить к нему железку, с которой контроллер должен будет общаться) и т.д и т.п.
- Откомпилировать программу микроконтроллера в любимом компиляторе и на любимом языке, и "скормить" получившуюся прошивку виртуальному контроллеру в схеме.
- Запустить все это на исполнение и проверить что называется "как оно работать будет".
Поддерживает AvrStudio assembler и WinAVR С с отладкой по исходному коду.

Вот так, например, выглядит прототип одной железяки, которую я ваяю "для себя". Это по идее должна быть погодная станция с измерением температуры в помещении и на улице, а также влажности воздуха и атмосферного давления.
Прошивка тестовая - отлаживаю общение с SHT11 (датчик влажности и температуры, на схеме U2) и с экраном - программирование знакогенератора.

LeonT
09.11.2010, 18:22
Proteus
Не, ну так неинтересно... Это всё равно, что нанимать человека, чтобы он вместо вас разгадывал кроссворды. :D

ZMIY
09.11.2010, 19:58
- Uniprof
- AVR Studio
- Ассемблер
- Over 9000 всяких pdf-фов справочных
- Over 9000 всяких Интернет страниц в Избраном с электронно-программерской тематикой
- Виндовый калькулятор в кои то веки в инженерный режим переключил
- И много много думал.

Уже голова просто не в состоянии изучить ещё одну прогу (хоть и нужную).
Потом, как всё в голове уляжется по полочкам, поставлю Proteus и буду разбираться в нём. Сейчас не могу - мозг взорван :)

ZMIY
11.11.2010, 08:37
Дело понемногу продвигается. Написал промежуточную (тестовую) программу распознавания факта нажатия с фильтрацией помех. Но под конец голова была уже ватная, поэтому при опробовании даже не удивился, что не заработало (скорее удивился бы если бы заработало). Лёг спать. На следующий день, начал её переосмысливать и понял, что написал я её в принципе криво, проще новую написать, чем эту до ума доводить. Ну и алгоритм несколько изменил.
И даже полностью есть понимание как её написать.
Но тут вылез один (ага тысячи их были, так что не один, а очередной) подводный камень.
Дело вот в чём. Программа на данной стадии использует два таймера, для разных целей, с разными прерываниями и разными обработчиками. Один таймер используется для алгоритма дешифрации, второй для неотносящегося к нему процесса. И нежелательно, чтобы эти таймеры как-то друг на друга влияли. Даже более того, было бы хорошо, если бы во время обработки одного прерывания, могло бы сработать прерывание от другого таймера (правда если это критично растянет время обработки, то может выйти косяк).
Теперь кусок кода:

ldi r16,0b00000001;Заносим в регистр маску
in r17,TIMSK ;считываем в другой регистр текущие настройки таймеров
or r17,r16 ;ставим нужный бит не изменяя остальных
out TIMSK,r17 ;разрешаем прерывание при переполнении таймера
;(сбрасываем таймер)

Так вот, разрешая прерывание, тем самым сбрасываю таймер. При этом делаю это так чтобы другие биты (в данном случае нужен 0-й и только он) не изменились. А всё потому, что 6-й бит отвечает за другой таймер ! И вроде бы всё нормально... однако терзают меня смутные сомненья. Да конечно, значение бита в конечном итоге не изменится, но ! Но его туда всё равно записываю (хоть и то-же самое). Так вот, вопрос, просто по самому факту записи, другой таймер не сбросится ли ?

PS Речь о ATmega16

PPS Да... простой вопрос, а нафлудил...

LeonT
11.11.2010, 11:48
:) Из моей недавней переписки по аналогичному поводу (ну прям, рояль в кустах):
"Проблемка в том, что работа с таймером внутри прерывания, потребует вложенных прерываний. В данном случае - прерываний от события OCR или от переполнения.
Для этого нужно, чтобы флаг глобального разрешения прерываний (I) был установлен. А ведь он у нас аппаратно сбрасывается при входе в любое прерывание, а восстанавливается только при выходе из него командой RETI.
(кстати, команда RETI отличается от команды RET только воздействием на флаг I, это иногда можно использовать, например если при выходе из прерывания нужно, чтобы в дальнейшем прерывания оставались запрещены)
Так вот, чтобы сделать возможным вложенное прерывание, необходимо после входа в основное прерывание, сначала запретить все остальные прерывания, в их числе и основное, затем восстановить флаг глобального прерывания командой SEI. Соответственно, перед выходом из основного, нужно опять восстановить прежние настройки прерываний.
Это достаточно хлопотно и ПМСМ проще внутри прерываний, вместо таймера использовать простой программный счётчик. Ведь поскольку других прерываний нет (флаг I сброшен) то и нарушить работу счётчика ничто не сможет. Т.е. его стабильность ничем не будет отличаться от стабильности ТС."

По факту записи в TIMSK ничего вроде бы не должно происходить - сброс таймера производится записью нулей в TCNT. А прерывание может возникнуть, если на момент его разрешения через TIMSK, имеем установленным флаг события этого прерывания, и глобального разрешения прерываний.

PS:
ПМСМ приведенный код можно укоротить на одну команду:
in r17,timsk
sbr r17,1
out timsk,r17

PS:
Позвольте уточнить - в процитированном фрагменте, неудачное выражение "программный счётчик" следует понимать как "счётчик, организованный программно". Извиняйте за косноязычие... :ups:

Zorge
11.11.2010, 13:23
Запись того же значения бита в управляющий регистр, что там и было - никак не влияет ни на одну периферийную железяку AVR-ки.
А вот вложенные прерывания - на архитектуре AVR 8-bit лучше не делать - полностью согласен с LeonT.
Внутри прерываний - только циклы задержки и ничего больше - все равно никто не прервет. Но делать нужно все быстро и коротенько - чтобы ни на кого другого сильно не влиять.


(кстати, команда RETI отличается от команды RET только воздействием на флаг I, это иногда можно использовать, например если при выходе из прерывания нужно, чтобы в дальнейшем прерывания оставались запрещены)
А не наоборот? RETI разрешает прерывания, а RET - флаг прерываний не трогает вообще. Или это и имелось в виду?

ZMIY
11.11.2010, 14:45
Всем спасибо. Всё понятно.


ПМСМ приведенный код можно укоротить на одну команду:
in r17,timsk
sbr r17,1
out timsk,r17
Точно. Можно. Это я что-то протупил.
Или так:
in r17,timsk
ori r17,1 ;что кстати одно и тоже, что и sbr
out timsk,r17

Но это вроде только написание короче, по времени выполнения выигрыша не будет.
Или я пихаю эталон в регистр, а затем or или проц, вроде бы сразу or-ит константой, но константа то суть ячейка памяти, т.е. сначала читает память а потом or. Так что в итоге тоже самое получается. Если я конечно всё правильно понимаю :)

UPD: А не, вру. Будет выигрыш. В регистр то я предварительно тоже константу пихаю ! Т.е. как не крути лишняя операция была.

LeonT
11.11.2010, 16:47
лишняя операция была И лишний регистр использовался. :)



А не наоборот? RETI разрешает прерывания, а RET - флаг прерываний не трогает вообще. Или это и имелось в виду? Ну да, это и имелось в виду. Я ж перед этим писал: "флаг глобального разрешения прерываний (I) ... восстанавливается только при выходе ... командой RETI" :)

ZMIY
11.11.2010, 17:03
Кстати. Регистров в Атмеге дофига. Если в какой-то один, не используемый, заранее в этапе инициализации, до старта основной программы положить нужную маску, то потом можно or-ить этим регистром сразу и таким образом экономить один такт процессора :)

LeonT
11.11.2010, 18:45
А так и делается. Например, часто используемые константы удобно хранить в рабочих регистрах (когда в них нет острого дефицита).
Например, если часто приходится останавливать/запускать ТС, я организую в регистрах константы ZERO (0) и TCSTRT (то, что должно содержаться в TCCR для запуска ТС). Тогда остановка или запуск ТС делается единственной командой
OUT TCCR,ZERO или OUT TCCR,TCSTRT
Вообще константа ZERO зело полезна и удобна, ибо позволяет одной командой за один такт, обнулить любой io-регистр (в том числе и таймеры).
Естественно, для констант лучше использовать регистры младшей группы (0-15), поскольку они менее универсальны.

ZMIY
11.11.2010, 18:59
Понятно. Примерно так я себе всё это и представлял.
А сколько ещё Америк предстоит открыть, а велосипедов изобрести... :D

Zorge
12.11.2010, 08:27
А еще в младших регистрах хорошо хранить всяческие индексы циклов и адреса массивов (как начальные, так и текущие), когда работаешь с чем-нибудь структурированным.

Я когда в институте AVR-ку изучал - вообще загонял в младшие 16 регистров массив с данными, и работал с ними не через rXX, а через адресацию (благо архитектура такое позволяет) - маленькая ОЗУшка у 90S2313 была уже вся забита другим "нужным" барахлом. :D

jamper
12.11.2010, 12:43
А вот вложенные прерывания - на архитектуре AVR 8-bit лучше не делать - полностью согласен с LeonT.
Внутри прерываний - только циклы задержки и ничего больше - все равно никто не прервет. Но делать нужно все быстро и коротенько - чтобы ни на кого другого сильно не влиять.

Вот это очень спорное высказывание.
Вызов прерываний из другого прерывания допускается в случае крайней необходимости, например в одном прерывании вы выводите значение на индикатор и в это же время приходит импульс формирующий измерительный интервал... Что важнее вывести все цифири до последней или запустить/остановить процесс значение которого потом будем выводить на дисплей?
А вот делать задержки внутри обработчика прерывания есть наипервейшее зло, само название - "прерывание" говорит о том что прерывается основной (читай самый важный) процесс, а вы в нем задержку...
для Змея
1. если буржуйские мануалы плохо курятся :rtfm: купи/скачай книжку А.В.Евстифеева "Микроконтроллеры AVR семейства mega/tiny/classik Руководсво пользователя" это выжатые мануала по разным семействам только на русском :cool:
читаешь-уточняешь(на конкретный камень, в буржуйском мануале)-применяешь
2. есть такая прога VMLab 3.15 заточена как раз под АВРки, проста как 7 коп. и позволяет моделировать вх.сигналы.
ИМХО протеус слишком перегружен для любителей.
3. если желаешь и дальше программировать - тогда меняй стиль, использование абсолютных значений и имен регистров по умолчанию прямой путь к запутыванию себя и тех кто потом будет пытаться помогать запустить софтину.

in r17,timsk
sbr r17,1<<TOIE0 ;сразу видно что разрешаем прерывание от Т0 по переполнению
out timsk,r17

ну и R17 заменить на, скажем, temp
ну и т.д. не будем углубляться - это все-таки сайт не про мк;)

ZMIY
12.11.2010, 15:08
Вот это очень спорное высказывание.
Вызов прерываний из другого прерывания допускается в случае крайней необходимости, например в одном прерывании вы выводите значение на индикатор и в это же время приходит импульс формирующий измерительный интервал... Что важнее вывести все цифири до последней или запустить/остановить процесс значение которого потом будем выводить на дисплей?
А вот делать задержки внутри обработчика прерывания есть наипервейшее зло, само название - "прерывание" говорит о том что прерывается основной (читай самый важный) процесс, а вы в нем задержку...

Ага, тоже подобные мысли вчера в голове крутились. Поэтому в более в более критичном процессе запретил таки прерывания, вообще все. А в менее критичном разрешил.


для Змея

Для ЗмИя :)


1. если буржуйские мануалы плохо курятся :rtfm: купи/скачай книжку А.В.Евстифеева "Микроконтроллеры AVR семейства mega/tiny/classik Руководсво пользователя" это выжатые мануала по разным семействам только на русском :cool:
читаешь-уточняешь(на конкретный камень, в буржуйском мануале)-применяешь

Эх. Да сколько ж я уже этих книжек скачал, сколько сайтов перерыл...
Где-то одно понятно (для моего разума) написано, где-то другое...
А один фиг уточнять и сверяться приходится с родным буржуйским даташитом :( (ладно, может хоть на этом поприще английский выучу, давно мечтал в принципе)


есть такая прога...

Есть. И ещё миллион других прог есть. Все не изучишь, мне бы для начала все мнемоники ассемблера назубок запомнить :ups: а то постоянно со справочниками сверяться приходится. Я так решил, что пока эту прогу не допишу, никаких Визуал Бейсиков :D, т.е. программ автоматизирующих работу и т.д. Цель - именно мозг раскачать. А уже потом с просветлённым разумом можно подбирать более удобную программу.


3. если желаешь и дальше программировать - тогда меняй стиль, использование абсолютных значений и имен регистров по умолчанию прямой путь к запутыванию себя и тех кто потом будет пытаться помогать запустить софтину.

in r17,timsk
sbr r17,1<<TOIE0 ;сразу видно что разрешаем прерывание от Т0 по переполнению
out timsk,r17

ну и R17 заменить на, скажем, temp
ну и т.д.
Да я и сам уже это понял. Вчера добрых несколько часов убил, всё переименовывал, упорядочивал, заворачивал в макросы...


не будем углубляться - это все-таки сайт не про мк;)
Сайт не про МК, а тема про МК, так что по правилам сайта, это не оффтоп, поэтому можно и углубиться :)

PS Это Ваше первое сообщение на данном форуме, причём в такой специфической теме... Нет, это не упрёк или что-то ещё, просто необычно как-то :)

jamper
12.11.2010, 16:05
Все очень просто :D
AVR это мое основное хобби, причем пишу исключительно на АСМе :D, поэтому не смог промолчать про прерывания.
а дополнительное, но не менее любимое ИЛ-2 ЗС ;), и вот после смерти очередного джоя решил забодяжить что-нибудь этакое, поиск привел меня на этот сайт, а тут "столько вкусного" :eek:, уже собрал контроллеры HJFree, MJ16, сейчас мастрячу механику под рус/руд, а дальше видно будет...

Zorge
12.11.2010, 18:09
Вот это очень спорное высказывание.
Вызов прерываний из другого прерывания допускается в случае крайней необходимости, например в одном прерывании вы выводите значение на индикатор и в это же время приходит импульс формирующий измерительный интервал...
За индикацию по прерыванию нас в институте цитирую:
"Увижу - буду бить. Сильно, но аккуратно" (с) один хороший майор.

Пользователь с временем реакции 0.2 секунды не помрет, если получит индикацию на 10-50 миллисекунд позже. А чтобы символ не потерялся - нужно программировать так, чтобы после возврата из прерывания все сохранилось. Например хранить индекс сканируемого символа и выводимое значение индикатора целиком в памяти.

Прерывание, в отличие от основной программы, строится в расчете на непрерываемость - потому что памяти у нас мало, процессор слабенький - не до жиру.

Задержка без использования стека (тоже, кстати, надо по-минимуму в прерывании применять, как и любое другое обращение в ОЗУ - считал данные в начале работы, записал данные по окончании и хватит) и дополнительных извращений - это 255 тактов максимум. От нее сильно никому не поплохеет. Обычно, я задержки вставляю в прерываниях, чтобы внешний регистр успел перещелкнуться, или чтобы выдать синхронизацию строго после того, как данные на шине устаканились.

Конечно, если "по фен-шую", то в прерываниях должны только флаги выставляться, а по этим флагам основной цикл подпрограммы вызвать, разбираясь - кому времени побольше дать, а кому не очень. С флагами "меня после входа дольше чем на столько-то не прерывать" (чтобы протокол соблюсти например). Отправлять контроллер "спать", если ничего не делается. Чтобы истинная многозадачность была.
"Когда надо дать всем поровну, часто и помногу" (с) тот же самый майор.
Но это в больших проектах и/или на ЯВУ с поддержкой этой самой многозадачности компилятором.

А когда контроллер занимается неторопливым измерением одного параметра и не менее неторопливой выдачей его в интерфейсную шину или на индикацию - задержки - это самое простое, что можно использовать, чтобы не плодить сущности.



А вот делать задержки внутри обработчика прерывания есть наипервейшее зло, само название - "прерывание" говорит о том что прерывается основной (читай самый важный) процесс, а вы в нем задержку...
У меня совершенно противоположный подход. Все самое важное и требующее непрерывности, непременно полной обработки - по прерываниям, callback ам от прерываний, дополнительным процессам (когда надо - и с повышенным приоритетом).
А основной процесс занимается обработкой ввода пользователя, индикацией. Поэтому, если получит управление чуть попозже - ничего страшного не случится.
Да и сделать только основной процесс безопасно прерываемым гораздо проще, чем городить эту самую "реентрабельность" везде и всюду. Экономит и время написания и отладки, и код и оперативную память.



2. есть такая прога VMLab 3.15 заточена как раз под АВРки, проста как 7 коп. и позволяет моделировать вх.сигналы.
ИМХО протеус слишком перегружен для любителей.
Перегружен - это P-CAD PC logs 1988-го года выпуска и Multisim начала 2000-х.
А Протеус прост как тапок. Главное накидать цифровых элементов, а не аналоговых - и вперед.
VMLab, при всей его навороченности и сложности всего-лишь отладчик.
Proteus отличается от Microcap или там EWB только тем, что контроллеры моделировать умеет. Поэтому после его освоения получится не потеряться и в них и хотя бы понимать "куда копать" в других программах подобного класса.

Хотя, может у меня такое мнение, потому что мой любимый AvrCo сам себе VMLab - есть в нем и индикатор ЖК, и семисегментные индикаторы, и эмулятор терминала для UART, и на АЦП можно подавать всякие загогулины, да много чего еще.



3. если желаешь и дальше программировать - тогда меняй стиль, использование абсолютных значений и имен регистров по умолчанию прямой путь к запутыванию себя и тех кто потом будет пытаться помогать запустить софтину.
Согласен. Однако просто так самому дисциплинировать себя сложно.
Лучше написать что-нибудь зубодробительное без комментариев.
А потом при попытке разобраться в написанном в целях дополнения или модификации - плюнуть и переписать "как надо" уже заново, с правильными именами и структурой данных.
Когда наступишь на грабли сам, да еще несколько раз - набитая шишка не даст лениться. :D



Я так решил, что пока эту прогу не допишу, никаких Визуал Бейсиков , т.е. программ автоматизирующих работу и т.д. Цель - именно мозг раскачать. А уже потом с просветлённым разумом можно подбирать более удобную программу.
Пожелаю удачи. Наверное так и надо.
А я так и не добил свой крупный проект на астме. :ups:
Может я и ленивый. Но когда написал его же за полторы недели на Паскале, и еще за месяц отладил до состояния "комар носа не подточит", после того как полгода мурыжил его на ассемблере - был счастлив.

Я наверное нестандартные велосипеды изобретаю.
Нормальные люди "ресетят" контроллер переходом по нулевому адресу. А я, если есть watchdog - вешаю контроллер (http://ithappens.ru/story/2431), точно зная, что watchdog все сделает сам. :)

Alex Oz
12.11.2010, 18:33
Эх, счастливые вы люди, есть время копаться в регистрах :)
Тут с прикладной физикой успеть бы разбираться...



...
Нормальные люди "ресетят" контроллер переходом по нулевому адресу. А я, если есть watchdog - вешаю контроллер[/url], точно зная, что watchdog все сделает сам. :)

While(1) ; - и я так грешным делом люблю :)

jamper
12.11.2010, 20:19
У меня совершенно противоположный подход
какие ваши годы;)
"я тоже был молодым и горячим" (с) "Люди и манекены" А.Райкин

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

PS я тоже мойор, и вроде тоже не плохой :umora: :D

ZMIY
14.11.2010, 07:21
Продолжение моей борьбы с Икс ИК лучами: http://forum.easyelectronics.ru/viewtopic.php?p=50414#p50414 :)

ZMIY
15.11.2010, 04:07
Блин. Трассировал прогу и понял почему не работает - таймеры не запускаются ! Вроде все биты везде куда надо рассовал, а они не тикают !
Объясните плиз, как их пнуть, чтобы пошли ? А то я уже ничего не соображаю. При то, что раньше (ну ещё в первой, пробной программе), я как-то запустил ! Работало ! И листинг не сохранился посмотреть :(

LeonT
16.11.2010, 11:32
как их пнуть, чтобы пошли ? Дык, как пнуть... биты правильно поставить. Другого пути нет. :) Тяжко, что их до фига, и рассыпаны они по разным регистрам.
Щас пошарю, может есть у меня где-то готовая процедура инициализации ТС для Меги8.

----------------

Ну вот фрагмент. Вроде должен быть из рабочего кода. Во избежание, привожу в неправильном наглядном виде. :)
;-------- настройка ТС
ldi tmp1,0x3f ;
out ocr1ah,tmp1 ;OCR по сравнению с 3FFEh
ldi tmp1,0xfe ;
out ocr1al,tmp1
ldi tmp1,0b00000000 ;режим OCR
out tccr1a,tmp1
ldi tmp1,0b00001001 ;F=CLK, режим OCR
out tccr1b,tmp1 ;

;-------- настройка прерываний
ldi tmp1,0b00010000 ;разрешить прервание от сравнения А
out timsk,tmp1 ; TC1

Обобщая свой личный опыт, замечу, что в начальном периоде, моими наиболее частыми критическими ошибками были:
1. забыл задать вектор прерываний %)
2. забыл задать стек :lol:
3. напутал с фузами :cry:
4. в командах CBR,SBR использовал номер бита, а не маску :D

ZMIY
16.11.2010, 15:03
Спасибо. Но поздно. Таймеры я запустил ещё вчера. Теперь другая проблема. Кусок кода, которй должен фильтровать помехи, их не фильтрует :( Причём прогоняю в Студии, всё работает как и задумано. А когда девайс запускаю - помехи спокойно пролазят. Второй день уже бьюсь. А не позвать ли Батюшку, чтобы святой водой окропил...

jamper
16.11.2010, 15:18
Может лучше книжек умных почитать, смотрел я код, без пол-литры не разобраться, так что не мудрено что не работает как надо.

ZMIY
16.11.2010, 15:53
Какой именно код ? :)
Я его уже раза три стирал и писал по новой :D
Книжки читал, много. Толку от них ноль, пока сам не разберёшься. Вернее не так, толк от них есть, но для тех, кто вообще не в теме. А когда основы уже знаешь, надо брать и что-то делать самому. Пока сам, руками не попробуешь, книжки можно хоть наизусть знать - толку не будет :)

Zorge
16.11.2010, 17:52
А может вообще загрубить вход? RC-цепочку поставить, чтобы отрезала все, что выше определенной частоты.

Расчет RC-фильтра:
w = 1/(RC)
w = 2*Pi*f
f= 1/(2*Pi*R*C)
R положим 1 кОм.
Тогда С = 1/ (2 * Pi * R * f)
Так как T = 1/f, то
C = T / (2 * Pi * R)
где
w - круговая частота, f - частота, Т - период, R - величина сопротивления в фильтре, C - величина емкости в фильтре, Pi = 3.14159, дальше не помню, число Пи короче.

Пропускаем все с периодом больше или равным 0.1 миллисекунды, все остальное вырезаем.
Тогда C = 1e-4 / (2 * Pi * 1e+3) = 1,59e-8 или 16 нанофарад.

Ну и выкладывай свой фильтрующий код - покурим вместе. :rtfm:

ZMIY
16.11.2010, 20:24
Пропускаем все с периодом больше или равным 0.1 миллисекунды, все остальное вырезаем.
...
Ну и выкладывай свой фильтрующий код - покурим вместе. :rtfm:
Среднее время помехи 0.13 мс, так что не поможет.
Выложу, покурим. Но позже. Просто дело в том, что я придумал как вообще фильтровать помехи не фильтруя их %) Ладно, сейчас пошёл прогу переделывать под новые соображения, а завтра выложу старый код на растерзание. Дай Бог чтобы эта идея заработала...

ZMIY
17.11.2010, 02:54
Долго трассировал и обнаружил странный баг. Выпал в осадок.
????????!!!!

LeonT
17.11.2010, 11:10
ЕМНИП команды BRMI, BRPL с флагом N работают, хитросделанным. %) (он вроде переключается при переходе не через 255/0 а через 127/128, насколько помню, может и ошибаюсь - не пинайте. Как-то давно уже с этим пересёкся, и с тех пор работать с этим флагом не возникало необходимости) :)
Лучше BRCC BRCS.

ZMIY
17.11.2010, 15:11
Хм. Попробую поменять на эти.
Кстати говоря, вчера много кода повырезал, кое-что поменял. И прога уже почти как надо работает. Даже считывает и показывает похожий на правду результат (но тем не менее не правильный, вернее иногда даже правильный), но тут я примерно представляю где может быть загвоздка, сегодня ещё потрассирую и поэкспериментирую.
А всё почему, а потому что отпала необходимость фильтровать помеху програмно. Потому как удалось отфильтровать её оппаратно. Но ! Не RC цепочками или ещё как-то подобно ! А очень странным и неожиданым способом ! Фактически новое слово в электронике, можно сказать открытие века ! Если будет интересно, вечером поднобно расскажу.

Zorge
17.11.2010, 17:28
Среднее время помехи 0.13 мс, так что не поможет.
Никто не мешает вставить вместо 16 нанофарад 32 нанофарады, или два раза по 16 нанофарад параллельно, чтобы отсеивать все, что короче 0.2 миллисекунд.
Но похоже неактуально.



А всё почему, а потому что отпала необходимость фильтровать помеху програмно. Потому как удалось отфильтровать её оппаратно. Но ! Не RC цепочками или ещё как-то подобно ! А очень странным и неожиданым способом ! Фактически новое слово в электронике, можно сказать открытие века ! Если будет интересно, вечером поднобно расскажу.
Конечно интересно - с такой-то затравкой. :)

ZMIY
17.11.2010, 18:09
Конечно интересно - с такой-то затравкой. :)
:)
Дело было так. После долгой трассировки, когда голова уже напрочь отказывалась что либо соображать и генерировать новые алгоритмические идеи, я налил себе чайку, взял конфет, отцепил ИК датчик и прицепил его к линейному входу компа.
С целью позаписывать осциолограммы при разных условиях и ещё раз перемерить помехи. Заодно, глядя на "живой" сигнал, ещё раз подумать над алгоритмом.
Ну сижу, попиваю чай, ем конфеты, записываю.
Ну ничего нового. Всё как уже было до этого, направляю датчик на яркий свет - помех нет, в тень - помехи есть. Касаюсь рукой - помех нет, убираю руку - помехи снова появляются. Всё это я уже описывал в той теме, по ссылке выше.
Ну думаю, дай замеряю помехи, не просто в тени, а в темноте, интересно, они ещё больше будут или нет.
Надо датчик чем-то прикрыть. Ну и беру фантик от свежесъеденой конфеты, оборачиваю его вокруг датчика, включаю запись.
И тут у меня глаза на лоб вылазят - ПОМЕХ НЕТ !
Ага, думаю, значит его надо в кромешную тьму поместить видимо. Ну беру, цивильно, оборачиваю его плотной бумагой, заматываю изолентой. Фиг там - помехи есть !
Ладно, заклеиваю самоклеющейся фольгой. Фиг там, мало того что помехи есть, так ещё и сигнал с пульта при этом не проходит. Ладно, повторяю эксперимент, заворачиваю датчик в фантик - ПОМЕХ НЕТ !
Ну так и оставил, обернул фантиком и замотал изолентой чтобы не свалилось.
Вот такие нанотехнологии :D

LeonT
17.11.2010, 19:37
В старину, встречались мне на бытовой технике ИК-приёмники, целиком помещённые в металлические экраны с сетчатыми окошками для прохода ИК-лучей.
Но фантики - несомненно, новое слово в деле борьбы с наводками.
Патентовать! Непременно патентовать! :D

ZMIY
18.11.2010, 13:58
Ура ! Заработало ! (с) Кот Матроскин
Всё. Отладил прогу наконец. Все сигналы чётко, правильно и стабильно расшифровывает.

USSR_Rik
18.11.2010, 14:19
В старину, встречались мне на бытовой технике ИК-приёмники, целиком помещённые в металлические экраны с сетчатыми окошками для прохода ИК-лучей.
Вот такой, выдрал когда-то из старого видюшника.

ZMIY
18.11.2010, 15:55
Вот такой, выдрал когда-то из старого видюшника.
Так чего же он пропадает ? Надо его применить :)

Кстати, LeonT, а как ты в своём ИК приёмнике реализовал признак конца сигнала ?
Меня этот момент немного попарил честно говоря. Первый раз я его сдел просто, но как оказалось в корне не верно. Т.е. просто поставил счётчик импульсов. Но ВНЕЗАПНО оказалось, что у разных кнопок разное количество импульсов, поэтому пришлось придумывать что-то другое. Не придумал ничего лучше, чем засекать таймером общее время посылки и если прошло больше чем надо, то в независимости, что там дешифровщик нащёлкал, записывать результат и обнулять всё что касается подпрограммы дешифровки.
Может был способ проще ?

USSR_Rik
18.11.2010, 16:02
Дык не пропадает он, видишь косичку сзади из МГТФ? Он у меня управляет цифровым транспортом, собственно, на нем и сфотографировал. Правда, железо в состоянии работы, потому и болтается, жду по почте индикаторы (вместо семисегментников что на фото краешек) и буду паковать корпус.

LeonT
18.11.2010, 16:22
выдрал когда-то из старого видюшника Кстати, приволокли мне сегодня на ремонт относительно не старый ТВ Самсунг, и там обнаружилось такое же чудо. :)


как... реализовал признак конца сигнала А никак. :) Я где-то выше уже упоминал, просто загоняю в регистры посылку длительностью N тактов (где N не меньше максимальной длины посылки), и сравниваю с искомыми значениями. Если не совпало - таймаут, и ловля следующей. Длительность таймаута такая, чтобы текущая посылка гарантированно закончилась, а следующая ещё не началась.
На удивление стабильно работает. :)

ZMIY
18.11.2010, 21:37
Дык не пропадает он, видишь косичку сзади из МГТФ? Он у меня управляет цифровым транспортом, собственно, на нем и сфотографировал.
:cool:
А что за такое цифровой транспорт ?


А никак. :) Я где-то выше уже упоминал, просто загоняю в регистры посылку длительностью N тактов (где N не меньше максимальной длины посылки), и сравниваю с искомыми значениями. Если не совпало - таймаут, и ловля следующей. Длительность таймаута такая, чтобы текущая посылка гарантированно закончилась, а следующая ещё не началась.
На удивление стабильно работает. :)
Ну так это получается тоже самое, что и у меня, только в профиль.

Scull
19.11.2010, 02:36
:cool:
А что за такое цифровой транспорт ?
Грубо говоря CD-плеер и тп.

USSR_Rik
19.11.2010, 12:49
:cool:
А что за такое цифровой транспорт ?

Грубо говоря CD-плеер и тп.Не совсем, точнее совсем не.

Это девайс, который читает аудиопоток (формат .wav (.flac) в частности) c USB MAss Storage device (флэшка, usb-винт), преобразует его в формат аудиошины i2s и отдает на внешний ЦАП. С которого и идет аналоговый музык высокого качества на усилитель и так далее.

Никаких движущихся частей (если флэшка). Никаких лазеров-шмазеров. Никакого питания для сервоприводов вследствие отсутствия оных. Чтение высококачественных аудиоформатов вплоть до 24 бита/96 кГц (что принципиально не могут сидюшники). Никаких компов. Вся музыкальная библиотека на одном винте. Оффтоп :)

ZMIY
19.11.2010, 13:47
Погоди, погоди, погоди. Чего-то я смысл не уловил. Настроение понял - это замечательно. Но не понял почему замечательно. Ну тот же винт или флэшка в компе - выводи на усилок и тоже самое. Чем оно лучше компа то ?

PS почему оффтоп ? Тема про околоэлектронные разговоры же :)

USSR_Rik
19.11.2010, 21:42
Ну если коротко, то примерно так:

1. Блок питания компа - далеко не лучший вариант питания аудиоустройств (в том числе и цифровой части аудиоустройств). Скорее даже, один из худших (собственно, это не претензия - он и не рассчитан на тонкие вещи). Это нестабильность, гигантский уровень помех как по шинам питания, так и по воздуху, шум питающих напряжений.

2. Типичные звуковые карты не обеспечивают должного качества (бит в бит) звукового потока для контента разной частоты дискретизации и битности. В том числе и при цифровом выводе наружу и использовании какого-то внешнего аудиоЦАП. В типовых звуковых карточках используется одна сетка частот синхронизации. При этом для вывода цифры наружу (или на внутренний ЦАП) делается программный пересчет с потерей точности (и наверняка каким-то вариантом интерполяции отсчетов). Как правило, можно говорить о более-менее правильном ("правильном" по формальным признакам - не более того) выводе контента с частотой дискретизации 48 кГц, а сидюшные 44,1 кГц (рипы, скажем) уже выводятся с пересчетом. Ну и суди сам - как можно без потерь сделать пересчет выборок на таком соотношении частот?

3. При выводе "цифры" наружу на внешний ЦАП необходима одна важная вещь - обратная синхронизация выводимого цифрового потока с тактовой частотой (мастерклоком) ЦАП. То есть - внешний ЦАП должен тактировать звуковую карту, которая в соответствии с эти внешним тактом и кормит ЦАП, который обеспечивает тактовым сигналом карту.... вот такая загогулина получается. Этого вообще никакая карта не умеет, насколько я знаю. Хотя доработке некоторые карточки поддаются.

4. Тактовые генераторы должны быть очень высокого качества, обеспеченные стабильным и малошумящим питанием для снижения до минимума дрожания фазы (джиттера).

5. Внешние звуковые карты, которые умеют хоть что-то из перечисленного, стоят невразумительные деньги.

6. Зачем мне запускать комп с его кучей вентиляторов, если я хочу только послушать музыку? Впрочем, уже есть аналог такого транспорта, только подключаемый к компу по usb - как ни крути, а управление библиотекой на компе куда удобнее.

7. Если контент - mp3, то всё это можно было не читать :) Хотя конечно и mp3 друг от друга очень сильно отличаются.

Нифига себе коротко получилось... а вроде и не хотел :)

ZMIY
20.11.2010, 07:40
Ого как не просто всё. Но это для истиных гурманов-меломанов, я к ним не отношусь. Да и колонок у меня таких нет, чтобы разница была заметна :)

LeonT
29.11.2010, 18:35
Ура ! Заработало ! (с) Кот Матроскин
И у меня! :D
Проблемка возникла из-за того, что клавиатура, увидев на своей шине обмен между ИК и компом, всегда пыталась вставить свои пять копеек, и в результате, этот самый обмен срывала. Поступил радикально - разорвал шины к клавиатуре коммутатором 4016. Теперь, получив и обработав ИК команду, ИК контроллер отрубает клавиатуру от шин, и спокойно отдаёт нужный код компу.
В результате, имею переходник-платку 20 Х 27 мм. На ней - несколько SMD элементиков, коммутатор в DIPе, ИК-фотоприёмник, светодиод (мигает при корректных срабатываниях), и МК Tiny25 (потом поставлю вместо него Tiny13, которых пока ещё есть в магазинах, в DIPе). Все планируемые функции работают (спасибо коллегам за документацию по скан-кодам :beer: ). И слушая перед сном вечернюю сказку, могу управлять компом не вставая... %)
"Жить - хорошо! А хорошо жить - ещё лучше!" (С) :)

ZMIY
30.11.2010, 13:49
И у меня! :D
Поздравляю !:cool:

А у меня наоборот - перестало работать :(
Точнее перестало в другом кристале. Делал я на АТмеге16, а по задумке это основной контроллер управления и нефик его нагружать левыми задачами по приёму и дешифровке сигнала. Поэтому (на самом деле там ещё есть причины) было решено загнать эту прогу в отдельное устройство на АТмеге8, а от неё получать готовый номер кнопки по UART-у.
Ну залил в 8-ю этот код. Не работает. Начал разбираться почему. Первая загвоздка всплыла быстро - разные вектора прерываний. Причём у 16-й двухбайтные и можно счётчик переполнения таймера прямо там сделать (inc,регистр и reti), а у 8-й однобайтные вектора, только джампами. Но это ладно, переделал. Не работает. Решил проверить что именно не работает дешифровка или UART. Набросал код, который просто байтики пересылает, а приёмник эти байты на светодиоды выводит. Всё нормально - пересылается стабильно и без ошибок. Значит загвоздка именно в программе дешифровки, как не странно. Вот только убей не пойму почему - всёж работало ! Трассирую в Студии - всё нормально. В кристале не хочет :dontknow:

Zorge
30.11.2010, 17:20
Значит загвоздка именно в программе дешифровки, как не странно. Вот только убей не пойму почему - всёж работало ! Трассирую в Студии - всё нормально. В кристале не хочет :dontknow:
Ну так на вскидку несколько возможных причин:
1. У ATmega8 другой адрес регистра MCUCR. Если он задавался не через файл include к соответствующему контроллеру - то нужно поправить. Многих остальных регистров тоже касается.
2. Регистр TCСR0 у восьмерки содержит только prescaler. За всем остальным нужно ходить в другие регистры.
3. Внешний тактовый генератор и кристалл у ней подключается к ножкам PC7 и PC6. Если на них назначить Output, или Input с подтяжками - будут глюки с частотой. Проверено. Поэтому PortC = 0b00XXXXXX, и DDRC = 0b00XXXXXX, если используется внешний тактовый генератор. Хотя, если UART работает - значит с частотой все в порядке.
4. Вход прерывания первого таймера у него посередине корпуса (DIP), на шестой ноге. А не "с угла" (тоже DIP), как у 16-й. Ну и порт тоже другой - соответственно его надо переиначивать на input с подтяжкой или без - по требованию и подключению приемника.

Это, кстати, еще одна из причин, по которой я не пользуюсь астмой - компилятору ЯВУ указал другой target и все - остальное "оно само думает". А тут сменил контроллер и началось - этот битик не там, а тот не здесь, а этого вообще нет, и надо извращаться как-то еще...
Помнится доооолго я колотился головой в стену, пытаясь использовать порт C, после замены AT90S8515 на ATmega16, пока не прочитал внимательно datasheet и не отключил JTAG :ups:

ZMIY
30.11.2010, 18:38
Ну так на вскидку несколько возможных причин:

Во как ! Про такое я даже и не подумал. Ладно, сейчас буду все настройки сверять с даташитом.


Это, кстати, еще одна из причин, по которой я не пользуюсь астмой - компилятору ЯВУ указал другой target и все - остальное "оно само думает". А тут сменил контроллер и началось - этот битик не там, а тот не здесь, а этого вообще нет, и надо извращаться как-то еще...

Да, это я тоже заметил :) Асм всем хорош, но вот эти битики не туда, не там и не в то время выбешивают. В дальнейшем буду наверное смотреть в сторону микро Паскаля. Но этот проект доделаю на Асме, ибо сесть сейчас разбираться с Паскалем, это ещё кучу времени потерять. Проще уже с худо-бедно освоеным ассемблером добить.

ZMIY
30.11.2010, 21:31
Нда... нечего на зеркало пенять, коли рожа крива.
В данном случае, на Ассемблер.
Ибо сам дурак :fool:
После того как я проверил все регистры со всеми битами и убедился, что у 16 и 8 меги они полностью совпадают (в том что я использовал), я зашёл в тупик.
Вообщем все дальнейшие мытарства по поиску бага не буду описывать, скажу только что собака зарылась в том, что я ПРИНИМАЯ сигнал с датчика, выставил принимающую ногу НА ВЫХОД :umora:
После того как переделал на вход, всё сразу и заработало :bravo:

PS Теперь меня удивляет другое, почему в 16-й меге с такими же параметрами оно работало, хотя по идее не должно было. :eek:

Zorge
30.11.2010, 22:30
Вообщем все дальнейшие мытарства по поиску бага не буду описывать, скажу только что собака зарылась в том, что я ПРИНИМАЯ сигнал с датчика, выставил принимающую ногу НА ВЫХОД :umora:
После того как переделал на вход, всё сразу и заработало :bravo:

PS Теперь меня удивляет другое, почему в 16-й меге с такими же параметрами оно работало, хотя по идее не должно было. :eek:
Может из-за этого и помехи были столь зверскими? :)


P.S. Это еще не самый веселый прикол схемотехники. Помнится на лабораторке по ней студенты умудрились:
- Включить К155ЛА3 в противоположной полярности по питанию (ну это нормально - их так часто жгли)
- Составить схему так, что она у них РАБОТАЛА. Но только каждый ее элемент вел себя не как 2И-НЕ, а как 2ИЛИ-НЕ (и не надо крутить пальцем у виска - лично видел правильное переключение светодиодов и проводочки сам перетыкивал для проверки).
- Оставить эту микросхему в живых. :eek: Обычно ТТЛ 5 вольт от переполюсовки дохнет в течение двух секунд. Этой повезло - ее включили через резистор 330 ом, который ее и спас.

P.P.S. А еще обычный светодиод, да тот самый АЛ307 зеленого цвета, при включении на номинальном токе в 5 миллиампер и плавном увеличении тока до 5 ампер может работать. Я бы больше ему подал, но токограничивающий резистор на 220 ом 0.125 ватт перегрелся и отпаялся. :D
Что со светодиодом стало? А ничего. Пожелтел только (стал желтовато-зеленым), а потом через полчаса нормальной эксплуатации (5 миллиампер) погас.

ZMIY
30.11.2010, 23:38
Может из-за этого и помехи были столь зверскими? :)

Неа. Помехи я на комп записывал, соответственно отключив датчик от схемы и включив в комп.

Да, пораскинул тут мозгами и подумал, что ничего особо удивительного в том, что работало нет.
Дело в том, что в AVR три регистра отвечающие за состояние ноги. Один (DDR) конфигурирует на вход/выход, второй (PORT) на высокий/низкий уровень при выходе и pull-up/hi-z на входе. А вот третий (PIN) - ничего не делает, а только показывает что имеем в текущий момент на самом деле.
И он то и читается. Т.е. у датчика видимо хватило мощи задавить то питание что выдаёт нога и МК соответственно на это изменение уровня реагировал. Ну а в 8-й Меге видать нога оказалась сильнее и доблестно охраняла сама себя от посягательств.

PS Кстати про помехи. Решил проверить алгоритм на помехоустойчивость и открутил фантик. Ничё, нормально работает, пофиг ему на помехи.

PPS Студентам какую оценку поставили ? :)

LeonT
01.12.2010, 00:49
Поздравляю ! Пасибки! :thx: Теперь вот думаю, что бы повесить на оставшиеся кнопки пульта... может, сваять управление оконными жалюзи? Чтобы уж полностью оправдать гордое имя проекта "лежебока"... :D


Это еще не самый веселый прикол схемотехники Помню случай, когда в 252-х блоках питания (один из первых советских импульсников, применялся для питания Р-381Т1-3, Р-381Т1-4 и некоторых других "устройств") ремонтники умудрились перепутать базы с эмиттерами выходных ключевых 2Т812-х транзисторов. Самое удивительное, блоки работали! Выходные напряжения были занижены, но работали! И это при том, что часто бывало, "вылетали" от малейшего чиха... %)

ZMIY
01.12.2010, 01:51
Теперь вот думаю, что бы повесить на оставшиеся кнопки пульта...
Ну вот те здрасте ! А как же "классическая" задача для ДУ - включение света в комнате !
Или включить электрочайник на кухне. Включил и через пару минут можешь идти чай наливать :) Правда надо защиту придумать, чтобы случайно пустой не включить. Ну весы например под него и проверять чтобы вес был больше заданого значения... :jokingly:

LeonT
01.12.2010, 17:22
А как же "классическая" задача для ДУ - включение света в комнате Ёёёё... Забыл! Сенкс! :D

Zorge
01.12.2010, 18:10
Дело в том, что в AVR три регистра отвечающие за состояние ноги. Один (DDR) конфигурирует на вход/выход, второй (PORT) на высокий/низкий уровень при выходе и pull-up/hi-z на входе. А вот третий (PIN) - ничего не делает, а только показывает что имеем в текущий момент на самом деле.
:aga:
А если внимательно почитать Datasheet в части Input/Output pins, то можно выяснить, что на PIN сигнал приходит непосредственно с выводов микроконтроллера, а уже дальше по схеме подключаются DDR и PORT.



Ну а в 8-й Меге видать нога оказалась сильнее и доблестно охраняла сама себя от посягательств.
Наверное, что из-за того, что у 8-й меги ног меньше, и соответственно общая мощность микросхемы распределяется на мЕньшее количество ножек, и каждая отдельно взятая ножка "мощнее". %)



PS Кстати про помехи. Решил проверить алгоритм на помехоустойчивость и открутил фантик. Ничё, нормально работает, пофиг ему на помехи.
Кстати о фантике - спасибо за идею. :cool:
Сегодня на работе дико заглючила одна из видеокамер. В месте, где происходит переход с коаксиального кабеля на витую пару, кто-то включил очередной пробкотрон.
"Фантик" из фольги вокруг преобразователя, подключенный одним концом к экрану коаксиала, а другим - к экрану STP решил вопрос.




PPS Студентам какую оценку поставили ? :)
Не запомнил. Обычно если и выливается во что-то отрицательное, то не сильно. Студенты - это особый вид существ, совершенно без задней мысли способных спалить все что угодно совершенно "на раз".
Я сам как-то на лабе по микроэлектронике включил КП301-му ток через канал 85 миллиампер. Мало того, транзистор умудрился при этом выжить (у него 15 миллиампер - предел). :ups:
Выяснилось это только когда я листочек с табличкой и снятыми данными отдал преподавателю.
А транзистор накрылся "на руках" у следующего студента. Естественно тот все валил на меня - с такими-то уликами. :D

ZMIY
01.12.2010, 19:47
Кстати о фантике - спасибо за идею. :cool:

Да на здоровье. Главное, чтобы эта идея до Китая не дошла :secret:

PS Zorge Адрес: Байконур т.е. я могу теперь на каждом углу хвалиться, что моё изобретение внедрили в космической отрасли ? :yez:

Zorge
01.12.2010, 20:16
PS Zorge Адрес: Байконур т.е. я могу теперь на каждом углу хвалиться, что моё изобретение внедрили в космической отрасли ? :yez:
:aga:

Эх, и чего мы только в этой отрасли не внедряем...
Некоторые штучки из проводков и винтиков, слабанные на коленке, просто поражают своей примитивностью, видимостью ненадежности (на самом деле все приделано на совесть) и потрясающей долговечностью.