Страница 1 из 1
Assembler for AVR в вопросах и ответах
Добавлено: Вт май 15, 2007 21:51:33
std
У меня такая проблема: в общем выполняю по обучалке
http://www.radiokot.ru/start/mcu_fpga/avr/08/ программу:
.include "tn2313def.inc"
.def Temp =R16 ; обзываем регистры
.def Temp1=R17
.cseg ; начало программного сегмента
.org 0 ; задаем начальный адрес ПЗУ, в данном случае он = 0
ldi Temp,RamEnd ;добавлено позже
out SPL,Temp ;добавлено позже
ldi Temp, 0b11111111 ; записываем в регистр число
out DDRB, Temp
ldi Temp1, 0b00000010
m1: ldi Temp, 0b0000010
rcall p1
rjmp m1
;*********************************************************
p1: out PortB, Temp
ret
по идее должен вернуться в строчку "p1: ", тогда как возвращается в строчку "ldi Temp, 0b11111111". Никаких ошибок соответственно не выдаёт.
Пользуюсь AVR Studio 4.
Добавлено: Вт май 15, 2007 22:04:47
ARV
А что ж ты хотел, уважаемый?! Стек-то надо инициализировать в начале программы!
Стек - он как лестница-стремянка: сделал
rcall - поднялся на ступенку, сделал
ret - спустился на ступеньку. Только по умолчанию стоишь ты на самой вершине, потому любой шаг вверх - это переход на первую ступеньку (хорошо, если без ушибов)

...
Или невнимательно читал обучалку, или в ней про это забыли сказать...
Добавлено: Вт май 15, 2007 23:04:08
std
Виноват. А в документации про стек пишут, чо-то не могу найти на английском, под каким заголовком?
И ещё вопрос: в регистре PortB автоматически обнуляется 3-ий бит при переходе на следующую строчку. Вроде, в документаци про это ничего не сказано.
Добавлено: Вт май 15, 2007 23:11:55
ARV
не знаю, о какой документации речь... но про стек там в основном пишут то, что после сброса его указатель SPL равен нулю, т.е. указывает на первую ячейку ОЗУ. И еще пишут, что как можно раньше, буквально в первых строчках программы, надо занести в этот указатель адрес самой последней ячейки ОЗУ... больше, в сущности, и знать не надо.
А по поводу битов порта - у меня что-то не сбрасывается

после установки верного значения указателя стека - программа работает. Но это странная программа, она ничего не меняет в порте В - как вывела единичку туда, так она там и остается...
Добавлено: Вт май 15, 2007 23:19:11
std
Документация имеется ввиду DataSheet на МК в данном случае на ATtiny2313
Добавлено: Вт май 15, 2007 23:25:47
ARV
std писал(а):Документация имеется ввиду DataSheet на МК в данном случае на ATtiny2313
Очень хорошо помогает поиск в PDF-е по ключевым словам
SPL или
Stack Pointer 
если у нас одинаковые даташиты - то см. стр. 13
Добавлено: Вт май 15, 2007 23:33:38
std
Всё, разобрался, вроде: в AT90S2313 всё нормально, а в ATtiny2313 обнуляется и выводы у них по-разному подписаны.
Спасибо.
Добавлено: Ср май 16, 2007 07:07:58
ARV
std писал(а):Всё, разобрался, вроде: в AT90S2313 всё нормально, а в ATtiny2313 обнуляется и выводы у них по-разному подписаны.
Спасибо.
Пожалусто

Что за выводы? Что за программа? В вышеприведенной ничего обнуляться не должно.
Добавлено: Ср май 16, 2007 21:04:01
std
Выводы 14 и 16 МК:
ATtiny2313 и AT90S2313
14 - PB2(OC02/PCINT2) и PB2
16 - PB4(OC1B/PCINT4) и PB4
Ну я плохо разбираюсь пока, в общем проверял на одной и той же программке, но с разными МК для tiny 3-ий бит (справа налево) обнуляется, для 90S - нет.
Добавлено: Ср май 16, 2007 21:14:21
ARV
То, что выводы подписаны по-разному - это ведь не удивительно, МК-то разные. А вот что там обнуляется - так и не понял. Какой бит, где этот бит, в какой такой программе...

так будешь объяснять свои проблемы - помощи не дождешься никогда...
Добавлено: Ср май 16, 2007 22:10:30
std
прога:
include "tn2313def.inc"
.def Temp =R16
.def Temp1=R17
.cseg
.org 0
m1: ldi Temp, 0b11111111
out DDRB, Temp
out PortB, Temp
ldi Temp1, 0b00000011
m3: dec Temp1
brne m3
rjmp m1
результат строчки "out PortB, Temp" - PortB=11111111
после прохождения строчки "ldi Temp1, 0b00000011" PortB=11111011
Добавлено: Чт май 17, 2007 08:01:34
ARV
Фантастика!
Но в симуляторе AVR Studio 4.12 buld 460 программа отрабатывает так, как должна - ничего не сбрасывается лишнего. И в Tiny2313 и в AT90S2313.
Добавлено: Чт май 17, 2007 18:58:59
std
Всё ясно, ладно, как-нибудь пока обойдусь, потом может версию где-нить скачаю. Спасибо.
Добавлено: Вт июн 12, 2007 17:18:22
Tohey
А кто подскажет, почему в AVR команда adiw не может загружать константу больше 63...?
Добавлено: Вт июн 12, 2007 17:46:28
ARV
Потому что в коде команды для хранения этой константы отведено всего 5 битов.
Добавлено: Пт ноя 23, 2007 18:38:25
Tohey
А как на АСМе для АВР передать макросу строку?
Сделать что то типа такого:
Print my_string
Где
Print - имя макроса
my_string - параметр, имя строки.
Памагите люди добрые, пол дня промучался.

Добавлено: Пт ноя 23, 2007 19:56:32
ARV
не очень понял вопрос... может, так?
Код: Выделить всё
.macro Print
ldi ZL, low(@0*2)
ldi ZH, high(@0*2)
lpm Temp, Z+
; теперь что-то там делаем с загруженным символом строки. выводим, например...
.endmacro
а где-нибудь в коде пишем такое
а в другом месте кода (именно в сегменте кода!!!) пишем так:
Добавлено: Пт ноя 23, 2007 23:40:50
Tohey
ARV писал(а):не очень понял вопрос... может, так?
ДА! Я думаю наверно именно так! Хотя ещё не пробовал... @0 - Не ожидал.
Я пытался немного по другому тоже самое реализовать[/quote]