Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
А с прошивкой одна деталь, и та в 2 раза меньше. Вообще конечно умесный спор особенно в этой теме... 
Уважаемые коты хотелось бы вернуться к вопросу о стеке, локальных и глобальных переменных. Если конечно это актуально. Сегодня почти целый день просидел в AVRStudio пытаясь разобраться с вопросами задаваемые bfgroup, как бы тоже стало интересно вникнуть. Что то я стал многое не понимать долго не сидел над книгами. И вот с примером - var_loc1 это регистр или какая нибудь ячейка из озу? Пример, который показал bfgroup выше в постах.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Программа передает значение var_1 через регистр в стек подпрограмме, в подпрограмме эта переменная извлекается из стека через регистр как var_loc1, после расчетов заносится опять в стек, как переменная подпрограммы var_loc1, передавая программе результат расчетов подпрограммы, программа извлекает это значение из стека как var_1. В качестве переменной var_1 и var_loc1 используются регистры, т.к. операции со стеком только регистровые.
- Реклама
Аааа...! Сейчас попробую, потом отпишусь.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
стек понятие весьма растяжимое...
кроме аппаратного стека (sp & push\pop) можно в любое время и в любом месте ОЗУ организовать программный стек с помощью любого одного или нескольких индексных регистров и соответствующих команд обмена (а какой разновидности - на усмотрение программиста)
частной формой может являться и взаимоперекрытие адресного пространства этих областей

