Assembler for AVR в вопросах и ответах

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Assembler for AVR в вопросах и ответах

Сообщение 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.
Последний раз редактировалось std Вт май 15, 2007 23:44:16, всего редактировалось 2 раза.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18590
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение std »

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

Сообщение ARV »

не знаю, о какой документации речь... но про стек там в основном пишут то, что после сброса его указатель SPL равен нулю, т.е. указывает на первую ячейку ОЗУ. И еще пишут, что как можно раньше, буквально в первых строчках программы, надо занести в этот указатель адрес самой последней ячейки ОЗУ... больше, в сущности, и знать не надо.
А по поводу битов порта - у меня что-то не сбрасывается :) после установки верного значения указателя стека - программа работает. Но это странная программа, она ничего не меняет в порте В - как вывела единичку туда, так она там и остается...
Последний раз редактировалось ARV Вт май 15, 2007 23:21:57, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение std »

Документация имеется ввиду DataSheet на МК в данном случае на ATtiny2313
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18590
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

std писал(а):Документация имеется ввиду DataSheet на МК в данном случае на ATtiny2313
Очень хорошо помогает поиск в PDF-е по ключевым словам SPL или Stack Pointer :) если у нас одинаковые даташиты - то см. стр. 13
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение std »

Всё, разобрался, вроде: в AT90S2313 всё нормально, а в ATtiny2313 обнуляется и выводы у них по-разному подписаны.
Спасибо.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18590
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

std писал(а):Всё, разобрался, вроде: в AT90S2313 всё нормально, а в ATtiny2313 обнуляется и выводы у них по-разному подписаны.
Спасибо.
Пожалусто :)
Что за выводы? Что за программа? В вышеприведенной ничего обнуляться не должно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение std »

Выводы 14 и 16 МК:
ATtiny2313 и AT90S2313
14 - PB2(OC02/PCINT2) и PB2
16 - PB4(OC1B/PCINT4) и PB4
Ну я плохо разбираюсь пока, в общем проверял на одной и той же программке, но с разными МК для tiny 3-ий бит (справа налево) обнуляется, для 90S - нет.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18590
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

То, что выводы подписаны по-разному - это ведь не удивительно, МК-то разные. А вот что там обнуляется - так и не понял. Какой бит, где этот бит, в какой такой программе... :( так будешь объяснять свои проблемы - помощи не дождешься никогда...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение 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
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18590
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

Фантастика!
Но в симуляторе AVR Studio 4.12 buld 460 программа отрабатывает так, как должна - ничего не сбрасывается лишнего. И в Tiny2313 и в AT90S2313.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
std
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Пт янв 26, 2007 21:17:17

Сообщение std »

Всё ясно, ладно, как-нибудь пока обойдусь, потом может версию где-нить скачаю. Спасибо.
Аватара пользователя
Tohey
Грызет канифоль
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Tohey
Грызет канифоль
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

А как на АСМе для АВР передать макросу строку?
Сделать что то типа такого:
Print my_string
Где Print - имя макроса
my_string - параметр, имя строки.

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

Сообщение ARV »

не очень понял вопрос... может, так?

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

.macro Print
    ldi  ZL, low(@0*2)
    ldi  ZH, high(@0*2)
    lpm Temp, Z+
    ; теперь что-то там делаем с загруженным символом строки. выводим, например...
.endmacro
а где-нибудь в коде пишем такое

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

 Print  Stroka   ; вывести строку
а в другом месте кода (именно в сегменте кода!!!) пишем так:

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

Stroka:   .db   'Превед!',0
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Tohey
Грызет канифоль
Сообщения: 257
Зарегистрирован: Сб сен 09, 2006 19:00:18
Откуда: СССР

Сообщение Tohey »

ARV писал(а):не очень понял вопрос... может, так?
ДА! Я думаю наверно именно так! Хотя ещё не пробовал... @0 - Не ожидал.
Я пытался немного по другому тоже самое реализовать[/quote]
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»