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

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Здравствуйте ребята! Прогу пишу на Ассемблере для МК Atmega8. Подскажите как из регистровой пары (например Х - регистр) сделать двухбайтный счетчик с инкрементом и декрементом?
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

adiw xl,1 - инкремент
sbiw xl,1 - декремент
Реклама
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Т.е. при достижении числа 256 xl обнулится, а в младшем бите xh запишется 1?
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В случае с adiw/sbiw обрабатывается сразу вся регистровая пара
Xh:Xl, а не раздельно младший и старший байты.
8)
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Ок! Благодарю всех за ответы!
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Иногда бывает полезно псевдочтение в регистр с целью изменить содержимое регистровой пары.

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

LD R0,X+; инкремент XH:XL
LD R0,-X; декремент XH:XL
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск

Сообщение pyzhman »

Хм, приколюха. Не знал. Спасибо.
Docendo discimus
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6348
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

А чем оно лучше ADIW, SBIW ? Тем, что флаги не трогает ?
Изображение
Модератор
Аватара пользователя
Сообщения: 19100
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

именно тем и лучше.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Не всегда лучше.
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Просто очень древний приём.
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Ёще раз благодарю за ответы! Помогите пожалуйста решить еще одну проблему в этом же проекте. Я использую АЦП МК Atmega8, он десятибитный.
Необходимо напряжение от 0 до (примерно) 5 Вольт разбить на 511 шагов. Для этого мне надо использовать всего девять бит регистров преобразования ADCL, ADCH. Если использовать все десять бит, то в младшем бите регистра ADCL появляется сигнал ошибки, видимо вызванный шумом МК и внешними наводками. Поэтому я пытаюсь сделать так: сначала копирую содержимое регистра ADCL в регистр XL, ADCH в XH. Далее мне надо сделать логический сдвиг вправо всей регистровой пары X c переносом младшего бита регистра ХH в старший бит XL. При этом, младший "вытесненный" бит регистра XL мне не нужен, а в старший бит регистра ХH надо записать ноль. Далее уже работать с этим числом. Таким образом я хочу с эмитировать девяти разрядный АЦП. Подскажите как сделать логический сдвиг вправо всей регистровой пары X?
Картинку прилагаю
Вложения
Логический сдвиг.jpg
(88.01 КБ) 416 скачиваний
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Снижать разрешение АЦП как то не очень.

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

LSR XH
ROR XL
Получили усечение. Хотя, правильнее сделать округление

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

LSR XH
ROR XL
 CLR R0
ADC XL,R0
ADC XH,R0
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Спасибо akl. Попробую.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Если младший бит смущает шумом, значение можно всегда пропустить через фильтр подвижного окна. И использовать все 10 бит.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1812
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

Сообщение Kavka »

[uquote="Kavka",url="/forum/viewtopic.php?p=3542170#p3542170"][uquote="Starichok51",url="/forum/viewtopic.php?p=3542126#p3542126"]4 байта сдвинуть 4 раза и без swap займет 16 циклов (а не тактов).[/uquote]
Именно поэтому я и спрашивал про быстрее 16 циклов/тактов. :)[/uquote]
Starichok51, pyzhman, BOB51 спасибо!

4epemyxa спасибо за вариант кода с умножением!
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Здравствуйте! Помогите решить проблему с АЦП в МК ATmega8!
Если настраиваю тактовую частоту МК 2 МГц от встроенного генератора без кварца, использую восьмибитный результат преобразования по входам ADC0 и ADC1, тактовая частота АЦП при измерениии на ADC0 и ADC1 = 1 Мгц, 5 бит регистра ADMUX (ADLAR = 1) не меняется при переключении с ADC0 на ADC1. То при такой конфигурации программа далее идеально работает:

main:
ldi R16, 0b00100001
out ADMUX, R16
ldi R16, 0b11000001
out ADCSRA, R16
m1: in R16, ADCSRA
sbrc R16, 6
rjmp m1
in R17, ADCH
out OCR2, R17