кроме аппаратного стека (sp & push\pop) можно в любое время и в любом месте ОЗУ организовать программный стек с помощью любого одного или нескольких индексных регистров и соответствующих команд обмена (а какой разновидности - на усмотрение программиста)
частной формой может являться и взаимоперекрытие адресного пространства этих областей
Доброго времени суток, ув. форумчане.
Подскажие такой вопрос.
Написал прогу которая управляет сдвиговым регистром на Меге8.
Написал корявенько, чисто для эксперимента,
пересылаю биты из таблицы в ПортВ, сдвигаю влево (данные сдвигового регистра весит на PB7) , дергаю тактовым PD0, защелкиваю PD1.
Подскажите как сварганить программу которая бы не учитывала при пересылке в порт остальные 7 бит, а только один!!
Хочу все это подрубить под Тиньку13.
Т.е. крутим байты из таблицы, при этом в порт выводим только первый бит в PB0.
Вместе с тем, дергаем тактовым PB1, и защелкиваем PB2.
Вот пример на Меге8
Подскажие такой вопрос.
Написал прогу которая управляет сдвиговым регистром на Меге8.
Написал корявенько, чисто для эксперимента,
пересылаю биты из таблицы в ПортВ, сдвигаю влево (данные сдвигового регистра весит на PB7) , дергаю тактовым PD0, защелкиваю PD1.
Подскажите как сварганить программу которая бы не учитывала при пересылке в порт остальные 7 бит, а только один!!
Хочу все это подрубить под Тиньку13.
Т.е. крутим байты из таблицы, при этом в порт выводим только первый бит в PB0.
Вместе с тем, дергаем тактовым PB1, и защелкиваем PB2.
Вот пример на Меге8
Код: Выделить всё
.include "m8def.inc"
.dseg
.cseg
clr r16
clr r17
clr r18
clr r19
clr r20
clr r21
clr r22
clr r23
clr r24
clr r25
clr r26
clr r27
clr r28
clr r29
clr r30
clr r31
ldi R16,low(ramend) ; Инициализация стека
out spl,r16
ldi R16,high(ramend)
out sph,r16
ldi r16,0b10000000
out DDRB,r16
ldi r16,0b00000011
out DDRD,r16
clr r16
start:
ldi ZL,low(table*2) ; Заносим младший байт адреса, в регистровую пару Z
ldi ZH,high(table*2) ; Заносим старший байт адреса, в регистровую пару Z
cpi r17,130 ; Установка количества байт, берущихся из пзу
brne GO1 ; Если равно, чистим R17
clr r17
GO1:
add ZL,r17 ; Пересылаем R17, в ZL
inc r17 ; Увеличиваем R17
lpm r16,Z ; Пересылаем данные из пзу в R16
GO3: ; Установка защелки, пустя N-циклов
cbi portD,0 ; Опускаем PD0 в ноль
rcall Tupizm
out portB,r16 ; Выводим r16 в порт В
sbi portD,0 ; PD0 в еденицу!
lsl r16 ; Крутим R16 влево
inc r24 ; Увеличим R24
cpi r24,8 ; Выбрали все биты?
brne GO3
rcall Zahelka
clr r24 ; Если да, то чистим R24
rjmp start
Zahelka:
rcall Tupizm
inc r25
cpi r25,2
brsh FTT
ret
FTT:
sbi portD,1 ; Дергаем PD1
rcall Tupizm
cbi portD,1
clr r25
ret
Tupizm:
inc r22
cpi r22,0
brne Tupizm
clr r22
inc r23
cpi r23,30
brne Tupizm
clr r23
ret
table:
.db 0b11000000,0b00000000
.db 0b00110000,0b00000000
.db 0b00001100,0b00000000
.db 0b00000011,0b00000000
.db 0b00000000,0b11000000
.db 0b00000000,0b00110000
.db 0b00000000,0b00001100
.db 0b00000000,0b00000011 итд...
Последний раз редактировалось Coldheart Вс июл 29, 2012 22:13:56, всего редактировалось 2 раза.
Ну это ты закрутил
ты бы мысль выразил яснее. Я так по ходу понял что тебе надо ПОСЛЕДОВАТЕЛЬНО передать 8 бит по одному в один вывод порта. Дак это просто делается - есть замечательная команда ROL и ROR которые сдвигают содержимое регистра.
заносишь передаваемые данные в регистр, сдвигаешь при помощи ROR, первый бит передается в флаг С, в зависимости от флага устанавливаешь свой порт и передаешь, так проделываешь 8 раз и в флаге С последовательно побывают все 8 бит начиная с самого младшего.
заносишь передаваемые данные в регистр, сдвигаешь при помощи ROR, первый бит передается в флаг С, в зависимости от флага устанавливаешь свой порт и передаешь, так проделываешь 8 раз и в флаге С последовательно побывают все 8 бит начиная с самого младшего.
да да! Все верно Именно так.Alexeyslav писал(а):Ну это ты закрутилты бы мысль выразил яснее. Я так по ходу понял что тебе надо ПОСЛЕДОВАТЕЛЬНО передать 8 бит по одному в один вывод порта. Дак это просто делается - есть замечательная команда ROL и ROR которые сдвигают содержимое регистра.
заносишь передаваемые данные в регистр, сдвигаешь при помощи ROR, первый бит передается в флаг С, в зависимости от флага устанавливаешь свой порт и передаешь, так проделываешь 8 раз и в флаге С последовательно побывают все 8 бит начиная с самого младшего.
Ну да ROR,ROL, и с флага С тянуть биты таблицы, ОК попробую, отличная идея..
Тут мысль пришла одновременно несколькими паровозами сдвиговых регистров управлять, из разных таблиц. Как тогда быть? Флаг С у нас только один ) Идея свежая, поэтому я чувствую что не трезвая. Лан покалупаюсь, может сам докумекаю.
PS. В результате мучений планирую освоить искусство создания информационных светодиодных панелей.
В принципе разобрался немножко. Получается тратится 4 регистра. Я правильно понял?
- Вложения
-
- local.zip
- (7.69 КБ) 212 скачиваний
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Здесь ошибка
Ну и кракозябы переведите на китайский хотя бы, может из кода что- нить поймём . Но муторный код. И почему тупизм нельзя обозвать задержка - например
Код: Выделить всё
GO1:
add ZL,r17 ; Ïåðåñûëàåì R17, â ZL
inc r17 ; Óâåëè÷èâàåì R17
lpm r16,Z ; Ïåðåñûëàåì äàííûå èç ïçó â R16Параллельно - без проблем, тогда просто анализируешь 0-й бит каждого регистра, потом все сдвигаешь. На место 0-го становится первый... и так 8 раз.
Понял правильно, но ты работаешь с аппаратным стеком, поэтому надо сохранять указатель стека, иначе из подпрограммы уже не вернешся куда надо.dave_elektrik писал(а):В принципе разобрался немножко. Получается тратится 4 регистра. Я правильно понял?
Поправил код, так все должно работать, но это только для этого случая, вариантов может быть много, если много вложенных подпрограмм регистров просто не хватит, тогда для передачи переменных нужно настраивать указатель стека в отдельную область ОЗУ.
- Вложения
-
- proba.asm
- (4.27 КБ) 350 скачиваний
Кстати о "крокозябрах" - для работы вне AVRstudio при написании текстовок для асма (а также и для других семейств МК) весьма удобно пользоваться редактором DPAD (v5.0.1.2)
http://www.dpad-editor.ru/
По крайней мере кодировка кирилицы всегда удобочитаема, да и программка из группы бесплатно-свободных

