Страница 2 из 6
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Сб янв 22, 2011 22:51:30
ChipKiller
RAIDER писал(а):Проще говоря вызывается функция моргают 2 светодиода, вызывается другая то там один загорится другой потухнет и так далее.
... маленький совет - если хочешь, чтоб тебе помогли и самому через пару дней вспомнить "что бы это значило", пиши комментарии. Например:
Код: Выделить всё
Run1 ; зажигает/гасит светодиод на линии порта РА.х
...
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 00:55:04
simpleX
RAIDER писал(а):Не стал создавать новую тему так как я тоже начинающий и возник вопрос с асемблером. Написал программку где в главной функции вызываются по очереди 2 функции. Проще говоря вызывается функция моргают 2 светодиода, вызывается другая то там один загорится другой потухнет и так далее. Но почему то он после вызова первой функции не переходит ко второй.
Пробежал глазами по коду... Ошибка в программе.
Обратите внимание, что сначала записываете в temp2 значение 5, затем вызываете функцию Run2, где затираете temp2 значением 10. Далее крутите цикл до нуля в temp2. Затем возврат из подпрограммы, декремент temp2 (теперь там FF) и проверка флага Z, который при таком раскладе никогда не установится.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 01:16:22
ploop
RAIDER, или внимательней используйте регистры, или используйте их разные. Если не хватает - используйте стек в подпрограммах (push/pop) для временного хранения значений.
Да, и подпрограммы используйте только в том случае, если код повторяется более одного раза. Ну потренироваться конечно можно, но просто это лишнее использование стека и тактов процессора.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 01:34:54
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 выбирает адрес возврата из стека!
Как-то так... Или про параметры речи не шло?
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 02:29:37
DX168B
Для начала можно просто не забывать в конце подпрограммы извлекание впихнутого назад.
На вершине останется адрес возврата. Команда ret уже им займется.

Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 09:20:43
ploop
YS, зачем так? Принцип такой, как и в обработчиках прерываний: сохраняем только то, с чем работаем внутри подпрограммы (в прерываниях еще и SREG сохранять надо не забывать)
Код: Выделить всё
...
...
;активно работаем с R16, R17
...
...
rcall SubRoutine
...
...
;активно работаем с R16, R17
...
...
SubRoutine:
push R16
push R17
; делаем своё дело
pop R17
pop R16
ret
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 09:25:01
ploop
Как-то так... Или про параметры речи не шло?
А, вон ты про что!
Можно, конечно, и через стек перекидывать, но я бы использовал либо регистры, либо через ячейку памяти. Через стек запутано получается.
Дело в том, что при вызове подпрограммы мы точно знаем, где и что у нас лежит. Бери и пользуйся.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 10:07:31
RAIDER
Спасибо всем. Разобрался. А еще есть вопрос как сделать чтоб светодиод плавно загорался и плавно потухал. В какую сторону идти.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 10:26:17
ChipKiller
RAIDER писал(а):А еще есть вопрос как сделать чтоб светодиод плавно загорался и плавно потухал. В какую сторону идти.
... в сторону ШИМ. Разберись что такое прерывания и вперед. (Хотя можно сделать и на обычных задержках)
PS ... на ассемблере пишут желая получить компактный и быстрый код. Если не имеешь четкого представления, что делает каждая часть программы, то когда ее размер перевалит за 500...1000 строк - желание писать и отлаживать такую программу быстро пропадает.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 12:32:03
ploop
PS ... на ассемблере пишут желая получить компактный и быстрый код.
Не только. Ассемблер просто необходим для обучения. Только он даст понимание происходящих процессов.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 14:53:48
simpleX
ploop писал(а):Да, и подпрограммы используйте только в том случае, если код повторяется более одного раза.
Необязательно =)
Меня например учили в универе, что для читабельности кода не нужно городить подпрограмму на 1000 строк. Можно её разбить на функциональные части и оформить ввиде отдельных подпрограмм. Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем сплошной поток команд строк на 200.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 15:38:31
YS
Меня например учили в универе ...
А меня учили в универе, что суперортикон - современная и перспективная передающая трубка.
Вызовы подпрограмм/возвраты из них отнимают такты. А бывают случаи, когда на счету каждая сотня наносекунд. Кстати, умные компиляторы языков высокого уровня по-возможности вставляют код функции прямо в место вызова. А если объявить ее как
inline, то и вообще всегда.
Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем сплошной поток команд строк на 200.
Лучше всего писать комментарии. Для программ на ассемблере это просто жизненно необходимо.
Ассемблер просто необходим для обучения. Только он даст понимание происходящих процессов.
+10^9
Можно, конечно, и через стек перекидывать, но я бы использовал либо регистры, либо через ячейку памяти. Через стек запутано получается.
Да я тоже чаще через регистры перекидываю (в основном из соображений экономии времени). Но если уж заговорили про стек...

Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 16:47:11
simpleX
YS писал(а):Вызовы подпрограмм/возвраты из них отнимают такты. А бывают случаи, когда на счету каждая сотня наносекунд. Кстати, умные компиляторы языков высокого уровня по-возможности вставляют код функции прямо в место вызова. А если объявить ее как inline, то и вообще всегда.
Лучше всего писать комментарии. Для программ на ассемблере это просто жизненно необходимо.
Это, скорее, вопрос выбора аппаратных средств, либо работа на пределе возможностей.
И, кстати, через полгода будет трудно вспомнить назначение какого-то куска кода даже с комментариями, либо нужно в комментариях писать "сочинение". Особенно когда в голове держишь несколько проектов. Правильное построение самой программы не менее важно.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 16:55:29
ploop
либо работа на пределе возможностей.
Программирование МК и есть работа на пределе возможностей. Ведь цены на них, как и эти самые возможности, кратны степени двойки, поэтому всегда хочется выжать максимум.
Нет, я ничего не имею против правильного и структурированного оформления кода, если есть запас ресурсов. Но это как-то больше к ЯВУ относится, нежели к ассемблеру.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:10:36
simpleX
ploop писал(а):Но это как-то больше к ЯВУ относится, нежели к ассемблеру.
Думаю, что и к нему тоже =)
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:10:48
DX168B
YS писал(а):
Согласитесь, что анализировать код в 20 строк с вызовами rcall гораздо легче, чем Да я тоже чаще через регистры перекидываю (в основном из соображений экономии времени). Но если уж заговорили про стек...

И я задам последний вопрос по стеку.
Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Только младшая часть адреса возврата (1 байт) или весь адрес (2 байта)?
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:45:02
xkp
http://atmel.com/dyn/resources/prod_doc ... oc0856.pdf
более того, что дает изготовитель придумать сложно

ну и в добавку, дотошно проштудировать даташиты по каждой из изучаемых/применяемых/ микросхем
Данная и не только эта книги у меня есть. Ну не дружу я с английским
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:51:31
ploop
Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Если не ошибаюсь, один. В связи с чем действие rcall ограничено.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:56:28
DX168B
Только что в студии проверил. При вызове подпрограммы командой rcall, в конце ОЗУ появились 2 байта.
Re: програмирование AVR на АСЕМБЛЕРЕ для чайников
Добавлено: Вс янв 23, 2011 17:59:19
ChipKiller
Сколько байт запихивается в стек при вызовах и прерываниях в виде адреса возврата?
Только младшая часть адреса возврата (1 байт) или весь адрес (2 байта)?
... даже не читая manual легко узнать самому:
теперь запускаем AVRStudio и смотрим на то место в памяти, куда указывает SP. (смотрим внычале и когда находимся в точке xxx1)
