Страница 6 из 400

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

Re: .obj

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

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

Re: .obj

Добавлено: Ср авг 27, 2008 21:42:40
tych
ARV писал(а):а какой-такой ассемблер вы используете для avr-studio?!
Обучалка написана под tavrasm наверно чтоб сутдию не качать. Я бы VMLAB советовал.

Re: .obj

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

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

Re: .obj

Добавлено: Чт авг 28, 2008 00:20:19
smac
Gray64 писал(а): .... но не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть. (с английским ну очень туго). А то я свои программы по 200 раз перепрошиваю для выявления ошибок. Или, если можно, пошлите тудЫ, где это "по нашёму" описано.
Все просто:
1. Запускаешь студию
2. если запустился мастер проектов (если в настройках студии ничего особо не менял, то должен запуститься), то: а) нажимаешь кнопку "нью прожект"; б) выбираешь в появившемся окошке "АВР ассемблер", называешь проект, отмечаешь/не отмечаешь создавать ли папку; в) нажимаешь "некст"; г) выбираешь отладчик и кристалл; д) нажимаешь "финиш"
3. Если не запустился мастер, тогда в меню "проект (project)" выбираешь "создать новый проект", далее согласно п.2.

Re: .obj

Добавлено: Чт авг 28, 2008 11:09:23
tych
Gray64 писал(а):не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть.
Вот для всех разъяснено по-русски и с картинками -
как работать в AVR studio

Изображение

Добавлено: Чт авг 28, 2008 19:41:08
Gray64
Всем ,кто откликнулся,огромное спасибо.Я понимаю,надо знать английский,но в 44 года как бы не очень...располагает начинать.Ещё раз спасибо!

Добавлено: Чт авг 28, 2008 19:57:22
tych
Gray64 писал(а):английский, но в 44 года как бы
Я потому и пишу НА РУССКОМ ! чтоб читалось.

Re: .obj

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

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

Re: .obj

Добавлено: Сб авг 30, 2008 10:25:44
tych
Brutaller писал(а):я всё равно выбираю tavrasm
Я тоже ! в крайнем случае VMLAB 4 Мб всего. А Студия ПУХНЕТ на глазах в размерах.

Добавлено: Пн сен 08, 2008 13:41:58
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?

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

Добавлено: Пн сен 08, 2008 14:18:24
milkpower
т.е если я правильно понимаю, то

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

так?

Добавлено: Пн сен 08, 2008 19:33:48
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 не действует.

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

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

Добавлено: Вт сен 09, 2008 07:47:22
milkpower
спасибо за разъяснение. я дествительно, видел адреса xx(xx+20) регистров но зачем в скобках было +0х20 не понимал, теперь все стало на свои места.

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

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

Добавлено: Сб окт 18, 2008 19:13:06
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 был.

Добавлено: Пн окт 27, 2008 18:27:23
MegaRazoR
Мне надо записать байт из регистра данных 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
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
учим английский :).