Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
Самсусамыч

Re: Таймеры/счётчики в AVR

Сообщение Самсусамыч »

Вы написали что:
Ну и прерывания лучше включать ДО включения таймера.
Не знаю как в Си, но в ассемблере разницы не будет, когда было произведено разрешение прерывания – хоть ДО, хоть ПОСЛЕ (разницы никакой), оба варианта будут работать одинаково.
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

А я и не писал, что работать не будет )
Это чтобы на грабли не наступать потом, когда программа будет более сложная и в промежутке между включением таймера и прерывания, может успеть много чего произойти. Или прерывание будет не по переполнению, а скажем по захвату или CTC или еще другой вариант, когда прерывание успеет "стрельнуть" еще до включения самого прерывания.
Реклама
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

[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 надо делать так:

Код: Выделить всё

volatile asm ("nop");
[/uquote]

Так ругается при компиляции
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

Только я принудительно "добавил" в регистр счёта, чтобы не полдня кликать...
Вы видете, что у меня переменная cnt с volatile была написана? А вы взяли и убрали это ключевое слово. Так работать тоже не будет. cnt обязательно volatile!
А чтобы пол дня не кликать, есть breakpoint'ы, хотя не в этом дело конечно.

Добавлено after 1 minute 22 seconds:
И в locals добавьте cnt сразу, чтобы видеть его значение.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

[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. Если светик мигает, значит прерывание отрабатывает. Если прерывание не происходит – значит светик всегда будет потухший.
Test Timer_0.hex
Реклама
NStorm
Поставщик валерьянки для Кота
Сообщения: 1978
Зарегистрирован: Ср июл 17, 2013 13:55:57

Re: Таймеры/счётчики в AVR

Сообщение NStorm »

[uquote="ChipCard",url="/forum/viewtopic.php?p=3871467#p3871467"]А почему так? Можете в трёх словах объяснить?[/uquote]
Все переменные, изменяемые в прерывании должны объявляться как volatile. Компилятор не знает когда возникает прерывание. С его точки зрения это мертвый код, в который нет переходов из других частей кода. Поэтому переменную он может "заоптимизировать" и просто выкинуть. Т.к. внутри прерывания она не используется, а снаружи с его точки зрения к ней если и обращаются, то прерывание там ничего не поменяет. Причем сделать он это может на любом уровне оптимизаций.
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871489#p3871489"]Вот тестовая прошивка для Мега8[/uquote]
Её как-то можно залить в Atmel studio? :?

Добавлено after 2 minutes 38 seconds:
NStorm, спасибо за пояснение!
Самсусамыч

Re: Таймеры/счётчики в AVR

Сообщение Самсусамыч »

[uquote="ChipCard",url="/forum/viewtopic.php?p=3871528#p3871528"]Её как-то можно залить в Atmel studio? :?[/uquote]
Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.
Аватара пользователя
ChipCard
Открыл глаза
Сообщения: 42
Зарегистрирован: Чт июл 23, 2020 20:59:01
Откуда: СевКавТВ

Re: Таймеры/счётчики в AVR

Сообщение ChipCard »

[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871540#p3871540"]Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.[/uquote]
Мне то всё говорит, но зачем тогда она мне нужна? Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе. Я где-то писал, что не работает в МК? :tea:
Самсусамыч

Re: Таймеры/счётчики в AVR

Сообщение Самсусамыч »

[uquote="ChipCard",url="/forum/viewtopic.php?p=3871551#p3871551"]Моя цель разобраться почему не работает прерывание в симуляторе, а не на железе.[/uquote]
То есть важнее, чтобы работало в симуляторе, а железо не важно? Так бы сразу и писал… :wink:
ChipCard писал(а):Я где-то писал, что не работает в МК? :tea:
Дык и про симулятор ни слово: :dont_know:
[uquote="ChipCard",url="/forum/viewtopic.php?p=3871319#p3871319"]Подскажите, в чём может быть проблема? После переполнения таймер 0 и установки флага TOV0 микроконтроллер не уходит по вектору прерывания. счётчик сбрасывается и начинает отсчёт дальше, флаг TOV0 остается установленным ((([/uquote]

Впрочем, не важно… более не отвлекаю Вас от занятий разбора работы симулятора. :)
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение ARV »

ChipCard писал(а):Так ругается при компиляции
ну, если честно, я мог и запамятовать... вероятно, надо писать asm volatile ("nop");
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Таймеры/счётчики в AVR

Сообщение Jack_A »

[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3871540#p3871540"]Это же не исходник, а скомпилированный файл для МК. Вам расширение .hex не о чём не говорит? ... Прошивка заливается в МК.[/uquote]
Легко. Не знаю, как в Atmel Studio, новейшими версиями уже не пользуюсь, но в AVR Studio hex просто загружается. Правда, отлаживать в симуляторе намного сложнее, вместо осмысленных меток и имён переменных - числа.
Изображение
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

Симулятор не всегда полностью отрабатывает поведение мк. Это нужно помнить всегда. Здесь нужно отталкиваться от того как реально работает мк.
Сначала нужно правильно настроить периферия ядра. Порядок следующий. Сначала выставить нужные режимы. Потом разрешаем прерывания (у периферии) . Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.
Поэтому,в своей программе переделайте все по моим рекомендациям.
Также правило. Никаких магических чисел. Народ, я на даче, пишу с телефона. Покажите ему как выставляются биты регистров ввода вывода с понятными обозначения и, а не числами.
1<<CS0 к примеру.
Самсусамыч

Re: Таймеры/счётчики в AVR

Сообщение Самсусамыч »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3871610#p3871610"]Глобально прерывания включаем, как вы сами решите. Но, не ранее, чем настроите правильно периферию. Показываю пример. Внешнее прерывание. Если у вас включено глобально прерывания, то оно и произойдёт, даже раньше чем вы начнёте выставлять режим прерывания. Потому что может оказаться, что на пине низкий уровень. А по умолчанию режим внешнего прерывания по низкому уровню. Также может получиться и с таймерами.[/uquote]
Спорное утверждение… :)) если не настроено внешнее прерывание, то с какого перепугу взведётся флаг на прерывание? :shock: Чтобы не быть голословным, можно легко это проверить на железе… берём тини13 (он остался в девборде от предыдущих тестов)… пишем коротенькую программу:
Устанавливаем адрес стека, устанавливаем порты (РВ0 – вход; РВ1 – вход; РВ2 – вход; РВ3 – на выход; РВ4 – вход;), на выводе РВ1 подтягиваем внутренний резистор, далее разрешаем прерывания (I = 1), далее очищаем SRAM, все рабочие регистры, и только потом настраиваем внешнее прерывание (INT0 контролировать низкий уровень), в прерывании по INT0 устанавливаем в PortB.3 единицу. На вывод РВ3 подключаем светик… заливаем программу в МК и наблюдаем работу светика… и сколько бы раз не перезагружали МК – светик не загорается, пока принудительно на выводе РВ1 не появится низкий уровень после настройки внешнего прерывания (INT). Вот такая картина маслом… даже больше скажу: разрешайте прерывание даже когда не настроены выводы – это не чего не меняет (прерывание не будет работать) так как нет этому никаких предпосылок. :)
Test_INT.hex
ЗЫ. Тини13 тактируется на заводских установках (1,2 МГц)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

Вы невнимательно прочитали моё сообщение. Внешнее прерывание. Пример. Выставляем флаг разрешения внешнего прерывания. И так как по умолчанию режим по низкому уровню, прерывание сразу отработает. Более подробно я распишу позже, как я уже написал, я на даче, ни компа, ни даташитов. Хотя, следите за этим сообщением, кое что на телефоне есть. Если что, завтра буду в городе и распишу подробнее. Со скринами.
Смотрите. ATTINY25. Глобально разрешаем прерывания. Как у автора. Выставляем в регистре GIMSK флаг INT0. В регистре MCUCR флаги ISC00 ISC11 отвечают за режим внешнего прерывания. По умолчанию режим по низкому УРОВНЮ. И тадам. Прерывание отрабатывает. Именно по этому, при настройке регистров ввода вывода СНАЧАЛА настройка режимов, и только потом выставление флагов разрешения соответствующих прерываний.
Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение ARV »

После сброса все порты МК настроены на вход без подтяжек, и какой там будет уровень, известно только разработчику схемы обвязки. Поэтому сработает прерывание или нет, зависит от обвязки, а не от порядка инициализации портов и т.п.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Самсусамыч

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 и всё нормуль – светик даже не думает зажигаться.
Test_INT_V2.hex
Я с 2007 года с AVR работаю. Первые несколько лет на асме, потом на си.
Я Вас поздравляю... :) но никто не идеален – людям свойственно ошибаться. :beer:
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Demiurg »

Вы как на токовище, лишь бы послушать звук собственного голоса. У тарища прерывания разрешены с самого начала, затем TIMSK, затем режим таймера. С таймером тоже можно отхватить.
Поэтому,пожалуйста,читайте внимательно. Нового по архитектуре мк AVR мне ничего не покажете. Поверьте. Исключение, последние модели, производства MICROCHIP.
Самсусамыч

Re: Таймеры/счётчики в AVR

Сообщение Самсусамыч »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3871657#p3871657"]Вы как на токовище, лишь бы послушать звук собственного голоса.[/uquote]
Какой звук…? :facepalm: Я вам реальный прошивки даю (как факт) для проверки на железе, которые опровергают Ваши надуманные утверждения. Что может быть весомее, Ваши просто слова или реальные примеры? :facepalm:
Ответить

Вернуться в «AVR»