Ассемблер (ASM) для AVR в вопросах и ответах

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

Сообщение ploop »

Целых пять штук! :)
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

И прошивку не надо
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

А с прошивкой одна деталь, и та в 2 раза меньше. Вообще конечно умесный спор особенно в этой теме... :facepalm:
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Чт янв 27, 2011 05:43:01
Откуда: СНГ

Сообщение dave_elektrik »

Уважаемые коты хотелось бы вернуться к вопросу о стеке, локальных и глобальных переменных. Если конечно это актуально. Сегодня почти целый день просидел в AVRStudio пытаясь разобраться с вопросами задаваемые bfgroup, как бы тоже стало интересно вникнуть. Что то я стал многое не понимать долго не сидел над книгами. И вот с примером - var_loc1 это регистр или какая нибудь ячейка из озу? Пример, который показал bfgroup выше в постах.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Программа передает значение var_1 через регистр в стек подпрограмме, в подпрограмме эта переменная извлекается из стека через регистр как var_loc1, после расчетов заносится опять в стек, как переменная подпрограммы var_loc1, передавая программе результат расчетов подпрограммы, программа извлекает это значение из стека как var_1. В качестве переменной var_1 и var_loc1 используются регистры, т.к. операции со стеком только регистровые.
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Чт янв 27, 2011 05:43:01
Откуда: СНГ

Сообщение dave_elektrik »

Аааа...! Сейчас попробую, потом отпишусь.
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15645
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

стек понятие весьма растяжимое...
кроме аппаратного стека (sp & push\pop) можно в любое время и в любом месте ОЗУ организовать программный стек с помощью любого одного или нескольких индексных регистров и соответствующих команд обмена (а какой разновидности - на усмотрение программиста)
частной формой может являться и взаимоперекрытие адресного пространства этих областей
:beer:
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

Доброго времени суток, ув. форумчане.
Подскажие такой вопрос.
Написал прогу которая управляет сдвиговым регистром на Меге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 раза.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Ну это ты закрутил :) ты бы мысль выразил яснее. Я так по ходу понял что тебе надо ПОСЛЕДОВАТЕЛЬНО передать 8 бит по одному в один вывод порта. Дак это просто делается - есть замечательная команда ROL и ROR которые сдвигают содержимое регистра.

заносишь передаваемые данные в регистр, сдвигаешь при помощи ROR, первый бит передается в флаг С, в зависимости от флага устанавливаешь свой порт и передаешь, так проделываешь 8 раз и в флаге С последовательно побывают все 8 бит начиная с самого младшего.
Контактная информация:
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

Alexeyslav писал(а):Ну это ты закрутил :) ты бы мысль выразил яснее. Я так по ходу понял что тебе надо ПОСЛЕДОВАТЕЛЬНО передать 8 бит по одному в один вывод порта. Дак это просто делается - есть замечательная команда ROL и ROR которые сдвигают содержимое регистра.

заносишь передаваемые данные в регистр, сдвигаешь при помощи ROR, первый бит передается в флаг С, в зависимости от флага устанавливаешь свой порт и передаешь, так проделываешь 8 раз и в флаге С последовательно побывают все 8 бит начиная с самого младшего.
да да! Все верно Именно так.
Ну да ROR,ROL, и с флага С тянуть биты таблицы, ОК попробую, отличная идея.. :idea: спасибо.

Тут мысль пришла одновременно несколькими паровозами сдвиговых регистров управлять, из разных таблиц. Как тогда быть? Флаг С у нас только один ) Идея свежая, поэтому я чувствую что не трезвая. Лан покалупаюсь, может сам докумекаю.

PS. В результате мучений планирую освоить искусство создания информационных светодиодных панелей. :write:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 33
Зарегистрирован: Чт янв 27, 2011 05:43:01
Откуда: СНГ

Сообщение dave_elektrik »

В принципе разобрался немножко. Получается тратится 4 регистра. Я правильно понял?
Вложения
local.zip
(7.69 КБ) 212 скачиваний
[size=85]Я знаю немного, но то, что знаю, — знаю в совершенстве.[/size]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Здесь ошибка

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

GO1:   
      add ZL,r17         ; Ïåðåñûëàåì R17, â ZL
      inc r17            ; Óâåëè÷èâàåì R17
      lpm r16,Z         ; Ïåðåñûëàåì äàííûå èç ïçó â R16
Ну и кракозябы переведите на китайский хотя бы, может из кода что- нить поймём . Но муторный код. И почему тупизм нельзя обозвать задержка - например
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Параллельно - без проблем, тогда просто анализируешь 0-й бит каждого регистра, потом все сдвигаешь. На место 0-го становится первый... и так 8 раз.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

dave_elektrik писал(а):В принципе разобрался немножко. Получается тратится 4 регистра. Я правильно понял?
Понял правильно, но ты работаешь с аппаратным стеком, поэтому надо сохранять указатель стека, иначе из подпрограммы уже не вернешся куда надо.


Поправил код, так все должно работать, но это только для этого случая, вариантов может быть много, если много вложенных подпрограмм регистров просто не хватит, тогда для передачи переменных нужно настраивать указатель стека в отдельную область ОЗУ.
Вложения
proba.asm
(4.27 КБ) 350 скачиваний
Друг Кота
Аватара пользователя
Сообщения: 15645
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Кстати о "крокозябрах" - для работы вне AVRstudio при написании текстовок для асма (а также и для других семейств МК) весьма удобно пользоваться редактором DPAD (v5.0.1.2)
http://www.dpad-editor.ru/
По крайней мере кодировка кирилицы всегда удобочитаема, да и программка из группы бесплатно-свободных
:beer:
Coldheart
для вывода в матрицу еще быстродействие считать надобно, не все там так просто ведь в большинстве случаев используется динамический режим развертки изображения - для начала просто режим вывода в регистровый блок проработай (штук по 10 в пакете) :)
Прорезались зубы
Аватара пользователя
Сообщения: 244
Зарегистрирован: Пт сен 10, 2010 20:39:32
Откуда: Украина Луганская обл.

Сообщение Coldheart »

Ой вспомнил что есть замечательная команда ANDI, просто затер ей все биты, кроме первого, и вуаля!
Потом сверху записываю отдельно бит тактового и защелки.
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Для этого надо держать исходное значение где-то... на один регистр больше будет использоваться. Лучше флаг переноса анализировать и в зависимости от него устанавливать вывод порта.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15645
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Вообще-то для "беглых строк" и анимации наиболее приспособлена структура и система команд PIC18... У AVR (да и у mcs51) будут необходимы промежуточные операции переноса данных в регистровый файл (рабочий банк) по текущему кадру, да еще "подкачка" нового кадра по завершении текущего. Это может компенсироваться за счет повышенного быстродействия (генератор на максимальной частоте с предделителем 1:1) но... потребление тогда... аж "шкварчать" :)
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Банки - это у ПИКов, у AVR перенос с памяти в регистр занимает 2 такта, работа с регистром - один такт, у ПИКа - на то и другое - по 4 такта.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15645
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Только вот один нюанс - в пикушке для выполнения операций вращения /сдвига (и некоторых других) непосредственно используется любой байт ОЗУ - т.е. не требуется предварительная пересылка данных (в моих табличках по 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
Просто пока никто еще таким сравнительным анализом (без фанатизма) объективно не занимался :beer:
Ответить

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