Ну и прерывания лучше включать ДО включения таймера.
Не знаю как в Си, но в ассемблере разницы не будет, когда было произведено разрешение прерывания – хоть ДО, хоть ПОСЛЕ (разницы никакой), оба варианта будут работать одинаково.
А я и не писал, что работать не будет ) Это чтобы на грабли не наступать потом, когда программа будет более сложная и в промежутке между включением таймера и прерывания, может успеть много чего произойти. Или прерывание будет не по переполнению, а скажем по захвату или CTC или еще другой вариант, когда прерывание успеет "стрельнуть" еще до включения самого прерывания.
ChipCard, оптимизация какого уровня? Поставьте что-то более значимое, чем nop в ISR, может оптимизатор выкидывает? Ну и прерывания лучше включать ДО включения таймера.
Только я принудительно "добавил" в регистр счёта, чтобы не полдня кликать...
Вы видете, что у меня переменная cnt с volatile была написана? А вы взяли и убрали это ключевое слово. Так работать тоже не будет. cnt обязательно volatile! А чтобы пол дня не кликать, есть breakpoint'ы, хотя не в этом дело конечно.
Добавлено after 1 minute 22 seconds: И в locals добавьте cnt сразу, чтобы видеть его значение.
Вот тестовая прошивка для Мега8 (тактируется на заводских установках – 1 МГц). Светик подключён к выводу РВ0. Переключение его организовано в прерывании по переполнению таймера0. Если светик мигает, значит прерывание отрабатывает. Если прерывание не происходит – значит светик всегда будет потухший.
Все переменные, изменяемые в прерывании должны объявляться как volatile. Компилятор не знает когда возникает прерывание. С его точки зрения это мертвый код, в который нет переходов из других частей кода. Поэтому переменную он может "заоптимизировать" и просто выкинуть. Т.к. внутри прерывания она не используется, а снаружи с его точки зрения к ней если и обращаются, то прерывание там ничего не поменяет. Причем сделать он это может на любом уровне оптимизаций.
Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.
Мне то всё говорит, но зачем тогда она мне нужна? Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе. Я где-то писал, что не работает в МК?
Подскажите, в чём может быть проблема? После переполнения таймер 0 и установки флага TOV0 микроконтроллер не уходит по вектору прерывания. счётчик сбрасывается и начинает отсчёт дальше, флаг TOV0 остается установленным (((
Впрочем, не важно… более не отвлекаю Вас от занятий разбора работы симулятора.
Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.
Легко. Не знаю, как в Atmel Studio, новейшими версиями уже не пользуюсь, но в AVR Studio hex просто загружается. Правда, отлаживать в симуляторе намного сложнее, вместо осмысленных меток и имён переменных - числа.
Симулятор не всегда полностью отрабатывает поведение мк. Это нужно помнить всегда. Здесь нужно отталкиваться от того как реально работает мк. Сначала нужно правильно настроить периферия ядра. Порядок следующий. Сначала выставить нужные режимы. Потом разрешаем прерывания (у периферии) . Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами. Поэтому,в своей программе переделайте все по моим рекомендациям. Также правило. Никаких магических чисел. Народ, я на даче, пишу с телефона. Покажите ему как выставляются биты регистров ввода вывода с понятными обозначения и, а не числами. 1<<CS0 к примеру.
Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.
Спорное утверждение… если не настроено внешнее прерывание, то с какого перепугу взведётся флаг на прерывание? Чтобы не быть голословным, можно легко это проверить на железе… берём тини13 (он остался в девборде от предыдущих тестов)… пишем коротенькую программу: Устанавливаем адрес стека, устанавливаем порты (РВ0 – вход; РВ1 – вход; РВ2 – вход; РВ3 – на выход; РВ4 – вход;), на выводе РВ1 подтягиваем внутренний резистор, далее разрешаем прерывания (I = 1), далее очищаем SRAM, все рабочие регистры, и только потом настраиваем внешнее прерывание (INT0 контролировать низкий уровень), в прерывании по INT0 устанавливаем в PortB.3 единицу. На вывод РВ3 подключаем светик… заливаем программу в МК и наблюдаем работу светика… и сколько бы раз не перезагружали МК – светик не загорается, пока принудительно на выводе РВ1 не появится низкий уровень после настройки внешнего прерывания (INT). Вот такая картина маслом… даже больше скажу: разрешайте прерывание даже когда не настроены выводы – это не чего не меняет (прерывание не будет работать) так как нет этому никаких предпосылок.
Вложение:
Test_INT.hex
ЗЫ. Тини13 тактируется на заводских установках (1,2 МГц)
Вы невнимательно прочитали моё сообщение. Внешнее прерывание. Пример. Выставляем флаг разрешения внешнего прерывания. И так как по умолчанию режим по низкому уровню, прерывание сразу отработает. Более подробно я распишу позже, как я уже написал, я на даче, ни компа, ни даташитов. Хотя, следите за этим сообщением, кое что на телефоне есть. Если что, завтра буду в городе и распишу подробнее. Со скринами. Смотрите. ATTINY25. Глобально разрешаем прерывания. Как у автора. Выставляем в регистре GIMSK флаг INT0. В регистре MCUCR флаги ISC00 ISC11 отвечают за режим внешнего прерывания. По умолчанию режим по низкому УРОВНЮ. И тадам. Прерывание отрабатывает. Именно по этому, при настройке регистров ввода вывода СНАЧАЛА настройка режимов, и только потом выставление флагов разрешения соответствующих прерываний. Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
После сброса все порты МК настроены на вход без подтяжек, и какой там будет уровень, известно только разработчику схемы обвязки. Поэтому сработает прерывание или нет, зависит от обвязки, а не от порядка инициализации портов и т.п.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Вы невнимательно прочитали моё сообщение. Внешнее прерывание. Пример. Выставляем флаг разрешения внешнего прерывания. И так как по умолчанию режим по низкому уровню, прерывание сразу отработает.
Не правда… прерывание сработает только тогда, когда будет разрешено прерывание бит I=1 в регистре SREG. До этого не будет никаких прерываний не зависимо от настроек внешнего прерывания. Если после настройки внешнего прерывания будет зафиксирован низкий уровень, то взведётся только флаг INTF0 и будет ожидать разрешение от бита I и если это флаг (INTF0) сбросить перед установкой I=1 в регистре SREG, то никаких прерываний не будет до определения нового уровня по INT0. Вот пример2: Устанавливаем адрес стека, настраиваем внешнее прерывание (INT0 контролировать низкий уровень), в прерывании по INT0 устанавливаем в PortB.3 единицу, далее очищаем SRAM, все рабочие регистры, затем устанавливаем порты (РВ0 – вход; РВ1 – вход; РВ2 – вход; РВ3 – на выход; РВ4 – вход;), на выводе РВ1 подтягиваем внутренний резистор, и вот перед разрешением прерывания (I = 1) – делаем «лёгким движением руки» очистку флага INTF0, а уже затем разрешаем прерывание I=1 и всё нормуль – светик даже не думает зажигаться.
Вложение:
Test_INT_V2.hex
Цитата:
Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
Я Вас поздравляю... но никто не идеален – людям свойственно ошибаться.
Вы как на токовище, лишь бы послушать звук собственного голоса. У тарища прерывания разрешены с самого начала, затем TIMSK, затем режим таймера. С таймером тоже можно отхватить. Поэтому,пожалуйста,читайте внимательно. Нового по архитектуре мк AVR мне ничего не покажете. Поверьте. Исключение, последние модели, производства MICROCHIP.
Вы как на токовище, лишь бы послушать звук собственного голоса.
Какой звук…? Я вам реальный прошивки даю (как факт) для проверки на железе, которые опровергают Ваши надуманные утверждения. Что может быть весомее, Ваши просто слова или реальные примеры?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения