Все выходные крутил и так и эдак. Уже и ассемблер вспомнил. ))) Пока у меня нет под руками программатора, приходится пытаться понять в Симуляции. Если я Вас правильно понял - да, все разрешения прерываний я включаю в нужных регистрах. Обработчики прерываний я тоже прописываю.
Смысл такой. Хочется иметь выходной сигнал, в котором можно задавать длительность импульса и длительность паузы. Причем они кратны т.е. И/П от 1:1 до 1:30.
Таймер запускаем в режиме сравнения с изменением сигнала на ножке OC1A на противоположный при каждом совпадении таймера с OCR1A или ICR1. С кем сравнивать в следующем цикле выбираем в соответствующем прерывании. Т.е. прерывание по совпадению с OCR1A меняет регистр TCCR1B так, чтобы в следующем цикле было сравнение с ICR1, в прерывании которого мы меняем TCCR1B так, что следующее снова по OCR1A и так по кругу.
Согласно Даташиту это должно работать. Но в симуляции это не работает. Сначала по причине особенно умного компилятора, который обработчики прерываний не посчитал нужным добавлять в результирующий код. Потом, когда обработчик "поднастроил", симуляция подкинула вопросов. Почему-то Протеус пока солидарен при симуляции с ATMELStudio. Вероятно компилятор надо ещё крутить? попутно разбираясь в дизассемблере.
Я пробовал ставить какую-то студию 4 версии. Там был косяк при пошаговой отладке. После случайного количества шагов, т.е. каждый раз в разном месте, симуляция переходила сама по себе в автоматический режим, как будто я нажал F5... НО! После остановки по Ctrl+F5 счётчик тактов не был увеличен, т.е. симуляция не шла. Сначала я какое-то время нажимал Ctrl+F5, а потом меня это достало, и я стал искать какую-то другую версию. В 7 версии этого глюка не было. Но как оказалось есть другие. ))))
Теперь понятно, почему так много народа предпочитающего писать на ассемблере. Проще раз в логику погрузиться, чем пытаться отловить свои ошибки среди стада чужих косяков.
akl писал(а):
Замечу, студия не полностью адекватно справляется с режимами работы таймера. Например, игнорирует режим 12 CTC ICR1.Так что только проверка в железе.
Starichok51 писал(а):
причем, не только режим 12, и несколько других. зато Протеус правильно симулирует все режимы.
Эх, знать бы это сразу. Не пришлось бы несколько дней подряд доводить себя до депрессии подозрениями в собственном недостатке ума. )))
Остаётся ждать программатор и проверять в железе.
Всем спасибо за участие!
Добавлено after 7 minutes 54 seconds: P.S. Если уходить куда-нибудь на STM32, там подобные проблемы, или есть более менее нормальная среда, где можно работать не натыкаясь на такое вот? Нынче ценник практически не различим, можно было бы попробовать.
... Хочется иметь выходной сигнал, в котором можно задавать длительность импульса и длительность паузы. Причем они кратны т.е. И/П от 1:1 до 1:30...
Решается аппаратными возможностями таймера 1 без прерываний. При тактовой частоте 10МГц длительность импульса 0,1...6553,4 мкс, период 0,2...6553,5 мкс Добавлю, чтобы не быть голословным. viewtopic.php?p=3147192#p3147192
Последний раз редактировалось akl Вт янв 21, 2025 04:00:22, всего редактировалось 1 раз.
Батон Изюмыч, ИМХО, ассемблер нужен только для особо критичных участков кода, когда необходимо, например, соблюсти четкие тайминги. В остальных случаях хватает ЯВУ. (любителей холивара прошу не возбуждаться - это мое ЛИЧНОЕ мненеие). Отладка в студии достаточно грустная бывает, АВРки проще отлаживать на макетке.
Касательно прерываний в режиме СТС. В некоторых АВРках (кажется, в мега8), когда ТОР счета не определен режимом, а задается в регистрах OCR1A/ICR1, по достижению верхнего значения генерируется не прерывание сравнения, а прерывание переполнения - OVF.
Запустите в отладчике свою программу, дождтитесь, когда счетчик достчитает до ТОР и обнулится - и посмотрите регистр флагов TIFR - какой там флаг поднялся. Вполне вероятно, что там будет не OCF1A/ICF1, а TOV1.
Вроде это где то в Евстифееве описано было, или в Белове. Но это было очень давно и я уже не помню, где я это читала.
-- Касательно STM32СпойлерSTM32 - по уровню вхождения несколько более тяжелый МК, больший объем документации, меньше русскоязычной. Но из плюсов после СТМ - памяти в разы больше. Скорости выше. Периферия более развесистая и богатая. Минус - нет ЕЕПРОМки. И самый главный плюс - есть бесплатная среда разработки от ST на базе Эклипса - и в ней есть полноценная железная отладка, которая позволит заглянуть в любое место флеша, ОЗУ, периферии и даже их поменять - и это ценой 2-долларового ST-Link'а. (Но это уже оффтоп для данной темы и с данным вопросом лучше в другую ветку форума)
Ну вот крутили мы с коллегой F411CE (128/512) и там флеш - сначала 4 блока по 16к, потом блок 64к и далее три блока по 128к. И как на таком конском блоке имитировать оргазм ЕЕПРОМ ?
И как на таком конском блоке имитировать оргазм ЕЕПРОМ ?
ST в AN3969 предлагает использовать последние два сектора на 16КБ... А вообще F1 и F4 - это же одни из первых серий, там старая периферия и размашистые Errata, я от такого давно избавился ) С другой стороны прыгать сразу на G4/H5 человеку который не может на AVR таймер запустить явно не стоит, максимум какой-нибудь мелконогий STM32G071 с секторами по 2КБ.
А что крамольного в этих параметрах? Период, длительность - базовые понятия в импульсной технике. А "соотношения высокий/низкий" - может, слегка коряво, но вплне понятно: скважность (коэффициент заполнения) .
Благодарю, обязательно изучу! Это прямо даже больше чем мне надо.
Just_Fluffy писал(а):
Батон Изюмыч, ИМХО, ассемблер нужен только для особо критичных участков кода, когда необходимо, например, соблюсти четкие тайминги. В остальных случаях хватает ЯВУ.
Мне сейчас просто помогает понять попадают или не попадают конкретные функции в конечную прошивку. А они при некоторых настройках вполне конкретно не попадают, судя по тому, что я вижу в дизассемблере. Я думал придётся долго курить Даташит на Мегу8, а вместо этого я курю форумы по глюкам IDE разных версий.
Just_Fluffy писал(а):
Отладка в студии достаточно грустная бывает, АВРки проще отлаживать на макетке.
Вот я к этому и пришёл. Думаю придёт программатор и всё наладится у меня.
Just_Fluffy писал(а):
Запустите в отладчике свою программу, дождтитесь, когда счетчик достчитает до ТОР и обнулится - и посмотрите регистр флагов TIFR - какой там флаг поднялся. Вполне вероятно, что там будет не OCF1A/ICF1, а TOV1.
Я проверял, поднимаются нужные флаги, но перехода почему-то нет. А в Proteus'e другой момент вылез для меня не понятный. Т.к. перехода на обработчик прерывания не происходит, то поднятые флаги остаются поднятыми до конца. Я решил добавить в основном цикле сброс типа "TIFR=0", Proteus шаг за шагом исполняет код, делает вид что исполняет это обнуление, но в WatchWindow у TIFR состояние остаётся не сброшено. Возможно это от того, что качаю программы откуда попало (откуда могу). Может в них кто поковырялся на предмет подселения вирусов и у них мозги съехали... ХЗ. --
Just_Fluffy писал(а):
Касательно STM32СпойлерSTM32 - по уровню вхождения несколько более тяжелый МК, больший объем документации, меньше русскоязычной. Но из плюсов после СТМ - памяти в разы больше. Скорости выше. Периферия более развесистая и богатая. Минус - нет ЕЕПРОМки. И самый главный плюс - есть бесплатная среда разработки от ST на базе Эклипса - и в ней есть полноценная железная отладка, которая позволит заглянуть в любое место флеша, ОЗУ, периферии и даже их поменять - и это ценой 2-долларового ST-Link'а. (Но это уже оффтоп для данной темы и с данным вопросом лучше в другую ветку форума)
Прежде чем начинать заново изучать AVR я слегка ознакомился с архитектурой СТМ в даташите. Архитектура прямо сказать более богатая, при соизмеримых ценах. В сторону ATMega склонился лишь от того, что в заначке лежит пяток чипов, которых хочется применить.
OKF писал(а):
И даже компилятор танцору не мешает.)
В свое время я перешел на инженерную работу где мне пришлось учиться работать с SolidWorks. Там своих тонкостей конечно масса, но тогда я "танцевать" начал уже на 3ий день после начала установки ПО. Сейчас я никак не могу понять, почему вместо паркета в танцевальном зале наждак, пол кривой и в нём посередине люстра снизу вверх. Ну так, если как вы, метафорически.
Adrift писал(а):
человеку который не может на AVR таймер запустить явно не стоит, максимум какой-нибудь мелконогий STM32G071 с секторами по 2КБ.
Простите, понесло на метафоры. Представьте, вы учитесь водить машину. Давите на газ как Вас учили в инструкции к машине, а машина ехать не хочет. И Вам все говорят, что значит вы не правильно давили, и вы пробуете разные варианты, даже идиотские, но ничего не выходит. А вы уже и правой ногой давили, и левой, и двумя руками, и ручник проверили и даже по колесу постучали, на всякий случай, а вдруг. А потом оказывается, что у Вас педаль газа не соединена с мотором, т.к. рабочий завода забыл тросик присоединить.
ST в AN3969 предлагает использовать последние два сектора на 16КБ...
Вот в том то и проблема, что у 411 последние 2 сектора не по 16к, а по 128....
Батон Изюмыч писал(а):
Я решил добавить в основном цикле сброс типа "TIFR=0", Proteus шаг за шагом исполняет код, делает вид что исполняет это обнуление, но в WatchWindow у TIFR состояние остаётся не сброшено
А даташит читать пробовали? Эти флаги сбрасываются записью в них единички. TIFR |= _BV(OCF1A)
Вообще, если уже так тяжело с изучением МК, начните кушать слоника частями, сначада х..обот, потом ухи...
Запустите таймер в режиме 0, убедитесь, что он считает. Далее, сделайте три обработчика прерывания - по обоим каналам сравнения и по переполнению. Разрешите все три прерывания в TIMSK, не забудьте выполнить SEI. В регистры сравнения что то запишите, лучше разное, что б прерывания возникали в разное время. В обработчиках прерываний переключайте состояние каких то битов порта .. PORTB ^= _BV(PORB1). Для каждого прерывания свой бит.
Когда добьетесь, что прерывания работают - пробуйте статично инициализировать таймер другими режимами и смотрите , что получается.
Вообще, прерывания таймера - достаточно простая штука в АВРках.. Главное помнить, что если из прерывания модифицируются какие то внешние переменные (флаги), то их надо волатильными объявлять.
Было бы неплохо эти эксперименты делать в железе. Но на худой конец протеус или встроенный отладчик подойдут.
Вот в том то и проблема, что у 411 последние 2 сектора не по 16к, а по 128....
Имелись в виду последние 2 сектора на 16К, из первых четырех. Ну да, оно не удобно, однако это старые F4 так отличились, у остальных мк сектора максимум по 8К, у более простых C0/G0/G4 - по 2КБ. И еще наметилась тенденция делать часть флеша с ресурсом 100К(H5), у U5 может даже весь флеш таким быть, для U3 тоже обещают 100К.
akl, Я решил свою задачу через FastPWM. Когда по диагонали читал Даташит, мне показалось, что этот режим мне не подойдёт, всю дорогу думал что у него TOP с завода задан константами по WGM. Оказалось его можно в свободной форме задавать. Сосредоточился на других режимах и потерял время. Спасибо, что дали пинка, он мне явно был очень нужен.
Одно только я так и не смог понять, как вы смогли достичь длительности импульса 0,1мкс при периоде 0,2мкс при тактовой частоте 10МГц. Это считай два такта счёта счетчика, а для FastPWM ограничение значения TOP согласно даташита - 2бита. (The minimum resolution allowed is 2-bit (ICR1 or OCR1A set to 0x0003), and the maximum resolution is 16-bit (ICR1 or OCR1A set to MAX) Стр.88 Даташита. Или я не правильно это себе представляю?
Just_Fluffy писал(а):
А даташит читать пробовали? Эти флаги сбрасываются записью в них единички. TIFR |= _BV(OCF1A)
Я в курсе инверсии у флагов. Тут принципиально было пишется или нет - в симуляторе почему-то не пишется.
Just_Fluffy писал(а):
Когда добьетесь, что прерывания работают - пробуйте статично инициализировать таймер другими режимами и смотрите , что получается.
По частям и кушаю. Но что-то с прерываниями совсем затык. В некоторых вариантах указатель перескакивает в обработчик (смотрю в дизассемблере), но проходя по командам регистры почему-то не меняются.
Вот даже сейчас у меня без всяких прерываний в main присваиваются значения регистрам ICR1 и OCR1A двумя последовательными командами. В симуляторе ATMELStudio в регистре ICR1 значение появляется сразу, а в OCR1A оно появляется, когда уже счётчик два раза через TOP прошел, а программа давно в while(1) крутится. При том, что и в дизасме эти команды тоже конкретно по порядку шли, как и в СИ. И ATMELStudio по ним курсором проходит изображая деятельность, типа всё в порядке. Только в окне I/O в одном регистре все ОК а в другом пусто. ХЗ.
При теперешней реализации генератора прерывания мне не очень-то и нужны. Но хочется разобраться. Устал воевать с Симулятором, теперь уже подожду возможность проверять в железе (в четверг должно с программатором срастись), и тогда снова приступлю к этому вопросу.
Just_Fluffy писал(а):
Главное помнить, что если из прерывания модифицируются какие то внешние переменные (флаги), то их надо волатильными объявлять.
Об этом я уже тоже начитан. В том коде, с которого начался мой вопрос уже так и было сделано сразу.
...Одно только я так и не смог понять, как вы смогли достичь длительности импульса 0,1мкс при периоде 0,2мкс при тактовой частоте 10МГц. Это считай два такта счёта счетчика, а для FastPWM ограничение значения TOP согласно даташита - 2бита. (The minimum resolution allowed is 2-bit (ICR1 or OCR1A set to 0x0003), and the maximum resolution is 16-bit (ICR1 or OCR1A set to MAX) Стр.88 Даташита. Или я не правильно это себе представляю?
У меня нет под рукой DS mega8. На макетке с tiny2313a тактируемой от кварца 20МГц загрузил нижеследующую программу и получил как и предполагал положительный импульс длительностью 0,05 мкс и периодом 0,1 мкс (закомментировано) или 0,5 мкс (чтобы различить положительный импульс длительностью 0,05 мкс. На меандре это непонятно.)
В симуляторе ATMELStudio в регистре ICR1 значение появляется сразу, а в OCR1A оно появляется, когда уже счётчик два раза через TOP прошел
В некоторых режимах значения регистров сравнения при присвоении кешируются в теневые регистры. И обновляются на следующем цикле счетчика.
Попробуйте на чистом асме нарисовать инициализацию таймера, его прерываний, нарисуйте обработчики прерывания таймера, что б они что то в порту инвертировали, например. Что б исключить компилятор Си. И проверьте в в отладчике ассемблерный код прошагать.
В некоторых режимах значения регистров сравнения при присвоении кешируются в теневые регистры. И обновляются на следующем цикле счетчика.
Я в курсе этого, но честно сказать, не сообразил проверить. Не обновляется как раз один из тех регистров, что в некоторых режимах буферизуются. Посмотрю. Спасибо!
Всем привет.Прошу помощи у участников форума.В своём проекте хочу использовать для микроконтроллера стороний загрузчик.Нашёл в сети открытый проект: https://github.com/hexagon5un/fastboot- ... of-content. Настроил под свой контроллер.Но компилятор выдаёт ошибки.Система - Win7x64, AVR Studio 4.18SP3, WinAVR 20100110.Что-то я делаю не так? Прошу наставить на путь истины.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения