Буратино 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Работаю с процессором ATMega8. Необходимо на выводы OC1A, OC1B вывести сигнал 125кНz в противофазе. В режиме CTC (сброс при совпадении) можно переключать в противоположное состояние вывод OC1A и/или OC1B, но получить сигналы на пинах в противофазе никак нельзя. Может быть необходимо ввести обработчик прерывания переполнения и уже в нем инвертировать второй вывод относительно первого? Возможно ли используя режим CTC получить сигнал на указанных выводах в противофазе не используя прерывания, либо же в данном случае правильнее использовать режим Fast PWM? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
CYD 0 11 мая, 2011 Опубликовано 11 мая, 2011 (изменено) · Жалоба В книжке написано, что тоглать можно только ОС1А. Я вчера делал девайс и тоглал ОС1В, но тоглать их в противофазе без прерывания не получится. возможно наиболее дешевым выходом будет дополнительный инвертер на выходе. хотя прерывание и пересчеты для тогланья в противофазе не отнимут больше 60-100 мкс. фаст пвм для противофазы не пробовал, но вроде как можно назначить на одну ногу инвертед, а на другую нон-инвертед. Изменено 11 мая, 2011 пользователем CYD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба В книжке написано, что тоглать можно только ОС1А. одновременно можно "толгать" и ОС1А и ОС1В - проверено. но тоглать их в противофазе без прерывания не получится. думаю получится, но в другом режиме возможно наиболее дешевым выходом будет дополнительный инвертер на выходе. это перебор хотя прерывание и пересчеты для тогланья в противофазе не отнимут больше 60-100 мкс. копеечка к копеечке.. :) Спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sergey_Aleksandrovi4 1 11 мая, 2011 Опубликовано 11 мая, 2011 (изменено) · Жалоба Ещё как вариант - пересесть с устаревшей восьмёрки на Mega88. По ногам совместима. В ней появился дополнительный регистр управления таймером TCCR1C с битами FOC1A и FOC1B, усановка которого форсирует событие "Совпадение" для логики управляющей ногами OC1A и OC1B соответственно. Так, например, принудительно дёрнули ногу OC1A установкой бита FOC1A, запустили таймер в режиме CTC с указанием изменять состояние выводов OC1A и OC1B. В итоге при каждом Compare Event выводы будут "тоглеться", причём в противофазе. Таким макаром я подавал сигнал удвоенной амплитуды на пьезоизлучатель (вместо 3.3 В на его выводы приходил сигнал с размахом 6.6 В). UPD Хоть топикстартер и решил проблему, всё-равно поправлюсь: в Mega8 тоже есть биты FOC1A и FOC1B, но в регистре TCCR1A. Изменено 11 мая, 2011 пользователем Sergey_Aleksandrovi4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба В режиме CTC (сброс при совпадении) можно переключать в противоположное состояние вывод OC1A и/или OC1B, но получить сигналы на пинах в противофазе никак нельзя.Почему нельзя? Что мешает остановить таймер (CS1x = 0), настроить таймер в режим 4 или 12 (CTC со сбросом по значению ICR1), для выходов поставить режим 01 (Toggle OC1A/OC1B on Compare Match), далее, установив FOC1A, инвертировать состояние одного из выходов и запустить таймер (CS1x = нужное значение предделителя). Все. Никаких сложностей не видно. В книжке написано, что тоглать можно только ОС1А.Выкиньте эту книжку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба тоглать Нет такого слова в русском языке. Есть "переключать", "устанавливать", "сбрасывать" и др. Поверьте, такая речь не только не украшает язык, но и сбивает с толку. Пришел ко мне на днях человек и говорит модное слово "Актюатор" (исполнительный механизм). В итоге выяснилось, что он не имеет представления о чем говорит вообще. Прошу прощения за :bb-offtopic: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Сделал вот так: void Init_Timer1 (void) { TCCR1A = (1 << COM1A1)|(1 << COM1A0)|(1 << COM1B1); TCCR1B = (1 << WGM12)|(1 << CS10); OCR1AH = 0x00; OCR1AL = 0x1F; } volatile INT08U j=0; #pragma vector=TIMER1_COMPA_vect __interrupt void timer1_compa_isr(void) { if (j) { TCCR1A = (1 << COM1A1)|(1 << COM1A0)|(1 << COM1B1); j = 0; } else { TCCR1A = (1 << COM1A1)|(1 << COM1B0)|(1 << COM1B1); j = 1; } } Но у меня используется и таймер 0, и он переполняется с большой частотой 8кНz. Наблюдаю искажения формы сигнала: (частота не ровно 125кHz в связи с тем что использую кварц немного другой) Не совсем понимаю почему так происходит, ведь приоритет у таймера 1 выше чем у таймера 0.. Почему нельзя? Супер, Спасибо! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Не совсем понимаю почему так происходит, ведь приоритет у таймера 1 выше чем у таймера 0.Приоритет определяет: какое прерывание обрабатывать первым при одновременности возникновения запросов от нескольких прерываний. Ежели МК приступил к процедуре обработки прерывания с низким приоритетом, которая выполняется Х мкс, а в это время был выставлен запрос на прерывание более высокого приоритета, то этот запрос будет отложен до окончания процедуры обработки прерывания низкого приоритета. Т.о. второе прерывание (с высоким приоритетом) будет задержано на Х мкс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 11 мая, 2011 Опубликовано 11 мая, 2011 · Жалоба Приоритет определяет: какое прерывание обрабатывать первым при одновременности возникновения запросов от нескольких прерываний. Ежели МК приступил к процедуре обработки прерывания с низким приоритетом, которая выполняется Х мкс, а в это время был выставлен запрос на прерывание более высокого приоритета, то этот запрос будет отложен до окончания процедуры обработки прерывания низкого приоритета. Т.о. второе прерывание (с высоким приоритетом) будет задержано на Х мкс. Да, спасибо! Всем сенкс, работает! :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 12 мая, 2011 Опубликовано 12 мая, 2011 · Жалоба ATMega8/8МHz кварц. Подскажите, как получить в микроконтроллере микросекундные задержки? Дело в том, что если я программирую таймер на такие периоды переполнения, то вся система вырубается! Думаю, что прерывание не успевает выполниться, и приходит следующее. Но мне нужно сделать в некоторых местах программы задержку в микросекундах! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 12 мая, 2011 Опубликовано 12 мая, 2011 · Жалоба Но мне нужно сделать в некоторых местах программы задержку в микросекундах!Можно просто крутиться в цикле N раз (см. __delay_cycles()). Такая задержка будет растягиваться за счет прерываний. Можно использовать свободнобегущий таймер: Считываете и запоминаете его значение в начале интервала, затем в цикле считываете его текущее значение, вычитаете из него начальное, сравниваете полученный результат с длительностью интервала. Если результат меньше - еще одна итерация цикла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 43 12 мая, 2011 Опубликовано 12 мая, 2011 · Жалоба А зачем все эти заморочки с прерываниями. В режиме ШИМ все будет происходить аппаратно и в противофазе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Буратино 0 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба А зачем все эти заморочки с прерываниями. В режиме ШИМ все будет происходить аппаратно и в противофазе. На сколько я понял, в режиме Fast PWM, счетчик считает от нуля и до разрядности ШИМ. Для моего кварца максим. чатсота гораздо ниже 125кHz получается. Может быть в других режимах ШИМ можно это сделать, либо Fast PWM настроить на счет не от нуля, но я сделал так как советовал Сергей: в режиме CTC перевернул одну лапу спец. битом и настроил пины соответственно. Все получилось здорово. У меня такой вопрос: сделал систему на процессоре ATMega8. Все работает так как и планировалось, за исключением одного "но". Дело в том, что рядом с процессором (~13mm) на плате расположено реле, которое коммутирует две настольные лампы, одна из которых VTLAMP3W (содержит две лампы дневного света BLUB 9W G23), другая обычная лампа накаливания на 40W. Время от времени процессор виснет:( Добавил доп. емкость на вход питания ,отпаял все лишние провода от лап. зы Конечно, в реале, реле будет коммутировать совсем не такие токи, но тем не менее нужно попытаться разобраться! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба Добавил доп. емкость на вход питания ,отпаял все лишние провода от лап. зы Конечно, в реале, реле будет коммутировать совсем не такие токи, но тем не менее нужно попытаться разобраться! Показывайте схему. Показывайте разводку. Вероятнее всего проблема в неправильной разводке земли, либо в висящем в воздухе без подтяжки входе Reset, либо не на все ноги завели земли/питания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 43 13 мая, 2011 Опубликовано 13 мая, 2011 · Жалоба На сколько я понял, в режиме Fast PWM, счетчик считает от нуля и до разрядности ШИМ. Для моего кварца максим. чатсота гораздо ниже 125кHz получается. Может быть в других режимах ШИМ можно это сделать, Можно чтобы считал до ICR1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться