програмирование AVR на АСЕМБЛЕРЕ для чайников

Обсуждаем контроллеры компании Atmel.
Закрыто
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

RAIDER писал(а):Проще говоря вызывается функция моргают 2 светодиода, вызывается другая то там один загорится другой потухнет и так далее.
... маленький совет - если хочешь, чтоб тебе помогли и самому через пару дней вспомнить "что бы это значило", пиши комментарии. Например:

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

Run1 ; зажигает/гасит светодиод на линии порта РА.х
...
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск

Сообщение simpleX »

RAIDER писал(а):Не стал создавать новую тему так как я тоже начинающий и возник вопрос с асемблером. Написал программку где в главной функции вызываются по очереди 2 функции. Проще говоря вызывается функция моргают 2 светодиода, вызывается другая то там один загорится другой потухнет и так далее. Но почему то он после вызова первой функции не переходит ко второй.
Пробежал глазами по коду... Ошибка в программе.
Обратите внимание, что сначала записываете в temp2 значение 5, затем вызываете функцию Run2, где затираете temp2 значением 10. Далее крутите цикл до нуля в temp2. Затем возврат из подпрограммы, декремент temp2 (теперь там FF) и проверка флага Z, который при таком раскладе никогда не установится.
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

RAIDER, или внимательней используйте регистры, или используйте их разные. Если не хватает - используйте стек в подпрограммах (push/pop) для временного хранения значений.
Да, и подпрограммы используйте только в том случае, если код повторяется более одного раза. Ну потренироваться конечно можно, но просто это лишнее использование стека и тактов процессора.
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

используйте стек в подпрограммах (push/pop) для временного хранения значений.
Однако надо помнить, что при входе в подпрограмму на вершине стека будут лежать два байта адреса возврата, а потом - параметры. Так что сначала надо выбрать адрес возврата, потом параметры, а потом положить адрес возврата на место.

Т.е.

push param1 ;укладываем параметры подпрограммы в стек
push param2
...
push paramN

rcall SubRoutine ; команда rcall кладет в стек адрес возврата!

...

SubRoutine:

pop RetAddr1 ;сохраняем адрес возврата
pop RetAddr2

pop SubParamN ;выбираем параметры из стека
..
pop SubParam2
pop SubParam1

push RetAddr2 ;возвращаем адрес возврата на место
push RetAddr1

...
<Subroutine code>
...

ret ; команда ret выбирает адрес возврата из стека!

Как-то так... Или про параметры речи не шло?
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Для начала можно просто не забывать в конце подпрограммы извлекание впихнутого назад. :)))
На вершине останется адрес возврата. Команда ret уже им займется. :)
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

YS, зачем так? Принцип такой, как и в обработчиках прерываний: сохраняем только то, с чем работаем внутри подпрограммы (в прерываниях еще и SREG сохранять надо не забывать)

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

...
...
;активно работаем с R16, R17
...
...
rcall SubRoutine 
...
...
;активно работаем с R16, R17
...
...

SubRoutine:
push R16
push R17

; делаем своё дело

pop R17
pop R16
ret

Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Как-то так... Или про параметры речи не шло?
А, вон ты про что!
Можно, конечно, и через стек перекидывать, но я бы использовал либо регистры, либо через ячейку памяти. Через стек запутано получается.
Дело в том, что при вызове подпрограммы мы точно знаем, где и что у нас лежит. Бери и пользуйся.
Открыл глаза
Сообщения: 49
Зарегистрирован: Вт дек 28, 2010 22:24:32

Сообщение RAIDER »

Спасибо всем. Разобрался. А еще есть вопрос как сделать чтоб светодиод плавно загорался и плавно потухал. В какую сторону идти.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

RAIDER писал(а):А еще есть вопрос как сделать чтоб светодиод плавно загорался и плавно потухал. В какую сторону идти.
... в сторону ШИМ. Разберись что такое прерывания и вперед. (Хотя можно сделать и на обычных задержках)

PS ... на ассемблере пишут желая получить компактный и быстрый код. Если не имеешь четкого представления, что делает каждая часть программы, то когда ее размер перевалит за 500...1000 строк - желание писать и отлаживать такую программу быстро пропадает.
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

