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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
vistador
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Ср янв 30, 2008 17:52:55

Сообщение vistador »

smac писал(а):[ такое ощущение, что многим легче спросить и потом день ждать когда ответят, чем за 5 минут найти и разобраться в команде используя, например AVR Instruction Set - http://www.atmel.com/atmel/acrobat/doc0856.pdf.

согласен на 100 %. лучше разбираться самому....но была раньше такая работа на которой была возможность посидеть спокойно и чтото поделать.... а сейчас день пролетает как за 5 минут и я очень благодарен вам за понимание и помощь :)
ПС а на ссылку открывается такое вот окно :(
Изображение
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

vistador писал(а): ПС а на ссылку открывается такое вот окно :(

Прошу прощения, что не проверил, в ссылку вкралась лишняя точка в конце, уже поправил в своем сообщении.
Аватара пользователя
vistador
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Ср янв 30, 2008 17:52:55

Сообщение vistador »

спасибо...
Аватара пользователя
Тихоня
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 23, 2007 19:51:45
Откуда: Иркутск

Ассемблер

Сообщение Тихоня »

Начал изучать ассм самостоятельно. Заметил, что в программах часто встречается загрузка регистров примерно таким способом:

ldi R16, (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC)

Попытался разобраться, что это такое. Почитал описание упомянутых в вышеприведённом примере битов регистра USICR (МК ATTiny2313) и получил, что в данном случае в регистр R16 загружается байт 0b00011011. Вроде бы понятно. Хотя и непонятно, для чего его так записали :? .
Но в следующем примере мне встретилось ещё хуже :cry: :

ldi R16, (1<<USIWM0)|(0<<USICS0)|(1<<USITC)

Что такое (0<<USICS0) ? Это просто ноль во втором разряде двоичного числа? Тогда зачем его так записывать? В других разрядах тоже есть нули, но они получаются как бы сами собой и никто на них внимания не обращает... :shock: А этот ноль чем лучше других? Чего я недопонимаю?
Последний раз редактировалось Тихоня Чт мар 12, 2009 12:33:20, всего редактировалось 1 раз.
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Подобные записи используются для простоты визуального восприятия кода.
Что такое (0<<USICS0) ? Это просто ноль? Тогда зачем его так записывать? В других разрядах тоже есть нули, но они получаются как бы сами собой и никто на них внимания не обращает... А этот ноль чем лучше других?

Это обычный ноль, а записан он так, опять же, чтобы было чётко видно значение бита USICS0.
В других разрядах тоже есть нули, но они получаются как бы сами собой и никто на них внимания не обращает

На другие разряды никто не обращает внимания, т.к. в данном конкретном месте кода программы их значение не важно.
Аватара пользователя
Тихоня
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 23, 2007 19:51:45
Откуда: Иркутск

Сообщение Тихоня »

Pooher писал(а):На другие разряды никто не обращает внимания, т.к. в данном конкретном месте кода программы их значение не важно.

Ну, глядя в программу, я бы не сказал, что в ней не важно, чему будет равен, например, бит USICS1... Если в него записать 1, то полная чепуха получится. Но о нём просто решили не говорить. Молча записали ноль и всё. А на USICS0 ещё и пальцем показали.
Но в общем идея примерно прояснилась. Спасибо.
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Есть ли такие такие видеоуроки Ассемблера?

http://www.youtube.com/watch?v=4VbGbGVmbqo&feature=related
Не умеешь - не берись, но не взявшись не научишься...
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Помогите пожалуйста!

Как отличается написание с пробелами и их количеством?

вот пример:

.include "d:\avr\avrasm\appnotes\2313def.inc"

.def Temp=R16
.def Temp1=R17
.def Temp2=R18
.def Temp3=R19
.def Temp4=R20

.cseg
.org 0
ldi Temp, Ob11111111 ; присвоение константы
out DDRB,Temp ; вывод

; выводим число 11010010 на светодиоды

ldi Temp,Ob11010010 ; присвоение константы
out PortB,Temp ; вывод на индикацию

.cseg
.org 0

ldi Temp,Ob11111111
out DDR,Temp
Begin: ldi Temp, Ob00000001 ; зажигаем первый светодиод
out PortB,Temp

ldi Temp1,0 ; задержка
ldi Temp2,0
ldi Temp3,10
Loop: dec Temp1
brine loop1

dec Temp2
brine Loop1

dec temp3
brine Loop1



ldi Temp, Ob00000010 ; зажигаем второй светодиод
out PortB,Temp



не знаю, видно ли здесь, но после некоторых операторов стоит много пробелов. От их числа Много зависит? а если строчек (интер нажимаем)?

И что бедет если я напишу, например, не out PortB,Temp а out PortB, Temp, или out PortB, Temp?

Что будет?

Ответьте пожалуйста, заранее Благодарен!!!

вот еще вопрос по ходу: что такое Temp???
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

ничего не будет... не важно сколько пустых строк или пробелов, главное соблюсти синтаксис- поставь программу VMLAB и эксперементируй сколько влезет, там даже для наглядности панель есть с кнопками и светодиодами- можешь под них код писать, как под настоящую панель ;)

TEMP- это так регистр обозвали, некоторым неудобно писать out PORTB,R16, для наглядности обзывают регистры.
TEMP как название -это такая помойка, ее везде для одноразовых вычислений используют. Также можешь назвать R16 DATA или ZNACHENIE, PEREMENNAYA, короче как тебе удобнее.
Последний раз редактировалось Alexeus Пн мар 16, 2009 00:20:17, всего редактировалось 1 раз.
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Stalker46 писал(а):Помогите пожалуйста!
Как отличается написание с пробелами и их количеством?
...

Пробелов может быть сколько угодно, главное, чтобы о ни не разделяли ключевые слова (команды, имена регистров и т. п. ) т. е. нельзя писать

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

o ut P ORTB, r 16
остальное не запрещено.
Вообще у Вас по-видимому ошибки связаны с Ob11010010, это потому что у Вас там буква 'O' перед b вместо цифры 0.
Stalker46 писал(а):вот еще вопрос по ходу: что такое Temp

"Ну, вы, блин, даете" - (це) Михалыч.

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

.def    Temp=R16
.def    Temp1=R17

директива def задает символьное имя регистру, т.е после приведенных строк вместо r16 можно писать Temp, вместо r17 - Temp1, и т. д. А вообще RTFM.
Arlleex
Друг Кота
Сообщения: 4435
Зарегистрирован: Сб мар 07, 2009 20:44:36

Сообщение Arlleex »

Понятно все что Вы все сказали, только не понятно одно опять же:

А является ли ключевым словом это

ldi Temp,PortB
а можно ли так
ldi Temp, PortB

ldiTemp, PortB???
Не умеешь - не берись, но не взявшись не научишься...
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

Stalker46 писал(а):Понятно все что Вы все сказали, только не понятно одно опять же:

А является ли ключевым словом это

ldi Temp,PortB
а можно ли так
ldi Temp, PortB

ldiTemp, PortB???


последнее точно бред, такое не прокатит... (а что выхотите сделать присвоив темпу портб?)
вы хоть раз компилятор то запускали? если что не так- он ругается, если не ругается на с то тыся чпр обел ов и вместеслитыеслова, то все Ок, будет работать :)
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Stalker46 писал(а):Понятно все что Вы все сказали, только не понятно одно опять же:

