Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Прерывание не работает.
Не входит в обработчик прерывания или обработчик как-то неверно работает?
Lavad писал(а):Поделитесь, пожалуйста. Может, что-то новое узнаю.
Вы меня не поняли. В симуляции, выполняя работу по шагам, можно открыть окно дизассемблера и поглядеть во что скомпиллировлся оператор start timer. Коли у Вас тут только отличие в запуске таймера. А я уже сказал, баском я не знаю и тема тут не про него.
Lavad писал(а):каждой новой команды прогонял в симуляторе.
Вот и поставте точку останова перед выходом из прерывания и поглядите значения регистров отвечающих за таймер.

Правильно ли я понял, что цель ассемблерных вставок - это изучение ассемблера? Если это так, то Ваш подход неверен. Лучше напишите новый проект на ассеблере. Как правило - это мигание светодиодом для начала.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Lavad »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140007#p3140007"]Не входит в обработчик прерывания или обработчик как-то неверно работает?[/uquote]В железе еще не проверял, но, кажется нашел свою оплошность. Вход в обработчик прерывания имеется, а выход некорректен. Команды возврата точки старта таймера и его запуска я расположил не в самом конце обработчика (перед $end asm), а немного до него, перед пустышкой _exit. И совсем вылетело из головы, что полный или частичный проход обработчика происходит не всегда, в зависимости от ситуации. В моем случае происходил прыжок на _exit, без обработки добавленных команд. Следовательно, выходил из прерывания без запуска таймера, и второго прерывания уже не произойдет.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140007#p3140007"]...и поглядите значения регистров отвечающих за таймер.[/uquote]Если уж перед обработкой прерывания обнуляем регистр управления TCCR0, то может быть также следует поступать и со счетным регистром TCNT0? Т.е. обнулять и его. Ведь все равно в конце прерывания ему возвращается прежнее значение. Либо не возвращать значение потому, что все время обработки прерывания в нем так и лежит прежнее значение. Что посоветуете?
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140007#p3140007"]...что цель ассемблерных вставок - это изучение ассемблера?...[/uquote]Нет. Началось с того, что решил хоть как-то уменьшить занимаемый объем кода, заменив особо тяжелые или долгие процедуры АСМ-вставками. А изучение... это уже само собой происходит. Не вижу смысла использовать в своей разработке чужие примеры, не понимая их! Стараюсь писать сам. С разумной (удобоваримой) помощью только туговато.
И мигание св/диодами так же... само собой получилось :-)
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Я не предлагал Вам использовать чужие примеры, хотя в них бывают оригинальные алгоритмы и могут быть очень полезными.
Lavad писал(а):Что посоветуете?
Если Вам нужно попасть в прерывание наиболее точным интервалом времени, то вообще его не останавливать (но это все в зависимости от задачи).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Lavad »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140143#p3140143"]Я не предлагал Вам использовать чужие примеры,...[/uquote]Чего это уже в штыки. :-) Я и не показывал на Вас пальцем :-). Это были мысли вслух о том, что стараюсь учиться.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140143#p3140143"]...хотя в них бывают оригинальные алгоритмы и могут быть очень полезными.[/uquote]Абсолютно согласен! Стараюсь, по мере извилин, их изучать.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140143#p3140143"]Если Вам нужно попасть в прерывание наиболее точным интервалом времени, то вообще его не останавливать (но это все в зависимости от задачи).[/uquote]Как раз наоборот. В прерывании отмеряются "точные" интервалы, а уж от них пляшет вся программа. Или я Вас не так понял?

У меня еще один вопрос возник. Если не трудно, помогите. В конце прерывания необходима команда RETI. Нет проблем! Return комментирую, RETI дописываю (это было несколько дней назад)... Первый же запуск программы привел ее в "неработоспособное" состояние. На дисплее замерло что-то половинчатое (от того, что могло быть там), сам дисплей сильно мерцал, НИ ОДНА кнопка не реагировала на нажатия. RESET-ы не помогали. Пришлось вернуть Return обратно. Что не так?
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Если бы штыки, то вставил бы какой-нибудь злой смайлик. Просто я дотошный зануда :)
Z_h_e писал(а):Как раз наоборот. В прерывании отмеряются "точные" интервалы, а уж от них пляшет вся программа. Или я Вас не так понял?
Вы вошли в прерывание. Выключили таймер. В прерывании торчали некоторое неизвестное время и опять запустили таймер. Зачем его останавливать если таймер только для генерации события для прерывания? Кстати ознакомтесь с режимом СТС таймера, скорее всего то что Вам надо. Правда в меге8 у таймер0 такого режима нет.
Lavad писал(а):Пришлось вернуть Return обратно. Что не так?
Это вопрос к Бейсику. Могу предположить. Комплиятор автоматически скомпиллил код в том числе для обработчика прерываний. Наверняка в начале обработчика идет сохранение некоторых данных на стек. Вы вставили команду reti, которая взяла адрес возврата со стека какой-то левый, так как SP указывает не на него.

