Обсуждаем контроллеры компании Atmel.
Ответить

Ср авг 20, 2008 13:22:51

2tych
да, всё ясно. там все числа приводятся к одной разрядности(как я не догадался?), а потом уже выполняются операции.
пример signed r16 to signed r17-r16:
Код:
ldi r17,$00   
sbrc r16,7    ;если старший бит = 1 (отрицательное число)
ldi r17,$FF   ;тогда в старшем байте еденицы, иначе - нули


вот так всё просто :)

.obj

Ср авг 27, 2008 21:08:43

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

Re: .obj

Ср авг 27, 2008 21:19:09

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

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

Re: .obj

Ср авг 27, 2008 21:42:40

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

Обучалка написана под tavrasm наверно чтоб сутдию не качать. Я бы VMLAB советовал.

Re: .obj

Ср авг 27, 2008 22:56:16

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

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

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

Re: .obj

Чт авг 28, 2008 00:20:19

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

Все просто:
1. Запускаешь студию
2. если запустился мастер проектов (если в настройках студии ничего особо не менял, то должен запуститься), то: а) нажимаешь кнопку "нью прожект"; б) выбираешь в появившемся окошке "АВР ассемблер", называешь проект, отмечаешь/не отмечаешь создавать ли папку; в) нажимаешь "некст"; г) выбираешь отладчик и кристалл; д) нажимаешь "финиш"
3. Если не запустился мастер, тогда в меню "проект (project)" выбираешь "создать новый проект", далее согласно п.2.

Re: .obj

Чт авг 28, 2008 11:09:23

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

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

Изображение

Чт авг 28, 2008 19:41:08

Всем ,кто откликнулся,огромное спасибо.Я понимаю,надо знать английский,но в 44 года как бы не очень...располагает начинать.Ещё раз спасибо!

Чт авг 28, 2008 19:57:22

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


Я потому и пишу НА РУССКОМ ! чтоб читалось.

Re: .obj

Пт авг 29, 2008 22:07:52

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

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

А OBJ tavrasm умеет генерить, -j ключик. Он вобщем то сразу выводит список опций с кратким описанием при запуске с пустой командной строкой.

Re: .obj

Сб авг 30, 2008 10:25:44

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

Я тоже ! в крайнем случае VMLAB 4 Мб всего. А Студия ПУХНЕТ на глазах в размерах.

Пн сен 08, 2008 13:41:58

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?

Пн сен 08, 2008 13:52:38

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

Пн сен 08, 2008 14:18:24

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

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

так?

Пн сен 08, 2008 19:33:48

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 не действует.

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

Надеюсь, что нигде не обманул.

Вт сен 09, 2008 07:47:22

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

теперь снова вопросик, по перываниям, как проще сделать, чтоб вызывать прерывание 60 раз в сек без внешнего генератора, каждый раз перезаводить таймер? И возможно ли на авр такое чтоб по ходу выполнения основной программы, по приходу прерывания, после обработки программы по вектору, вернуться в основную на место?

Вт сен 09, 2008 08:14:04

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

Сб окт 18, 2008 19:13:06

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

В Си не надо заморачиваться - компилятор сам сделает. в АСМ вот так примерно бывает для 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 был.

Пн окт 27, 2008 18:27:23

Мне надо записать байт из регистра данных SPI в массив. CodeVision делает это так:
Код:
;      41 adcin[c1]=SPDR;
   MOVW R26,R4
   SUBI R26,LOW(-_adcin)
   SBCI R27,HIGH(-_adcin)
   IN   R30,0xF
   ST   X,R30

что он тут нагородил и нельзя ли это сделать проще ?

Пн окт 27, 2008 19:57:57

я все понял.
оказывается объявленный массив всего лишь содержит два байта конечного адреса массива. получается что он записывается с конца по данному алгоритму.
Код:
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

учим английский :).
Ответить