Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт июл 06, 2017 16:08:31
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:1 Медали: 1
Цитата:
Прерывание не работает.
Не входит в обработчик прерывания или обработчик как-то неверно работает?
Lavad писал(а):
Поделитесь, пожалуйста. Может, что-то новое узнаю.
Вы меня не поняли. В симуляции, выполняя работу по шагам, можно открыть окно дизассемблера и поглядеть во что скомпиллировлся оператор start timer. Коли у Вас тут только отличие в запуске таймера. А я уже сказал, баском я не знаю и тема тут не про него.
Lavad писал(а):
каждой новой команды прогонял в симуляторе.
Вот и поставте точку останова перед выходом из прерывания и поглядите значения регистров отвечающих за таймер.
Правильно ли я понял, что цель ассемблерных вставок - это изучение ассемблера? Если это так, то Ваш подход неверен. Лучше напишите новый проект на ассеблере. Как правило - это мигание светодиодом для начала.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Не входит в обработчик прерывания или обработчик как-то неверно работает?
В железе еще не проверял, но, кажется нашел свою оплошность. Вход в обработчик прерывания имеется, а выход некорректен. Команды возврата точки старта таймера и его запуска я расположил не в самом конце обработчика (перед $end asm), а немного до него, перед пустышкой _exit. И совсем вылетело из головы, что полный или частичный проход обработчика происходит не всегда, в зависимости от ситуации. В моем случае происходил прыжок на _exit, без обработки добавленных команд. Следовательно, выходил из прерывания без запуска таймера, и второго прерывания уже не произойдет.
...и поглядите значения регистров отвечающих за таймер.
Если уж перед обработкой прерывания обнуляем регистр управления TCCR0, то может быть также следует поступать и со счетным регистром TCNT0? Т.е. обнулять и его. Ведь все равно в конце прерывания ему возвращается прежнее значение. Либо не возвращать значение потому, что все время обработки прерывания в нем так и лежит прежнее значение. Что посоветуете?
...что цель ассемблерных вставок - это изучение ассемблера?...
Нет. Началось с того, что решил хоть как-то уменьшить занимаемый объем кода, заменив особо тяжелые или долгие процедуры АСМ-вставками. А изучение... это уже само собой происходит. Не вижу смысла использовать в своей разработке чужие примеры, не понимая их! Стараюсь писать сам. С разумной (удобоваримой) помощью только туговато. И мигание св/диодами так же... само собой получилось
_________________ О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Если Вам нужно попасть в прерывание наиболее точным интервалом времени, то вообще его не останавливать (но это все в зависимости от задачи).
Как раз наоборот. В прерывании отмеряются "точные" интервалы, а уж от них пляшет вся программа. Или я Вас не так понял?
У меня еще один вопрос возник. Если не трудно, помогите. В конце прерывания необходима команда RETI. Нет проблем! Return комментирую, RETI дописываю (это было несколько дней назад)... Первый же запуск программы привел ее в "неработоспособное" состояние. На дисплее замерло что-то половинчатое (от того, что могло быть там), сам дисплей сильно мерцал, НИ ОДНА кнопка не реагировала на нажатия. RESET-ы не помогали. Пришлось вернуть Return обратно. Что не так?
_________________ О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт июл 06, 2017 20:40:21
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:1 Медали: 1
Если бы штыки, то вставил бы какой-нибудь злой смайлик. Просто я дотошный зануда
Z_h_e писал(а):
Как раз наоборот. В прерывании отмеряются "точные" интервалы, а уж от них пляшет вся программа. Или я Вас не так понял?
Вы вошли в прерывание. Выключили таймер. В прерывании торчали некоторое неизвестное время и опять запустили таймер. Зачем его останавливать если таймер только для генерации события для прерывания? Кстати ознакомтесь с режимом СТС таймера, скорее всего то что Вам надо. Правда в меге8 у таймер0 такого режима нет.
Lavad писал(а):
Пришлось вернуть Return обратно. Что не так?
Это вопрос к Бейсику. Могу предположить. Комплиятор автоматически скомпиллил код в том числе для обработчика прерываний. Наверняка в начале обработчика идет сохранение некоторых данных на стек. Вы вставили команду reti, которая взяла адрес возврата со стека какой-то левый, так как SP указывает не на него.
Еще раз категорически советую, прежде чем писать вставки, напишите полностью несколько проектов на асме.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Справочник по программированию «Bascom-AVR»: Чтобы обеспечить возврат из программы обработки с разрешением прерываний следует применить команду микроконтроллера RETI. Компилятор делает это автоматически - первая команда RETURN, встретившаяся после метки с именем вектора прерывания скомпилируется как команда микроконтроллера RETI. Чтобы такая автозамена произошла в нужном месте, даже применяя ассемблер, необходимо завершить его текст оператором Bascom RETURN.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
тут как раз всё понятно: если вошел по прерыванию - потом ищет ретурн, чтобы обратить его в рети, эту работу ты за него сделал, а у него счетчик не сбросился и ему "под руку" попадется другой ретурн...
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
...Вы вошли в прерывание. Выключили таймер. В прерывании торчали некоторое неизвестное время...
Дочитав до этого момента, дошло очевидное Спасибо! Тогда проверю другой вариант: не буду отключать/включать таймер в прерывании. Все равно прерывания каждые 200мс, а максимальный проход всего прерывания менее 8мс.
...Наверняка в начале обработчика идет сохранение некоторых данных на стек. Вы вставили команду reti, которая взяла адрес возврата со стека какой-то левый, так как SP указывает не на него.
Если честно, то не понял, о чем речь. В начале обработчика идет сохранение регистра SREG и используемых РОН: Спойлерpush r31 in r31 , sreg push r31 push r0 push r16 и т.д..И в конце возврат:Спойлер... pop r16 pop r0 pop r31 out sreg , r31 pop r31
Еще раз категорически советую, прежде чем писать вставки, напишите полностью несколько проектов на асме.
Не спорю! Возможно, Вы правы. Начал заниматься асм-вставками на рабочей конструкции потому, что своими "потом и нервами" программу создал, знаю, на что она способна и что от нее ждать. Т.е., рассуждаю так: заменяя какую-то бейсиковскую строку на асм, я уже знаю предназначение и результат этой строки. Следовательно, экспериментируя на ассемблере, уже знаю точно, ЧТО должен в результате получить. Может, сумбурно, но как-то так
...прежде чем писать вставки, напишите полностью несколько проектов на асме.
Если уж начинать с белого листа... Например, на 297-ой странице код программы... Все эти DSEG-и, CSEG-и, вектора прерываний, инициализация контроллера... (в начале программы). Можете посоветовать какую-то конкретную литературу или ссылку, где ДОСТУПНЫМ пониманию чайника об этом рассказывается?
_________________ О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Спасибо! К DiHalt-у время от времени наведываюсь. В данный момент пережевываю одну из его статей по работе с ЕЕПРОМ. Не сразу воспринимаю инфу, но, да, согласен с вами - лучше это, чем ничего. Книга Котова - что-то знакомое... Видимо, последний визит был при царе Горохе. Ознакомлюсь. Ревич... Имеются две "Практическое программирование МК Atmel AVR на Ассемблере", 2008 и 2011 годов. Вроде, читабельно. Только недавно начал.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт июл 07, 2017 08:12:08
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Lavad писал(а):
Если честно, то не понял, о чем речь. В начале обработчика идет сохранение регистра SREG и используемых РОН:
Что такое стек Вы уже знаете? SP - это указатель стека. PC - программый счетчик (счетчик команд)
Если МК выполняет вход в подпрограмму по команде call или уходит в обрабтчик прерывания, то он аппаратно сохраняет PC на стек (т.е. чтобы знать куда вернуться). SP уменьшается на размер занятых байт.
1) возникло событие от таймера. МК скинул адрес возврата на стек и ушел в обработчик прерывания. 2) Ваш язык верхнего уровня скомпиллил некий код. В начале входа в обработчик прерывания он скинул на стек некие регистры. При плохой степени оптимизации он скинул все регистры, даже неиспользуемые в обработчике. SP eще уменьшился 3) Потом Вы еще скинули на стек регистры, SP еще уменьшился 4) какой-то код 5) Вы восстановили регистры что скидывали на стек. SP увеличился до п.2 6') команда RETI. Берет адрес возврата из стека по адресу SP, SP увеличивается и загружает его в PC. Но SP не указывает на адрес возврата, МК прыгнул в неизвестное место программы. 6'') Оператор RETURN. Восстановил из стека данные из.п2. SP- теперь указывает на адрес возврата. Выполнил RETI.
Цитата:
...первая команда RETURN, встретившаяся после метки с именем вектора прерывания скомпилируется как команда микроконтроллера RETI. ...
Так что эта фраза из справочника некорректная или просто неполная.
Как я уже в третий раз говорю Баском не знаю, могут быть какие-то еще нюансы.
З.Ы. Я Вам не зря говорю, поглядите во что компиллятся операторы, сделайте это.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
это объяснение глюков мне больше нравится и понятно. — всё дело в нарушении очередноси извлечения данных из стека в случае прямого ассемблерного вмешательства.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
всем доброго времени. Помогите разобратся с АЦП в ATtiny13. Собрал в протеусе, написал код, все работает меряет и через 2 сдвиговых выдает результат измерений в чистом (двоичном) виде. Вопрос: как пересчитать значения этого кода - это %, разность или напряжение в двоичной форме?
Attiny 13; Proteus 8. код правда без украшательств, я его еще ковыряю..
;============== .org 0 ;Задание нулевого адреса старта программы rjmp reset ;Безусловный переход к метке reset .org 9 ;Задание адреса прерывания по окончанию преобразования АЦП rjmp ADC_complete;Безусловный переход к метке ADC_complete
reset: ;Начало раздела инициализации контроллера ldi r16,RAMEND ;Загрузка в регистр r16 адреса верхней границы ОЗУ out SPL, r16 ;Копирование значения из r16 в регистр указателя стека SPL ldi r16,0b11110111;Загрузка в r16 единиц в нулевой и четвертый биты out DDRB,r16 ;Переключение выводов PB0 и PB4 на выход ;ldi r16,(1<<ADLAR)|(1<<MUX0)|(1<<MUX1);См. описание программы ldi r16,(1<<MUX0)|(1<<MUX1);См. описание программы out ADMUX,r16 ;Копирование из r16 в ADMUX ldi r16,(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS1);См.опис. out ADCSRA,r16 ;Копирование из r16 в ADCSRA ldi r17,0 sei ;Глобальное разрешение прерываний
main: ;Основной цикл программы
ldi r16,(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS1);См.опис. out ADCSRA,r16 ;Копирование из r16 в ADCSRA
ldi r20,255 d: dec r20 brne d rcall shift
rjmp main ;Конец основного цикла программы
ADC_complete:;Начало обработчика прерывания от АЦП in r17,ADCL in r16,ADCH ;Копирование в регистр r16 результата преобразования
да. Мои мысли таковы - опорное напр (5 вольт ) / 2^10 (10 разр ацп) = некое напряжение (0.0048 вольт). Затем результат работы ацп умножаем на эти самые 0.0048 и получаем измеренное напряжение.
Где я ошибся? (просто не мог не ошибится )
_________________ Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Последний раз редактировалось Jetetex Вт авг 08, 2017 18:37:09, всего редактировалось 1 раз.
Пока писАл вопросы и измывался над Proteus'ом - разобрался. максимальное значение регистров результата = ИОН = 2047 (2^1+2^2+2^3+...+2^9+2^10 = 00000011 11111111 ) таким образом самый младший бит, тот который 2^1, имеет значение 0.0024 вольта, самый старший 2^10 = 2.46. Далее переводим умножая 0.0024 на десятичный эквивалент полученого результата.
Заголовок сообщения: Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Вт авг 08, 2017 19:19:17
Собутыльник Кота
Карма: 29
Рейтинг сообщений: 651
Зарегистрирован: Сб май 14, 2011 21:16:04 Сообщений: 2708 Откуда: г. Чайковский
Рейтинг сообщения:0 Медали: 1
Максимальное 10ое число это 1023. Как Вы 2047 получили?
Вот формула из ДШ, тут обычная математика.
Правда мне непонятно почему в формуле 1024, а не 1023.
Добавлено after 1 minute 11 seconds:
Цитата:
Мои мысли таковы - опорное напр (5 вольт ) / 2^10 (10 разр ацп) = некое напряжение (0.0048 вольт). Затем результат работы ацп умножаем на эти самые 0.0048 и получаем измеренное напряжение.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения