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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Томатный
Нашел транзистор. Понюхал.
Сообщения: 174
Зарегистрирован: Вт июл 31, 2007 20:32:30
Откуда: Киев, Украина
Контактная информация:

Сообщение Томатный »

2tych
да, всё ясно. там все числа приводятся к одной разрядности(как я не догадался?), а потом уже выполняются операции.
пример signed r16 to signed r17-r16:

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

ldi r17,$00   
sbrc r16,7    ;если старший бит = 1 (отрицательное число)
ldi r17,$FF   ;тогда в старшем байте еденицы, иначе - нули


вот так всё просто :)
Аватара пользователя
Gray64
Встал на лапы
Сообщения: 96
Зарегистрирован: Вт май 27, 2008 21:15:01
Откуда: Украина
Контактная информация:

.obj

Сообщение Gray64 »

Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
Глаза боятся а руки делают!
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: .obj

Сообщение ARV »

Gray64 писал(а):Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
извините за нескромный вопрос - а какой-такой ассемблер вы используете для avr-studio?! и второй вопрос - зачем объектник в студию совать?!

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

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Re: .obj

Сообщение tych »

ARV писал(а):а какой-такой ассемблер вы используете для avr-studio?!

Обучалка написана под tavrasm наверно чтоб сутдию не качать. Я бы VMLAB советовал.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
Gray64
Встал на лапы
Сообщения: 96
Зарегистрирован: Вт май 27, 2008 21:15:01
Откуда: Украина
Контактная информация:

Re: .obj

Сообщение Gray64 »

ARV писал(а):
Gray64 писал(а):Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
извините за нескромный вопрос - а какой-такой ассемблер вы используете для avr-studio?! и второй вопрос - зачем объектник в студию совать?!

имхо - в студии отличный встроенный ассемблер, который создает все, что нужно...

Оперативно. Спасибо, что откликнулись. Я же писал, что я начинающий. В руках у меня книга Вольфганга Трамперта AVR-RISC микроконтроллеры. Так вот, на странице 298 написано: "Наиболее важное окно - это окно с иходным кодом программы, которое открывается автоматически при открытии объектного файла. (Обьектный файл - один из выходный файлов avr - ассемблера)".
Это дословно. Для новичка о том, что в Studio есть свой ассемблен нету и полуслова. Вот так и учись...
Это конечно не обучалка, но не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть. (с английским ну очень туго). А то я свои программы по 200 раз перепрошиваю для выявления ошибок. Или, если можно, пошлите тудЫ, где это "по нашёму" описано.
Глаза боятся а руки делают!
smac
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Вс июн 01, 2008 12:16:38

Re: .obj

Сообщение smac »

Gray64 писал(а):.... но не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть. (с английским ну очень туго). А то я свои программы по 200 раз перепрошиваю для выявления ошибок. Или, если можно, пошлите тудЫ, где это "по нашёму" описано.

Все просто:
1. Запускаешь студию
2. если запустился мастер проектов (если в настройках студии ничего особо не менял, то должен запуститься), то: а) нажимаешь кнопку "нью прожект"; б) выбираешь в появившемся окошке "АВР ассемблер", называешь проект, отмечаешь/не отмечаешь создавать ли папку; в) нажимаешь "некст"; г) выбираешь отладчик и кристалл; д) нажимаешь "финиш"
3. Если не запустился мастер, тогда в меню "проект (project)" выбираешь "создать новый проект", далее согласно п.2.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Re: .obj

Сообщение tych »

Gray64 писал(а):не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть.

Вот для всех разъяснено по-русски и с картинками -
как работать в AVR studio

Изображение
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
Gray64
Встал на лапы
Сообщения: 96
Зарегистрирован: Вт май 27, 2008 21:15:01
Откуда: Украина
Контактная информация:

Сообщение Gray64 »

Всем ,кто откликнулся,огромное спасибо.Я понимаю,надо знать английский,но в 44 года как бы не очень...располагает начинать.Ещё раз спасибо!
Глаза боятся а руки делают!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Gray64 писал(а):английский, но в 44 года как бы


Я потому и пишу НА РУССКОМ ! чтоб читалось.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Re: .obj

Сообщение Brutaller »

ARV писал(а):имхо - в студии отличный встроенный ассемблер, который создает все, что нужно...

Может быть он(их там два кстати) и вправду отличный, и создает всё что нужно и поддерживает условия в макросах и условное ассемблирование и а-ля сишные директивы :). Правда вот беда, не поддерживает локальных меток. И не смотря на то, что "студийный" асм позволяет вышеперечисленное, я всё равно выбираю tavrasm в пользу локальных меток, которые избавляют от кучи гемора с выдумыванием уникальных имен в подпрограммах. И это тоже имхо :)

А OBJ tavrasm умеет генерить, -j ключик. Он вобщем то сразу выводит список опций с кратким описанием при запуске с пустой командной строкой.
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Re: .obj

Сообщение tych »

Brutaller писал(а):я всё равно выбираю tavrasm

Я тоже ! в крайнем случае VMLAB 4 Мб всего. А Студия ПУХНЕТ на глазах в размерах.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
milkpower
Родился
Сообщения: 3
Зарегистрирован: Пн сен 08, 2008 13:33:44

Сообщение milkpower »

mega128. столкнулся с такой проблемой, в АВРстудио при копиляции на команду
OUT DDRG,R16
пишет error: Operand 1 out of range: 0x64
как тогда выводить на этот порт?