Еще раз категорически советую, прежде чем писать вставки, напишите полностью несколько проектов на асме.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Ivanoff-iv »

Справочник по программированию «Bascom-AVR»:
Чтобы обеспечить возврат из программы обработки с разрешением прерываний следует применить команду микроконтроллера RETI. Компилятор делает это автоматически - первая команда RETURN, встретившаяся после метки с именем вектора прерывания скомпилируется как команда микроконтроллера RETI. Чтобы такая автозамена произошла в нужном месте, даже применяя ассемблер, необходимо завершить его текст оператором Bascom RETURN.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Lavad »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3140186#p3140186"]Справочник по программированию «Bascom-AVR»:...[/uquote]Спасибо! Это читал ни раз! Именно поэтому решил проверить RETI! Но дальше:
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3140186#p3140186"]..., встретившаяся после метки с именем вектора прерывания...[/uquote]выбивает мне все мозги :-(. Ноль понятия.
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Ivanoff-iv »

тут как раз всё понятно: если вошел по прерыванию - потом ищет ретурн, чтобы обратить его в рети, эту работу ты за него сделал, а у него счетчик не сбросился и ему "под руку" попадется другой ретурн...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Lavad »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140168#p3140168"]...Вы вошли в прерывание. Выключили таймер. В прерывании торчали некоторое неизвестное время...[/uquote]Дочитав до этого момента, дошло очевидное :-) Спасибо!
Тогда проверю другой вариант: не буду отключать/включать таймер в прерывании. Все равно прерывания каждые 200мс, а максимальный проход всего прерывания менее 8мс.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140168#p3140168"]...Кстати ознакомтесь с режимом СТС таймера...[/uquote]Вот придут заказанные 328-ые, тогда и углубимся.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140168#p3140168"]...Наверняка в начале обработчика идет сохранение некоторых данных на стек. Вы вставили команду reti, которая взяла адрес возврата со стека какой-то левый, так как SP указывает не на него.[/uquote]Если честно, то не понял, о чем речь. В начале обработчика идет сохранение регистра SREG и используемых РОН:
Спойлерpush r31
in r31 , sreg
push r31
push r0
push r16
и т.д..
И в конце возврат:
Спойлер...
pop r16
pop r0
pop r31
out sreg , r31
pop r31
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140168#p3140168"]Еще раз категорически советую, прежде чем писать вставки, напишите полностью несколько проектов на асме.[/uquote]Не спорю! Возможно, Вы правы. Начал заниматься асм-вставками на рабочей конструкции потому, что своими "потом и нервами" программу создал, знаю, на что она способна и что от нее ждать. Т.е., рассуждаю так: заменяя какую-то бейсиковскую строку на асм, я уже знаю предназначение и результат этой строки. Следовательно, экспериментируя на ассемблере, уже знаю точно, ЧТО должен в результате получить. Может, сумбурно, но как-то так :-)

Добавлено after 24 minutes 39 seconds:
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3140168#p3140168"]...прежде чем писать вставки, напишите полностью несколько проектов на асме.[/uquote]Если уж начинать с белого листа... Например, на 297-ой странице код программы... Все эти DSEG-и, CSEG-и, вектора прерываний, инициализация контроллера... (в начале программы). Можете посоветовать какую-то конкретную литературу или ссылку, где ДОСТУПНЫМ пониманию чайника об этом рассказывается?
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение COKPOWEHEU »