Coldheart
для вывода в матрицу еще быстродействие считать надобно, не все там так просто ведь в большинстве случаев используется динамический режим развертки изображения - для начала просто режим вывода в регистровый блок проработай (штук по 10 в пакете)
http://www.dpad-editor.ru/
По крайней мере кодировка кирилицы всегда удобочитаема, да и программка из группы бесплатно-свободных
Coldheart
для вывода в матрицу еще быстродействие считать надобно, не все там так просто ведь в большинстве случаев используется динамический режим развертки изображения - для начала просто режим вывода в регистровый блок проработай (штук по 10 в пакете)
Ой вспомнил что есть замечательная команда ANDI, просто затер ей все биты, кроме первого, и вуаля!
Потом сверху записываю отдельно бит тактового и защелки.
Потом сверху записываю отдельно бит тактового и защелки.
Для этого надо держать исходное значение где-то... на один регистр больше будет использоваться. Лучше флаг переноса анализировать и в зависимости от него устанавливать вывод порта.
Вообще-то для "беглых строк" и анимации наиболее приспособлена структура и система команд PIC18... У AVR (да и у mcs51) будут необходимы промежуточные операции переноса данных в регистровый файл (рабочий банк) по текущему кадру, да еще "подкачка" нового кадра по завершении текущего. Это может компенсироваться за счет повышенного быстродействия (генератор на максимальной частоте с предделителем 1:1) но... потребление тогда... аж "шкварчать" 
Банки - это у ПИКов, у AVR перенос с памяти в регистр занимает 2 такта, работа с регистром - один такт, у ПИКа - на то и другое - по 4 такта.
Только вот один нюанс - в пикушке для выполнения операций вращения /сдвига (и некоторых других) непосредственно используется любой байт ОЗУ - т.е. не требуется предварительная пересылка данных (в моих табличках по 10/12/16 отмечены как r-r ( http://radiokot.ru/forum/viewtopic.php?f=20&t=68985 ), для18-х еще не добавлял эту маркировку) да и 4 такта на команду...
По умолчанию скорость во всех семействах одна - у mcs51 совместимых с кварцем 12МГц, у AVR и у пикушек один мегагерц (~0,000001S/команда), только в AVR можно поднять до частоты внешнего кварца, у типовых представителей mcs51 at89c\s52 - до 2МГц (не говорится о силабсе и других производителях где частота внешнего генератора за 60МГц и делется не на 12, а на 6 или 2), у PIC при использовании PLL до 8МГц /10МГц (зависит от подвида и типа МК)
относительно банков - это касалось mcs51
Просто пока никто еще таким сравнительным анализом (без фанатизма) объективно не занимался
По умолчанию скорость во всех семействах одна - у mcs51 совместимых с кварцем 12МГц, у AVR и у пикушек один мегагерц (~0,000001S/команда), только в AVR можно поднять до частоты внешнего кварца, у типовых представителей mcs51 at89c\s52 - до 2МГц (не говорится о силабсе и других производителях где частота внешнего генератора за 60МГц и делется не на 12, а на 6 или 2), у PIC при использовании PLL до 8МГц /10МГц (зависит от подвида и типа МК)
относительно банков - это касалось mcs51
Просто пока никто еще таким сравнительным анализом (без фанатизма) объективно не занимался