ldi R16, 0b00100000
out ADMUX, R16
ldi R16, 0b11000001
out ADCSRA, R16
m2: in R16, ADCSRA
sbrc R16, 6
rjmp m2
in R18, ADCH

\
\ ;дальнейшие вычисления
\

rjmp main

Если настраиваю тактовую частоту МК 2 МГц от встроенного генератора без кварца, использую восьмибитный результат преобразования по входу ADC1 и десятибитный результат по входу ADC1, тактовая частота АЦП ADC1 = 1 Мгц, а ADC0 = 125 Кгц. 5 бит регистра ADMUX ADLAR = 1- при опросе входа ADC1 и ADLAR = 0 - при опросе входа ADC1, то программа с редкими ошибками, но работает:

main:
ldi R16, 0b00100001
out ADMUX, R16
ldi R16, 0b11000001
out ADCSRA, R16
m1: in R16, ADCSRA
sbrc R16, 6
rjmp m1
in R17, ADCH
out OCR2, R17

ldi R16, 0b00000000
out ADMUX, R16
ldi R16, 0b11000100
out ADCSRA, R16
m2: in R16, ADCSRA
sbrc R16, 6
rjmp m2
in XH, ADCH
in XL, ADCL

\
\ ;дальнейшие вычисления
\

rjmp main

А если в этой программе убрать опрос входа ADC1 из цикла, то опрос ADC0 в цикле срабатывает однократно, а затем перестает работать с двухбайтным числом регистра XL, XH. Хотя эти два преобразования с ADC0 и ADC1 нужны для разных, не связанных друг с другом, участков программы

ldi R16, 0b00100001
out ADMUX, R16
ldi R16, 0b11000001
out ADCSRA, R16
m1: in R16, ADCSRA
sbrc R16, 6
rjmp m1
in R17, ADCH
out OCR2, R17


main:
ldi R16, 0b00000000
out ADMUX, R16
ldi R16, 0b11000100
out ADCSRA, R16
m2: in R16, ADCSRA
sbrc R16, 6
rjmp m2
in XH, ADCH
in XL, ADCL

\
\ ;дальнейшие вычисления
\

rjmp main

Такое ощущение, что надо все время все время полностью перезагружать АЦП - выключить, потом опять включить и настроить. Подскажите где проблема? Есть ли нюансы при переключения АЦП с одной частоты на другую, при переключении входов, при переключении 5 бита – ADLAR?
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Скорей ньюансы со считыванием регистров. Там имеется защёлка, когда один регистр читаешь то пока второй не прочитаешь защёлка не уберётся и новое значение в регистр не попадёт. Если у вас такая каша в программе происходит что работаете то в 8-битном режиме то в 10-битном просто тогда для 8 бит читайте оба регистра как и в 10-битном режиме. Видимо при переключениях и последующем чтении происходит срабатывание защелки.
Контактная информация:
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Порядок чтения тоже важен.
Спойлер

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

ldi R16, 0b00100001
out ADMUX, R16
	LDI	R16,0b11000001
	out ADCSRA, R16
m1:
	SBIC	ADCSRA,6
	RJMP	M1
	IN	R0,ADCL
	in R17, ADCH
	out OCR2, R17
main:
ldi R16, 0b00000000
out ADMUX, R16
	ldi R16, 0b11010100
;ldi R16, 0b11000100
out ADCSRA, R16
m2:
	SBIC	ADCSRA,6
	RJMP	M2

	in XL,ADCL
	in XH,ADCH

;	in XH, ADCH
;	in XL, ADCL

	RJMP	GO
Встал на лапы
Сообщения: 147
Зарегистрирован: Чт янв 10, 2013 21:03:18

Сообщение МКС »

Благодарю akl и Alexeyslav за ответы! Сейчас попробую исправить.
Ответить

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