Микроконтроллеры | Какой тип таймера ATMega16 лучше использовать? |
|
---|---|---|
Согласен, что непонятно сколько, но это "непонятно сколько" по сравнению с вашими 50 герцами - исчезающе малая величина. Не берите в голову. Просто перепрограммируйте таймер на новые задержки, отсчитаете по ним свои два импульса, а затем перепрограммируйте таймер на пачку. Никаких delay, конечно не нужно, а уж в обработчике прерываний - тем более. |
|
|
Спасибо за ответы. Интересный алгоритм вырисовывается А на счёт генерации одного импульса на каждую нечётную пачку я думаю chet++; Инкреминировать и проверять условие нечётности лучше в какой момент будет, в момент перепрограммирования таймера на новые задержки? Может есть ещё варианты какие-то? P.S. не отображается два значка меньше, написал - сдвиг_влево. |
|
|
chav1961: Просто Вам нужно 38 раз поймать прерывание по переполнению, и один раз после этого - прерывание по OCR, причем в OCR должно быть число 28. 38 * 256 + 28 = 9756, что и требовалось. Таймер после последнего OCR нужно будет остановить, обнулить, и запустить заново. Частота импульсов у вас очень низкая, можете изгаляться как хотите Можно обойтись одним таймером и одним прерыванием по переполнению. Записываете в таймер остаток, например 28, и считаете прерывания 38+1 раз. Делаете, что надо, опять записываете остаток 28 и всё по-новой до скончания века. |
|
|
Вариант разумный. Вообще эту задачу можно реализовать самым дубовым способом - определить в программе массив из 15 байтов (это как раз 120 бит), и проставить в соответствующих битах нолики и единички в соответствии с времянкой. А затем по каждому тику выводить очередной бит на линию порта. Также поступить и с другим сигналом. Но это - на любителя Зато времянка может быть любой сложности - хоть слово х@# морзянкой. Вообще табличный способ программирования, в тех случаях, когда заранее известно, что и в каком порядке выдавать - наиболее простой. |
|
|
Digital: Может есть ещё варианты какие-то? Я делал по-другому, и по-моему проще. Удвоил количество прерываний и на каждом прерывании выдавал наружу образ порта. Прерывание получилось очень короткое. Осталось только настроить таймер на нужную частоту. Вид образов порта примерно такой.
Можно легко добавить формирование других сигналов, отдельный импульс, как в вашем случае. Для вашей нечетности можно удвоить таблицу. |
|
|
Да, проще, правда, за счет некоторого расхода памяти. Ну, за все платить приходится... |
|
|
chav1961: определить в программе массив из 15 байтов А почему массив определять именно такого размера (8х15, ну 8 понятно почему )? |
|
|
Насчет размера - у Вас нижний по схеме сигнал идет как 1.0.1.0.1.0....1.0.1.0.0.0.0.0.(здесь закончилась первая пачка и началась вторая)1.0.1.0.1.0...и.т.д. Если посчитаете число таких единичек и ноликов, на период как раз 120 шт. и наберется Т.е. по каждому событию "таймер отсчитал" безо всякой логики извлекаете следующий бит из массива и выдаете на линию порта. У GM эта идея более прозрачно изложена, я сделал немного посложнее, чтобы подэкономить на памяти. Храните массив там, где удобнее. Удобнее, на мой взгляд, в памяти программ ЭСППЗУ требует кучи приседаний и подпрыгиваний для извлечения байта, а доступ к памяти программ реализуется одной командой. Да и не для того ЭСППЗУ предназначено, чтобы в нем постоянную информацию хранить. |
|
|
Спасибо ребята, было очень интересно. Теперь осталось |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2024 |