Курс DiHalt'а, цикл на Схем.нет. Я лично осваивал по Ревичу, но народ считает его не лучшим.
Аватара пользователя
Lavad
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Сб апр 20, 2013 22:56:52

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Lavad »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3140263#p3140263"]Курс DiHalt'а, цикл на Схем.нет. Я лично осваивал по Ревичу,...[/uquote]Спасибо! К DiHalt-у время от времени наведываюсь. В данный момент пережевываю одну из его статей по работе с ЕЕПРОМ. Не сразу воспринимаю инфу, но, да, согласен с вами - лучше это, чем ничего.
Книга Котова - что-то знакомое... Видимо, последний визит был при царе Горохе. Ознакомлюсь.
Ревич... Имеются две "Практическое программирование МК Atmel AVR на Ассемблере", 2008 и 2011 годов. Вроде, читабельно. Только недавно начал.
[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=3140263#p3140263"]...но народ считает его не лучшим.[/uquote]Спорный вопрос. То же самое мнение я много раз встречал о Белове. Как знать? Каждому по понятиям, что ли...
О человеке говорят не потоки изрыгаемых слов, а его дела и поступки.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

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. ...
Так что эта фраза из справочника некорректная или просто неполная.

Как я уже в третий раз говорю Баском не знаю, могут быть какие-то еще нюансы.

З.Ы. Я Вам не зря говорю, поглядите во что компиллятся операторы, сделайте это.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Ivanoff-iv »

это объяснение глюков мне больше нравится и понятно. — всё дело в нарушении очередноси извлечения данных из стека в случае прямого ассемблерного вмешательства.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jetetex »

всем доброго времени. Помогите разобратся с АЦП в ATtiny13. Собрал в протеусе, написал код, все работает меряет и через 2 сдвиговых выдает результат измерений в чистом (двоичном) виде. Вопрос: как пересчитать значения этого кода - это %, разность или напряжение в двоичной форме?

Attiny 13;
Proteus 8.
код правда без украшательств, я его еще ковыряю..
Спойлер;==============
; Main.asm file generated by New Project wizard
;
; Created: Пн авг 7 2017
; Processor: ATtiny13
; Compiler: AVRASM (Proteus)
;==============

;==============
.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 результата преобразования

reti ;Возврат из прерывания

shift:
cbi portb,0
ldi r19,16
mov r18,r16
mov r21,r17
sh1:
sbrs r18,7 ;Если 7-й бит в регистре r16 равен 1, пропустить след. строку
cbi PORTB,1 ;Установить 4-й бит PORTB (выключить LED2)
sbrc r18,7 ;Если 7-й бит в регистре r16 равен 0, пропустить след. строку
sbi PORTB,1 ;Сбросить 4-й бит в регистре PORTB (включить LED2)
nop
nop

sbi portb,0
cbi portb,0

rol r21
rol r18

dec r19
nop
brne sh1

cbi portb,2
sbi portb,2
cbi portb,2
ret
Вложения
ADC_volt.zip
(100.28 КБ) 236 скачиваний
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Jetetex писал(а):Вопрос: как пересчитать значения этого кода - это %, разность или напряжение в двоичной форме?
Вы спрашиваете что значит код АЦП?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jetetex »

да.
Мои мысли таковы - опорное напр (5 вольт ) / 2^10 (10 разр ацп) = некое напряжение (0.0048 вольт). Затем результат работы ацп умножаем на эти самые 0.0048 и получаем измеренное напряжение.

Где я ошибся? (просто не мог не ошибится :) )
Последний раз редактировалось Jetetex Вт авг 08, 2017 18:37:09, всего редактировалось 1 раз.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Так то в ДШ написано как считать. Код 0 - это ноль на АЦП. Код 1023 - это напряжение на АЦП >= ИОН. 512 - значит половина ИОН.

Добавлено after 12 minutes 57 seconds:
Jetetex писал(а):Где я ошибся?
А Вы и не написали, что сделали, что ожидали и что получили.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jetetex »

Пока писАл вопросы и измывался над Proteus'ом - разобрался. максимальное значение регистров результата = ИОН = 2047 (2^1+2^2+2^3+...+2^9+2^10 = 00000011 11111111 ) таким образом самый младший бит, тот который 2^1, имеет значение 0.0024 вольта, самый старший 2^10 = 2.46. Далее переводим умножая 0.0024 на десятичный эквивалент полученого результата.

Тоесть
..
512 = 25% ИОН
..
1024 = 50%
..
1536 = 75%
2047 = 100%

PS. С ДШ у меня проблемы. Она все на англицком.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Z_h_e »

Максимальное 10ое число это 1023. Как Вы 2047 получили?

Вот формула из ДШ, тут обычная математика.
Изображение

Правда мне непонятно почему в формуле 1024, а не 1023.

Добавлено after 1 minute 11 seconds:
Мои мысли таковы - опорное напр (5 вольт ) / 2^10 (10 разр ацп) = некое напряжение (0.0048 вольт). Затем результат работы ацп умножаем на эти самые 0.0048 и получаем измеренное напряжение.
Правильные же мысли были, не мудрите.
Вложения
adc.gif
(1.61 КБ) 818 скачиваний
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Сообщение Jetetex »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3158592#p3158592"]Максимальное 10ое число это 1023. Как Вы 2047 получили?[/uquote]

Мне самому теперь не понятно. :oops:
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Ответить

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