Не знаю как в Си, но в ассемблере разницы не будет, когда было произведено разрешение прерывания – хоть ДО, хоть ПОСЛЕ (разницы никакой), оба варианта будут работать одинаково.Ну и прерывания лучше включать ДО включения таймера.
Таймеры/счётчики в AVR
-
Самсусамыч
Re: Таймеры/счётчики в AVR
Вы написали что:
- Реклама
Re: Таймеры/счётчики в AVR
А я и не писал, что работать не будет )
Это чтобы на грабли не наступать потом, когда программа будет более сложная и в промежутке между включением таймера и прерывания, может успеть много чего произойти. Или прерывание будет не по переполнению, а скажем по захвату или CTC или еще другой вариант, когда прерывание успеет "стрельнуть" еще до включения самого прерывания.
Это чтобы на грабли не наступать потом, когда программа будет более сложная и в промежутке между включением таймера и прерывания, может успеть много чего произойти. Или прерывание будет не по переполнению, а скажем по захвату или CTC или еще другой вариант, когда прерывание успеет "стрельнуть" еще до включения самого прерывания.
Re: Таймеры/счётчики в AVR
[uquote="NStorm",url="/forum/viewtopic.php?p=3871362#p3871362"]ChipCard, оптимизация какого уровня? Поставьте что-то более значимое, чем nop в ISR, может оптимизатор выкидывает? Ну и прерывания лучше включать ДО включения таймера.[/uquote]
Переписал немного. Оптимизатор отключил.
Записал видео рабы симулятора. https://yadi.sk/i/7fZX9BEP_lh3xw
Только я принудительно "добавил" в регистр счёта, чтобы не полдня кликать...
Добавлено after 1 minute 15 seconds:
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871401#p3871401"]Какой МК используете?[/uquote]
Atmega8
Добавлено after 3 minutes 40 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3871367#p3871367"]вполне может быть. ибо ассемблерную вставку nop-a надо делать так:[/uquote]
Так ругается при компиляции
Переписал немного. Оптимизатор отключил.
Записал видео рабы симулятора. https://yadi.sk/i/7fZX9BEP_lh3xw
Только я принудительно "добавил" в регистр счёта, чтобы не полдня кликать...
Добавлено after 1 minute 15 seconds:
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871401#p3871401"]Какой МК используете?[/uquote]
Atmega8
Добавлено after 3 minutes 40 seconds:
[uquote="ARV",url="/forum/viewtopic.php?p=3871367#p3871367"]вполне может быть. ибо ассемблерную вставку nop-a надо делать так:
Код: Выделить всё
volatile asm ("nop");Так ругается при компиляции
Re: Таймеры/счётчики в AVR
Вы видете, что у меня переменная cnt с volatile была написана? А вы взяли и убрали это ключевое слово. Так работать тоже не будет. cnt обязательно volatile!Только я принудительно "добавил" в регистр счёта, чтобы не полдня кликать...
А чтобы пол дня не кликать, есть breakpoint'ы, хотя не в этом дело конечно.
Добавлено after 1 minute 22 seconds:
И в locals добавьте cnt сразу, чтобы видеть его значение.
Re: Таймеры/счётчики в AVR
[uquote="NStorm",url="/forum/viewtopic.php?p=3871455#p3871455"]Так работать тоже не будет. cnt обязательно volatile![/uquote]
А почему так? Можете в трёх словах объяснить?
А почему так? Можете в трёх словах объяснить?
- Реклама
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871440#p3871440"]Atmega8[/uquote]
Вот тестовая прошивка для Мега8 (тактируется на заводских установках – 1 МГц). Светик подключён к выводу РВ0. Переключение его организовано в прерывании по переполнению таймера0. Если светик мигает, значит прерывание отрабатывает. Если прерывание не происходит – значит светик всегда будет потухший.
Вот тестовая прошивка для Мега8 (тактируется на заводских установках – 1 МГц). Светик подключён к выводу РВ0. Переключение его организовано в прерывании по переполнению таймера0. Если светик мигает, значит прерывание отрабатывает. Если прерывание не происходит – значит светик всегда будет потухший.
Re: Таймеры/счётчики в AVR
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871467#p3871467"]А почему так? Можете в трёх словах объяснить?[/uquote]
Все переменные, изменяемые в прерывании должны объявляться как volatile. Компилятор не знает когда возникает прерывание. С его точки зрения это мертвый код, в который нет переходов из других частей кода. Поэтому переменную он может "заоптимизировать" и просто выкинуть. Т.к. внутри прерывания она не используется, а снаружи с его точки зрения к ней если и обращаются, то прерывание там ничего не поменяет. Причем сделать он это может на любом уровне оптимизаций.
Все переменные, изменяемые в прерывании должны объявляться как volatile. Компилятор не знает когда возникает прерывание. С его точки зрения это мертвый код, в который нет переходов из других частей кода. Поэтому переменную он может "заоптимизировать" и просто выкинуть. Т.к. внутри прерывания она не используется, а снаружи с его точки зрения к ней если и обращаются, то прерывание там ничего не поменяет. Причем сделать он это может на любом уровне оптимизаций.
Re: Таймеры/счётчики в AVR
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871489#p3871489"]Вот тестовая прошивка для Мега8[/uquote]
Её как-то можно залить в Atmel studio?
Добавлено after 2 minutes 38 seconds:
NStorm, спасибо за пояснение!
Её как-то можно залить в Atmel studio?
Добавлено after 2 minutes 38 seconds:
NStorm, спасибо за пояснение!
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871528#p3871528"]Её как-то можно залить в Atmel studio?
[/uquote]
Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.
Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.
Re: Таймеры/счётчики в AVR
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871540#p3871540"]Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.[/uquote]
Мне то всё говорит, но зачем тогда она мне нужна? Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе. Я где-то писал, что не работает в МК?
Мне то всё говорит, но зачем тогда она мне нужна? Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе. Я где-то писал, что не работает в МК?
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871551#p3871551"]Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе.[/uquote]
То есть важнее, чтобы работало в симуляторе, а железо не важно? Так бы сразу и писал…
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871319#p3871319"]Подскажите, в чём может быть проблема? После переполнения таймер 0 и установки флага TOV0 микроконтроллер не уходит по вектору прерывания. счётчик сбрасывается и начинает отсчёт дальше, флаг TOV0 остается установленным ((([/uquote]
Впрочем, не важно… более не отвлекаю Вас от занятий разбора работы симулятора.
То есть важнее, чтобы работало в симуляторе, а железо не важно? Так бы сразу и писал…
Дык и про симулятор ни слово:ChipCard писал(а):Я где-то писал, что не работает в МК?
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871319#p3871319"]Подскажите, в чём может быть проблема? После переполнения таймер 0 и установки флага TOV0 микроконтроллер не уходит по вектору прерывания. счётчик сбрасывается и начинает отсчёт дальше, флаг TOV0 остается установленным ((([/uquote]
Впрочем, не важно… более не отвлекаю Вас от занятий разбора работы симулятора.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
ну, если честно, я мог и запамятовать... вероятно, надо писать asm volatile ("nop");ChipCard писал(а):Так ругается при компиляции
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Таймеры/счётчики в AVR
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871540#p3871540"]Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.[/uquote]
Легко. Не знаю, как в Atmel Studio, новейшими версиями уже не пользуюсь, но в AVR Studio hex просто загружается. Правда, отлаживать в симуляторе намного сложнее, вместо осмысленных меток и имён переменных - числа.
Легко. Не знаю, как в Atmel Studio, новейшими версиями уже не пользуюсь, но в AVR Studio hex просто загружается. Правда, отлаживать в симуляторе намного сложнее, вместо осмысленных меток и имён переменных - числа.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
Симулятор не всегда полностью отрабатывает поведение мк. Это нужно помнить всегда. Здесь нужно отталкиваться от того как реально работает мк.
Сначала нужно правильно настроить периферия ядра. Порядок следующий. Сначала выставить нужные режимы. Потом разрешаем прерывания (у периферии) . Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.
Поэтому,в своей программе переделайте все по моим рекомендациям.
Также правило. Никаких магических чисел. Народ, я на даче, пишу с телефона. Покажите ему как выставляются биты регистров ввода вывода с понятными обозначения и, а не числами.
1<<CS0 к примеру.
Сначала нужно правильно настроить периферия ядра. Порядок следующий. Сначала выставить нужные режимы. Потом разрешаем прерывания (у периферии) . Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.
Поэтому,в своей программе переделайте все по моим рекомендациям.
Также правило. Никаких магических чисел. Народ, я на даче, пишу с телефона. Покажите ему как выставляются биты регистров ввода вывода с понятными обозначения и, а не числами.
1<<CS0 к примеру.
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="Demiurg",url="/forum/viewtopic.php?p=3871610#p3871610"]Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.[/uquote]
Спорное утверждение…
если не настроено внешнее прерывание, то с какого перепугу взведётся флаг на прерывание?
Чтобы не быть голословным, можно легко это проверить на железе… берём тини13 (он остался в девборде от предыдущих тестов)… пишем коротенькую программу:
Устанавливаем адрес стека, устанавливаем порты (РВ0 – вход; РВ1 – вход; РВ2 – вход; РВ3 – на выход; РВ4 – вход;), на выводе РВ1 подтягиваем внутренний резистор, далее разрешаем прерывания (I = 1), далее очищаем SRAM, все рабочие регистры, и только потом настраиваем внешнее прерывание (INT0 контролировать низкий уровень), в прерывании по INT0 устанавливаем в PortB.3 единицу. На вывод РВ3 подключаем светик… заливаем программу в МК и наблюдаем работу светика… и сколько бы раз не перезагружали МК – светик не загорается, пока принудительно на выводе РВ1 не появится низкий уровень после настройки внешнего прерывания (INT). Вот такая картина маслом… даже больше скажу: разрешайте прерывание даже когда не настроены выводы – это не чего не меняет (прерывание не будет работать) так как нет этому никаких предпосылок.
ЗЫ. Тини13 тактируется на заводских установках (1,2 МГц)
Спорное утверждение…
Устанавливаем адрес стека, устанавливаем порты (РВ0 – вход; РВ1 – вход; РВ2 – вход; РВ3 – на выход; РВ4 – вход;), на выводе РВ1 подтягиваем внутренний резистор, далее разрешаем прерывания (I = 1), далее очищаем SRAM, все рабочие регистры, и только потом настраиваем внешнее прерывание (INT0 контролировать низкий уровень), в прерывании по INT0 устанавливаем в PortB.3 единицу. На вывод РВ3 подключаем светик… заливаем программу в МК и наблюдаем работу светика… и сколько бы раз не перезагружали МК – светик не загорается, пока принудительно на выводе РВ1 не появится низкий уровень после настройки внешнего прерывания (INT). Вот такая картина маслом… даже больше скажу: разрешайте прерывание даже когда не настроены выводы – это не чего не меняет (прерывание не будет работать) так как нет этому никаких предпосылок.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
Вы невнимательно прочитали моё сообщение. Внешнее прерывание. Пример. Выставляем флаг разрешения внешнего прерывания. И так как по умолчанию режим по низкому уровню, прерывание сразу отработает. Более подробно я распишу позже, как я уже написал, я на даче, ни компа, ни даташитов. Хотя, следите за этим сообщением, кое что на телефоне есть. Если что, завтра буду в городе и распишу подробнее. Со скринами.
Смотрите. ATTINY25. Глобально разрешаем прерывания. Как у автора. Выставляем в регистре GIMSK флаг INT0. В регистре MCUCR флаги ISC00 ISC11 отвечают за режим внешнего прерывания. По умолчанию режим по низкому УРОВНЮ. И тадам. Прерывание отрабатывает. Именно по этому, при настройке регистров ввода вывода СНАЧАЛА настройка режимов, и только потом выставление флагов разрешения соответствующих прерываний.
Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
Смотрите. ATTINY25. Глобально разрешаем прерывания. Как у автора. Выставляем в регистре GIMSK флаг INT0. В регистре MCUCR флаги ISC00 ISC11 отвечают за режим внешнего прерывания. По умолчанию режим по низкому УРОВНЮ. И тадам. Прерывание отрабатывает. Именно по этому, при настройке регистров ввода вывода СНАЧАЛА настройка режимов, и только потом выставление флагов разрешения соответствующих прерываний.
Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Таймеры/счётчики в AVR
После сброса все порты МК настроены на вход без подтяжек, и какой там будет уровень, известно только разработчику схемы обвязки. Поэтому сработает прерывание или нет, зависит от обвязки, а не от порядка инициализации портов и т.п.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="Demiurg",url="/forum/viewtopic.php?p=3871642#p3871642"]Вы невнимательно прочитали моё сообщение. Внешнее прерывание. Пример. Выставляем флаг разрешения внешнего прерывания. И так как по умолчанию режим по низкому уровню, прерывание сразу отработает.[/uquote]
Не правда… прерывание сработает только тогда, когда будет разрешено прерывание бит 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 и всё нормуль – светик даже не думает зажигаться.
но никто не идеален – людям свойственно ошибаться. 
Не правда… прерывание сработает только тогда, когда будет разрешено прерывание бит 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 и всё нормуль – светик даже не думает зажигаться.
Я Вас поздравляю...Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Таймеры/счётчики в AVR
Вы как на токовище, лишь бы послушать звук собственного голоса. У тарища прерывания разрешены с самого начала, затем TIMSK, затем режим таймера. С таймером тоже можно отхватить.
Поэтому,пожалуйста,читайте внимательно. Нового по архитектуре мк AVR мне ничего не покажете. Поверьте. Исключение, последние модели, производства MICROCHIP.
Поэтому,пожалуйста,читайте внимательно. Нового по архитектуре мк AVR мне ничего не покажете. Поверьте. Исключение, последние модели, производства MICROCHIP.
-
Самсусамыч
Re: Таймеры/счётчики в AVR
[uquote="Demiurg",url="/forum/viewtopic.php?p=3871657#p3871657"]Вы как на токовище, лишь бы послушать звук собственного голоса.[/uquote]
Какой звук…?
Я вам реальный прошивки даю (как факт) для проверки на железе, которые опровергают Ваши надуманные утверждения. Что может быть весомее, Ваши просто слова или реальные примеры? 
Какой звук…?