потом решил проверить, поморгать светодиодом на порт Д.
include "m128def.INC"
begin:
ldi r16,low(RAMEND)
out spl,r16
ldi r16,high(RAMEND)
out sph,r16
ldi r16,(1<<6) | (1<<7)
out DDRD,r16
loop:
ldi r16,(1<<6)
out PORTD,r16
rcall delay
ldi r16,(1<<7)
out PORTD,r16
rcall delay
rjmp loop
delay:
ldi r16,30
delay1:
ldi r17,200
delay2:
ldi r18,200
delay3:
dec r18
brne delay3
dec r17
brne delay2
dec r16
brne delay1
ret


он прост горит и никак не хочет моргать.
в итоге когда в понипроге проверил установку фьюзов, они считались все установленные и после этого мега вооще перестала шится/читаться. может понипрог глюканул, есть возможность сделать чип ресет на 128?
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

обращение к порту возможно 2-я способами - через команду OUT/IN либо через команду записи-чтения ОЗУ LDx/STx - при этом первый способ позволяет работоать только с портами, адрес которых не более 0х3F, а второй способ - с любыми портами. используйте второй способ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
milkpower
Родился
Сообщения: 3
Зарегистрирован: Пн сен 08, 2008 13:33:44

Сообщение milkpower »

т.е если я правильно понимаю, то

ST DDRG,R16 // пишем в порт
LD R16,DDRG // читаем из порта

так?
Аватара пользователя
Brutaller
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн ноя 05, 2007 12:44:43
Откуда: C:\Russia\SPb
Контактная информация:

Сообщение Brutaller »

milkpower писал(а):т.е если я правильно понимаю, то

ST DDRG,R16 // пишем в порт
LD R16,DDRG // читаем из порта

так?


Нет, не так.

Правильно так:

sts DDRG, r16
lds r16, DDRG

LD и ST это команды косвенной адресации через регистровые пары X, Y, Z

Только внимание, с регистрами, адреса которых не старше чем 0x3F лучше всегда пользовать IN/OUT, иначе если использовать STS/LDS с младшими регистрами, то нужно еще 0x20 прибавлять к адресу регистра.

Чтоб прояснилась ситуация, лучше глянуть в раздел "Register Summary" в даташите. Там можно заметить что в таблице у младших регистров двойные адреса, например для mega128 регистр PORTE записан как $03 ($23). Т.е. если мы пользуемся командами IN/OUT, то используется адрес $03, которому кстати и присвоено символьное имя PORTE в файле m128def.inc
Вот строка из inc файла:
.equ PORTE = $03

А если же захочется использовать с регистром PORTE команды STS/LDS, то придется написать так:
sts PORTE+0x20, r16
что разумеется выглядит кривовато и дает лишний шанс ошибиться.
Так что везде пользуем команды IN/OUT, ну а где ассемблер ругнулся там STS/LDS, тогда точно не ошибешься. А потом, когда привыкнешь к конкретному кристаллу, то уже сам будешь помнить какие регистры находятся в расширенном адресном пространстве, том которое старше 0x3F и на которое IN/OUT не действует.

Да, всё это выглядит кривовато и странно, я и сам по началу парился и не въезжал. Но потом когда привыкнешь и поймешь, то уже не страшно :)

Надеюсь, что нигде не обманул.
Аватара пользователя
milkpower
Родился
Сообщения: 3
Зарегистрирован: Пн сен 08, 2008 13:33:44

Сообщение milkpower »

спасибо за разъяснение. я дествительно, видел адреса xx(xx+20) регистров но зачем в скобках было +0х20 не понимал, теперь все стало на свои места.

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

Сообщение ARV »

milkpower писал(а):И возможно ли на авр такое чтоб по ходу выполнения основной программы, по приходу прерывания, после обработки программы по вектору, вернуться в основную на место?
это не только возможно - это основа основ, именно так прерывания и обрабатываются!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

Артур писал(а):Люди, Будьте добры!
Расскажите пожалуйста про инициализацию стека?
Я читал что он на аппаратном уровне! Как его использовать?

В Си не надо заморачиваться - компилятор сам сделает. в АСМ вот так примерно бывает для at90s2313 в начале проги:

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

start:
   ldi tmp,low(RAMEND)
   out SPL,tmp                    ; Init Stack pointer


или так для 8535

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

ldi   tmp,High(RamEnd)     ;stack pointer definition high byte
out   SPH,tmp              ;read from 8535def.inc file
ldi   tmp,Low(RamEnd)      ;stack pointer definition low byte
out   SPL,tmp              ;read from 8535def.inc file


А аппаратный стэк по-моему в at90s1200 был.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Аватара пользователя
MegaRazoR
Прорезались зубы
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

Мне надо записать байт из регистра данных SPI в массив. CodeVision делает это так:

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

;      41 adcin[c1]=SPDR;
   MOVW R26,R4
   SUBI R26,LOW(-_adcin)
   SBCI R27,HIGH(-_adcin)
   IN   R30,0xF
   ST   X,R30

что он тут нагородил и нельзя ли это сделать проще ?
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Аватара пользователя
MegaRazoR
Прорезались зубы
Сообщения: 239
Зарегистрирован: Вт сен 09, 2008 17:35:48
Откуда: Уфа

Сообщение MegaRazoR »

я все понял.
оказывается объявленный массив всего лишь содержит два байта конечного адреса массива. получается что он записывается с конца по данному алгоритму.

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

MOVW R26,R4               ;load c1 value in R26 and R27
   SUBI R26,LOW(-_adcin)     ;subtract R26 from adcin (LOW BYTE)
   SBCI R27,HIGH(-_adcin)    ;subtract R27 from adcin (HIGH BYTE). Now X contains current acdin adress.
   IN   R30,0xF              ;load SPDR val. (0xF) in R30
   ST   X,R30                ;write R30 val. in care of X

учим английский :).
спасибо вам за ваше терпение и ваши подробные ответы ! :)
Ответить

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