А является ли ключевым словом это

ldi Temp,PortB
а можно ли так
ldi Temp, PortB

ldiTemp, PortB???

Вы бы лучше описание инструкций АВР почитали (искать можно на этом форуме по ключевы словам AVR Instruction Set, собственно ссылка на документ приведена мной на предыдущей странице этой темы).
Если Вы командой

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

ldi Temp,PortB 
пытаетесь считать содержимое порта B то у Вас ничего не получится, ибо читать нужно так

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

in Temp, PortB

Командой ldi Temp,PortB максимум что может получиться - это вы загрузите адрес порта в регистр Temp.
Аватара пользователя
Alexeus
Вымогатель припоя
Сообщения: 690
Зарегистрирован: Вс мар 04, 2007 01:17:12

Сообщение Alexeus »

да и состояние порта не так считывается а так:

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

 in temp,PinB 
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Сообщение smac »

Stalker46 писал(а):Понятно все что Вы все сказали, только не понятно одно опять же:

А является ли ключевым словом это

ldi Temp,PortB
а можно ли так
ldi Temp, PortB

ldiTemp, PortB???

Да, кстати, рекомендую пистать названия регистров так, как они записаны в файле определений (например m8def.inc если речь идет о мега8, для др. контроллера будет другой файл), т. е. заглавными буквами: PORTB, PINB, DDRB.
Аватара пользователя
Тихоня
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 23, 2007 19:51:45
Откуда: Иркутск