PS ... на ассемблере пишут желая получить компактный и быстрый код.
Не только. Ассемблер просто необходим для обучения. Только он даст понимание происходящих процессов.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск

Сообщение simpleX »

ploop писал(а):Да, и подпрограммы используйте только в том случае, если код повторяется более одного раза.
Необязательно =)
Меня например учили в универе, что для читабельности кода не нужно городить подпрограмму на 1000 строк. Можно её разбить на функциональные части и оформить ввиде отдельных подпрограмм. Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем сплошной поток команд строк на 200.
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Контактная информация:
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Меня например учили в универе ...
А меня учили в универе, что суперортикон - современная и перспективная передающая трубка. :)))

Вызовы подпрограмм/возвраты из них отнимают такты. А бывают случаи, когда на счету каждая сотня наносекунд. Кстати, умные компиляторы языков высокого уровня по-возможности вставляют код функции прямо в место вызова. А если объявить ее как inline, то и вообще всегда.
Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем сплошной поток команд строк на 200.
Лучше всего писать комментарии. Для программ на ассемблере это просто жизненно необходимо.
Ассемблер просто необходим для обучения. Только он даст понимание происходящих процессов.
+10^9
Можно, конечно, и через стек перекидывать, но я бы использовал либо регистры, либо через ячейку памяти. Через стек запутано получается.
Да я тоже чаще через регистры перекидываю (в основном из соображений экономии времени). Но если уж заговорили про стек... :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск

Сообщение simpleX »

YS писал(а):Вызовы подпрограмм/возвраты из них отнимают такты. А бывают случаи, когда на счету каждая сотня наносекунд. Кстати, умные компиляторы языков высокого уровня по-возможности вставляют код функции прямо в место вызова. А если объявить ее как inline, то и вообще всегда.

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

И, кстати, через полгода будет трудно вспомнить назначение какого-то куска кода даже с комментариями, либо нужно в комментариях писать "сочинение". Особенно когда в голове держишь несколько проектов. Правильное построение самой программы не менее важно.
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

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

Нет, я ничего не имею против правильного и структурированного оформления кода, если есть запас ресурсов. Но это как-то больше к ЯВУ относится, нежели к ассемблеру.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Сб май 30, 2009 00:51:42
Откуда: Россия, г. Курск

Сообщение simpleX »

ploop писал(а):Но это как-то больше к ЯВУ относится, нежели к ассемблеру.
Думаю, что и к нему тоже =)
Последний раз редактировалось simpleX Вс янв 23, 2011 17:10:53, всего редактировалось 1 раз.
"Никогда не опускайся чего б тебе ни стоило, как бы ни было плохо.
А если отступил и сдал немного, то, считай, душа продалась и сдохла!
Честь и кровь - сохрани свою совесть, свобода и любовь - вот она русская гордость"
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

YS писал(а): Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем Да я тоже чаще через регистры перекидываю (в основном из соображений экономии времени). Но если уж заговорили про стек... :)
И я задам последний вопрос по стеку.
Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Только младшая часть адреса возврата (1 байт) или весь адрес (2 байта)?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
xkp
Опытный кот
Аватара пользователя
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров

Сообщение xkp »

http://atmel.com/dyn/resources/prod_doc ... oc0856.pdf
более того, что дает изготовитель придумать сложно :))
ну и в добавку, дотошно проштудировать даташиты по каждой из изучаемых/применяемых/ микросхем

Данная и не только эта книги у меня есть. Ну не дружу я с английским
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Если не ошибаюсь, один. В связи с чем действие rcall ограничено.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Только что в студии проверил. При вызове подпрограммы командой rcall, в конце ОЗУ появились 2 байта.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Только младшая часть адреса возврата (1 байт) или весь адрес (2 байта)?
... даже не читая manual легко узнать самому:

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

   rcall xxx
xxx:
   rcall xxx1
xxx1:
   ret
теперь запускаем AVRStudio и смотрим на то место в памяти, куда указывает SP. (смотрим внычале и когда находимся в точке xxx1) :)
Закрыто

Вернуться в «AVR»