Свежие обсуждения
Микроконтроллеры

Ликбез по программированию PIC

1 67 99

Splav56: это и есть КОНКРЕТНОЕ четырехканальное устройство Да никто ж не против. Мы уже взялись за него и делаем. Речь была о другом - об очередном несложном учебном девайсе без излишнего углубления в теорию.

Zandy: какой все-таки алгоритм выберем окончательно? Мне всё более привлекательным кажется вариант chav1961 с принудительным опросом порта через каждые t мкс. Для этого используем один из аппаратных таймеров. Для выявления тайм-аутов поначалу предлагаю задействовать ещё один аппаратный таймер. Позже, если получится, упростим.
Для организации мигалок можно, например, использовать тот же аппаратный таймер, что и для опроса порта. Сделать программный счётчик (возможно, что 16-разрядный). При каждом прерывании инкрементировать его. А потом програмно "подключать" мигающий светодиод к одному из битов этого счётчика. К примеру, при квантовании через 512 мкс для бита 10 получаем частоту примерно 1,9 Гц, если я в расчёте опять не глюканул.

 

Хочу еще "похныкать" малость. Так уж сложилось, что у меня нет собственного личного интереса в постановке задач и их решения каких-то простых конструкций на МК. Именно поэтому я и не могу сам себе поставить задачу. Конечно могу, но без личной заинтересованности в конечном результате, согласитесь, это очень муторно и требует привлечения громадной силы воли. Поэтому я и согласен работать, чтобы удовлетворять интересы, если не себя, то других. По крайней мере будет ощущение какой-то пользы.
А мои личные интересы все-таки лежат в области радиосвязи. Жутко интересны всяческие цифровые протоколы передачи и приема данных, кодирование, манчестер, скремблирование, запись и хранение информации, обеспечение работоспособности современных микросхем приемопередатчиков с встроенными цифровыми протоколами, и много чего еще! Я думаю, в этом ликбезе мы даже и близко к этому не подберемся, особенно с нашими темпами.

 

picmaniac: Мне всё более привлекательным кажется вариант chav1961 с принудительным опросом порта через каждые t мкс.

t =? А в чем собственно преимущества? Я не понимаю. А подсчет периода тоже во времени кратном t, или оставляем наш "счетный" таймер? Т. е. три таймера задействуем?

 

А как насчёт самому подумать, а? Картинку набросать, поразмышлять... Ну а если "интереса нет" - тогда уж и вовсе не знаю что сказать... Не придумали пока "мнемографов", знания и опыт в готовом виде не продаются. Чем больше будете сами разбираться - тем быстрее и лучше пойдёт освоение.
t может, например, равняться 512 мкс. Или 1024 мкс. Таймеров, думаю, двух хватит.
И хватит "хныкать".

 

picmaniac: Чем больше будете сами разбираться - тем быстрее и лучше пойдёт освоение.
Да пытаюсь я. Просто вы, корифеи, понимаете друг друга с полуслова, а для меня это тайна за семью печатями. Так и не понял, в чем же преимущества.
picmaniac: А как насчёт самому подумать, а?
Да думаю я. Просто вы же сами говорили, что задавать вопросы, даже самые глупые не возбраняется. Мои вроде не совсем уж дебильные. Я же не прошу разжевывать. Просто намекните хотя-бы, чтобы смысл уловить.

 

Я вот хочу очередную глупость "сморозить". Такая очень сырая - пресырая идея.
Допустим, делаем прерывания от таймера с периодом 500 мкс, как и предложил picmaniac. Ловим передний фронт импульса. Когда поймали, устанавливаем "личный" счетчик этого конкретного канала в 0. В каждом прерывании инкрементируем его. Как только будет пойман следующий передний фронт, считывем состояние счетчика - это и будет длительность сигнала. обнуляем - и по новой. А можно и не обнулять. Организуем еще один счетчик, который будет считать количество передних фронтов. Насчитали, допустим 8, считали счетчик длительности, сдвинули вправо 3 раза - получили усредненную длительность.
Преимущество такого способа в том, что можно "завести" свой счетчик на каждый канал и не морочиться с вычислением разности текущего и предыдущего значений.

Только что пришел из театра. В "Сатириконе" - Король Лир с К. Райкиным в роли Лира. Вещь! Спать не охота.

 

Это вовсе не глупость, а хорошая идея. Если t=512 мкс (предделитель на 2 перед таймером), то 8-разрядного счётчика хватит на 255*512=130560 мкс. Вполне достаточно для одного периода в нашем случае.
Может быть и одного аппаратного таймера хватит. Задействуем ещё один программный счетчик (регистр ОЗУ) вместо таймера тайм-аута. Он будет инкрементироваться при каждом прерывании, и сбрасываться при условии, что за определенный интервал времени произошли изменения уровня на всех входах (это можно реализовать с использованием флагов, как уже разбиралось выше). А если число в этом счётчике достигло определённого значения - это и будет признаком тайм-аута.

Вот рисунок (широкий опять же) набросал: http://www.pic16.nm.ru/likbez1/drawing8.gif

Возможно, что и ещё проще получится сделать. Если сможем тайм-ауты отслеживать прямо по тем же регистрам, по которым считаем периоды для каждого входа.

 

Вот ещё вариант. http://www.pic16.nm.ru/likbez1/drawing9.gif
Тайм-ауты отслеживаются прямо по числам в регистрах периодов.
Для разрешения/запрещения инкремента соответствующих входам регистров периодов служат флаги. Изначально все флаги сброшены. При появлении фронта на входе соответствующий этому входу флаг устанавливается, тем самым разрешается инкремент соответствующего регистра периода при каждом прерывании. При появлении следующего фронта на том же входе число из регистра считывается, затем регистр обнуляется. И т.д.
Если число в регистре превысило допустимое значение (например 250)- это признак тайм-аута. Сбрасываем соответствующий флаг, запрещая дальнейший инкремент. И ждем фронта, когда флаг снова установится.
Как возможный вариант, предлагаю изначально и при тайм-ауте записывать в регистр периода для каждого входа число 255 (0FFh).

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

 

Да, все понятно, в общих чертах. Буду писать программу, а то уже команды ассемблера забывать начал.
picmaniac, еще вопрос по visio, а может не по visio. С русскими шрифтами в разных программах у меня периодически проблемы выскакивают. Делаю рисунок в visio, сохраняю в родном формате, все в порядке. Но, если я сохраняю в .gif, исчезает то, что написано русским шрифтом.
Сегодня съездил в книжный, купил Шпака и еще несколько книженций по теме. К Шпаку диск прикладывается. Книжки дорогие - жуть, разорился. В электронном виде читать не люблю, а распечатывать и сшивать - дороже обойдется.

 

Меня кнопа "PrintScreen" выручает. Скриншот из Visio --> Paint --> кадрирование --> сохранить как gif.
Сколько ж стоит Шпаковская книженция? Вообще-то я наверно буду по частям на работе печатать, когда до освоения Си доберусь. Там из всей книги ~ 5...10% только реально полезно распечатать (ИМХО).