Сообщение Тихоня »

Я вижу, здесь немало знающих людей собралось: надеюсь и мне подскажут :wink:
Надо прочитать бит по одному адресу из пространства ввода-вывода (I/O space) и записать его по другому адресу и номеру разряда (тоже в I/O space). Как это сделать покороче?
У меня что-то больно громоздко получается: скопировать байт через IN в регистровый файл, выделить бит, проанализировать его значение, а потом, в зависимости от результата, SBI или CBI...
Неуж-то короче нельзя? :roll:
YurkaM
Нашел транзистор. Понюхал.
Сообщения: 151
Зарегистрирован: Пн сен 01, 2008 14:49:03
Откуда: Казахстан

Сообщение YurkaM »

Анализировать бит в I/O можно и не копируя. Смотри команды sbis и sbic.
А если копировать, то можно использовать команды bst и bld. Хотя всё равно длинновато получается......

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

in   temp,port_in
bst  temp,bit_in
in   temp,port_out
bld  temp,bit_out
out  port_out,temp
Аватара пользователя
Pooher
Мучитель микросхем
Сообщения: 491
Зарегистрирован: Вс янв 07, 2007 01:45:48
Откуда: Российская Федерация, будь она неладна...

Сообщение Pooher »

Тихоня писал(а):Неуж-то короче нельзя?

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

sbic PinX, X
rcall BitSet  ; перейти по метке, если бит Х в PinX установлен
sbis PinX, X
rcall BitReset ; перейти по метке, если бит Х в PinX сброшен
Научить нельзя, можно научиться. Пифагор.
Вставь недостающие буквы в слово *у*ня. Если у тебя получилось слово кухня, значит ты интеллигентный человек.
Аватара пользователя
Тихоня
Первый раз сказал Мяу!
Сообщения: 29
Зарегистрирован: Пт мар 23, 2007 19:51:45
Откуда: Иркутск

Сообщение Тихоня »

YurkaM, Pooher, спасибо! :))
Оба варианта по-своему хороши. У меня есть теперь пища для размышлений.
Это мне было нужно для тестовой программки, помогающей понять работу МК, а именно: светодиодик должен показывать состояние одного из флагов. Встроенный в AVR Studio симулятор дал мне повод усомниться в корректности симуляции интерфейса USI, почему я и решил поэкспериментировать на железе. А заодно и азы программирования осваиваю, совмещаю, так сказать, полезное с полезным :)
Igor
Родился
Сообщения: 8
Зарегистрирован: Вс янв 14, 2007 18:57:04

Сообщение Igor »

Люди, подскажите пожалста. Программку пишу и захотел сделать сохранение данные в ЕЕПРОМ. Программа данные туда успешно записывает, но вот считывает почему-то все нули. Уже пробую просто вывести в порт, на котором весят светодиоды то что прочтено из ЕЕПРОМ. Результат аналогичен :( Подскажите в каком месте криво сделано
Вложения
EEPROM.asm
(1.75 КБ) 513 скачиваний
Ответить

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