написал апликуху для генерации шимов на avr gcc для atmega32, собрал схему в протеусе (version 7.5 sp3). шимы генерируются, но довольно часто подглючивает. причём, такое ощущение, что подглючивает сам протеус. глючит следующим образом: OCR1B = 76С0, а прерывание sig_output_compare1b срабатывает при TCNT1 = 5dF3. вообще, значение OCR1B я изменяю при переполнении счётчика. в даташите написано, что сравнение происходит на каждый такт. может ли такое быть, что протеус просто коряво генерирует прерывания, не утруждая себя сравнениями на каждый такт? может есть другие средства отладки, помимо протеуса, чтобы быть увереным что именно глючит: прога или эмулятор?
cupuyc avr gcc очень любит глючить при включённой оптимизации. Еще, не помню как в atmega, но в xmega при записи в некоторые регистры устройств размером более одного байта, запись нужно начинать с младшего байта и записывать все байты значения, потому что там используются буферные регистры, из которых данные переносятся в регистры устройства только при записи старшего байта, чтобы обеспечить атомарность. Завтра может внимательнее посмотрю как там шимы генерируются.
эмулятор - скорее всего. Бывали у меня проекты (AtMega8) в реале работает, а на модели х... Или с точностью до наоборот. Модель пашет - железяка дохлая. Ну это на первый взгляд. Начинаешь копать и оказывается, что глючит всё сразу, и эмулятор и прога шалит. Очень частая ошибка - это обработка прерываний. Забыл где то регистр сохранить, или еще хуже пишеш в регистр (в прерывании) который сейчас используется в основной проге. Было у меня парочку такого рода глюканов когда свою ОС писал. Долго парился, выяснял в чем дело. То прога работает долго и не глючит, дописываю пару строк, вылетает почти сразу. Вытираю их, добавляю один NOP - тоже вылетает. Думаю как NOP может влиять на работоспособность всей проги? Целый день потратил. Это был ППЦ. Оказалось всё очень даже просто было в проге одно "мрачное" место в 3 такта. Если было прерывание именно там то всё вылетало. Можешь прикинуть какая вероятность того, что это "блин" прерывание и именно одно (Таймер 1) будет за эти 3 такта (за 375 нс). И, таки, оно каким то образом происходило именно в этом месте. IHMO: Посмотри свою прогу, и не доверяй на 100% всяким там эмуляторам. Удачи. ЗЫ: Я не наСильник - по этому ничем не смогу тебе помочь. Пишу на асме.
вобщем, скорее всего, придётся проверять на железяке... сейчас новый протеус скачаю - посмотрю как на нём будет пахать... Это я всё к тому, что протеус, насколько я понимаю, глючит довольно часто и особо доверять ему нельзя... так?
S_Alex Ну я честно сказал что про atmega не помню, просто указал что на этот момент нужно более пристальное внимание обратить. А для xmega вот что doc8077.pdf говорит:
Black_mirror Да про регистры то я знаю. Я не думаю, что avrgcc про это не знает. Думаю, дело не в этом.