2tych
да, всё ясно. там все числа приводятся к одной разрядности(как я не догадался?), а потом уже выполняются операции.
пример signed r16 to signed r17-r16:
Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
Gray64 писал(а):Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
извините за нескромный вопрос - а какой-такой ассемблер вы используете для avr-studio?! и второй вопрос - зачем объектник в студию совать?!
имхо - в студии отличный встроенный ассемблер, который создает все, что нужно...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Gray64 писал(а):Доброго времени суток!
Начинающий в atmel'ах.
Превые шаги делал по обучалке, всё получаетсо.
Но ассемблер не создает обьектный код, который требует avr-studio.
Но судя по файлу рядом с exe , он может это делать. Что надо дописать в батник, чтобы он создавал этот код?
извините за нескромный вопрос - а какой-такой ассемблер вы используете для avr-studio?! и второй вопрос - зачем объектник в студию совать?!
имхо - в студии отличный встроенный ассемблер, который создает все, что нужно...
Оперативно. Спасибо, что откликнулись. Я же писал, что я начинающий. В руках у меня книга Вольфганга Трамперта AVR-RISC микроконтроллеры. Так вот, на странице 298 написано: "Наиболее важное окно - это окно с иходным кодом программы, которое открывается автоматически при открытии объектного файла. (Обьектный файл - один из выходный файлов avr - ассемблера)".
Это дословно. Для новичка о том, что в Studio есть свой ассемблен нету и полуслова. Вот так и учись...
Это конечно не обучалка, но не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть. (с английским ну очень туго). А то я свои программы по 200 раз перепрошиваю для выявления ошибок. Или, если можно, пошлите тудЫ, где это "по нашёму" описано.
Gray64 писал(а):
.... но не могли б вы мне пошагово обяснить, как в этот ассемблер в студии влезть. (с английским ну очень туго). А то я свои программы по 200 раз перепрошиваю для выявления ошибок. Или, если можно, пошлите тудЫ, где это "по нашёму" описано.
Все просто:
1. Запускаешь студию
2. если запустился мастер проектов (если в настройках студии ничего особо не менял, то должен запуститься), то: а) нажимаешь кнопку "нью прожект"; б) выбираешь в появившемся окошке "АВР ассемблер", называешь проект, отмечаешь/не отмечаешь создавать ли папку; в) нажимаешь "некст"; г) выбираешь отладчик и кристалл; д) нажимаешь "финиш"
3. Если не запустился мастер, тогда в меню "проект (project)" выбираешь "создать новый проект", далее согласно п.2.
ARV писал(а):имхо - в студии отличный встроенный ассемблер, который создает все, что нужно...
Может быть он(их там два кстати) и вправду отличный, и создает всё что нужно и поддерживает условия в макросах и условное ассемблирование и а-ля сишные директивы :). Правда вот беда, не поддерживает локальных меток. И не смотря на то, что "студийный" асм позволяет вышеперечисленное, я всё равно выбираю tavrasm в пользу локальных меток, которые избавляют от кучи гемора с выдумыванием уникальных имен в подпрограммах. И это тоже имхо :)
А OBJ tavrasm умеет генерить, -j ключик. Он вобщем то сразу выводит список опций с кратким описанием при запуске с пустой командной строкой.
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?
обращение к порту возможно 2-я способами - через команду OUT/IN либо через команду записи-чтения ОЗУ LDx/STx - при этом первый способ позволяет работоать только с портами, адрес которых не более 0х3F, а второй способ - с любыми портами. используйте второй способ.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
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 не действует.
Да, всё это выглядит кривовато и странно, я и сам по началу парился и не въезжал. Но потом когда привыкнешь и поймешь, то уже не страшно :)
спасибо за разъяснение. я дествительно, видел адреса xx(xx+20) регистров но зачем в скобках было +0х20 не понимал, теперь все стало на свои места.
теперь снова вопросик, по перываниям, как проще сделать, чтоб вызывать прерывание 60 раз в сек без внешнего генератора, каждый раз перезаводить таймер? И возможно ли на авр такое чтоб по ходу выполнения основной программы, по приходу прерывания, после обработки программы по вектору, вернуться в основную на место?
milkpower писал(а):И возможно ли на авр такое чтоб по ходу выполнения основной программы, по приходу прерывания, после обработки программы по вектору, вернуться в основную на место?
это не только возможно - это основа основ, именно так прерывания и обрабатываются!!!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
я все понял.
оказывается объявленный массив всего лишь содержит два байта конечного адреса массива. получается что он записывается с конца по данному алгоритму.
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
учим английский .
спасибо вам за ваше терпение и ваши подробные ответы !