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

Обсуждаем контроллеры компании Atmel.
Ответить
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Тут относительно недавно какая-то тема была, в этом году наверное. Помню еще товарищ akl, какое-то очень полезное участие в ней проявил :beer: . Наверное, как всегда, испытал в железе.
Вот могу соврать, вроде как там была попытка очистить ОЗУ в цикле командой PUSH. Условие окончания цикла было равенство SP нулю. Цикл отрабатывался нормально, но ни область регистров В/В, ни общего назначения не менялись.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2896
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Откуда: приходит весна?

Сообщение B@R5uk »

Z_h_e писал(а):Условие окончания цикла было равенство SP нулю. Цикл отрабатывался нормально...
Я не знаю что за МК проходил тестирование и какой именно был цикл (точнее реализация условия выхода), но регистр SP и регистр флагов находятся ближе всего к оперативке, так что не удивительно, что первый занулялся раньше, чем остальные регистры ввода-вывода.

Добавлено after 9 minutes 5 seconds:
trofim2 писал(а):Уважаемые коллеги.
Можно-ли расположить стек в регистрах АТмега48?
Памяти не хватает.
У этого микроконтроллера есть две штуки General purpose I/O register. Так что если вам нужен стек на один или два байта, то его наверное (надо проверять!) можно расположить в этих регистрах. С остальными регистрами будут следующие проблемы:

1) регистр не имеет прямого доступа (кешируется, например)
2) регистр имеет только однонаправленный доступ
3) регистр относится к управлению ядром МК, тактированием МК или к модулю который будет использоваться
4) в регистре реализованы не все биты
5) изменение содержимого регистра безоговорочно влияет на поведение портов МК
6) трудно найти непрерывную последовательность регистров не попадающих под случаи выше.
7) как уже выше сказали, стек может не иметь доступа к регистрам ввода-вывода (проверка на дурака зашита в железо)

Если не хватает памяти, то не лучше ли взять какие-нибудь ATmega88 или ATmeg168? Если планируется осуществлять поддержку проектируемого устройства, то лучше иметь запас по оперативке и ПЗУ, чтобы не пришлось потом перепаивать чип.
Реклама
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Команды sts и lds прекрасно работают со всеми регистрами.
Попытался настроить стек на r15.
В железе программа зависает.
В студии, при эмуляции, не пишется адрес возврата в регистры.

GPIOR0 удобно использовать для флагов, команды sbi и cbi не меняют SREG.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Можно конечно...
Ежли будет исполним, к примеру, трюк подобного вида:
clr xh
clr yh
ldi xl,2
ldi yl,0х1f ; подготовим адреса ячеек X=0х0002(r2) и Y=0х001f(r15)
st x,yl ; а теперь аналог mov r2,yl = в ячейку 2 (она же r2) загружено 0х1f
st y,r2 ; аналогия mov r15,r2 = в ячейку 0х1f (она же r15) загружено 2

в принципе... теоретически вроде проблем нет... работа с SP практически аналогична...
для каких-либо трюков вполне пойдет - стиль аналогии работы с регистровыми банками MCS51 (там даже изначально по умолчанию указатель стека на начало банка1 установлен /sp=0x07/).
:roll:
Реклама
Эиком - электронные компоненты и радиодетали
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Применение команд st -Y,reg и ld reg,Y+ решает задачу сохранения регистров в импровизированном стеке.
Также без проблем сохранить адрес возврата при использовании подпрограмм.
Но как организовать прерывание?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

В каком смысле
"Но как организовать прерывание?"...?
:shock:
Стандартные средства МК обычны для большинства случаев.
Обычно происходят вызовы автоматически по каким-либо соответствующим событиям.
Программно или симуляция события или прямая программная установка соответствующего флага.
Относительно собствеен обработки прерываний - это процесс личного творчества - пишем чего пожелается, но в рамках разумно-допустимого.
8)
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

BOB51 писал(а): ldi yl,0х1f ; подготовим адреса ячеек X=0х0002(r2) и Y=0х001f(r15)
st x,yl ; а теперь аналог mov r2,yl = в ячейку 2 (она же r2) загружено 0х1f
st y,r2 ; аналогия mov r15,r2 = в ячейку 0х1f (она же r15) загружено 2
Замечу, что адрес R15=0x0F, ну или просто 15.
Студия правильно отрабатывает код ниже, но... не отражает в R15 адрес возврата, в регистрах R14,R13 хотелось бы видеть результаты работы команд PUSH. Нужна проверка в железе. Правда у меня нет mega48, посмотрю на tiny2313
Спойлер

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

.include "m48def.inc"
.cseg
.org 0
	RJMP RESET
.org INT0addr	; External Interrupt Request 0
	PUSH	R0
	IN	R0,SREG
	PUSH	R0
	LDI	R16,0xCC
	MOV	R0,R16
	NOP
	POP	R0
	OUT	SREG,R0
	POP	R0
	reti
;*********************************************
RESET:
	LDI	XH,HIGH(15)
	LDI	XL,LOW(15)
	OUT	SPH,XH
	OUT	SPL,XL

	SBI	DDRD,2
	SBI	PORTD,2
	NOP
	CBI	DDRD,2

	CLR	R0
	DEC	R0

	LDI	R16,1<<SE
	OUT	SMCR,R16

	LDI	R16,1<<ISC01
	STS	EICRA,R16

	LDI	R22,1<<INT0
	OUT	EIMSK,R22
	OUT	EIFR,R22

	SEI 
WAIT:
	SLEEP
	NOP
	RJMP	WAIT
.EXIT
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Для прерывания нужен стек.
Импровизации не работают.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Мндя... опять "прокололся"... с R15...
:oops:
Отсутствие заброски данных адреса возврата в "тест-стек"...
Возможно потому, что регистровый файл не совсем "полноценный" в отношении исполнения функций оперативной памяти.
:dont_know:
Да и сами "половинки" не совсем подобны - неохота "полноценные" (r16-r31) на такие "извраты" использовать...
:roll:
В отличии от той же mcs51 у АВРок это регистр-акумуляторы, завязанные на АЛУ...
Не исключены некоторые ограничения на работу указателя SP...
Может еще где прописанные в спецнастройках (тогда можно и "похоамить нестандартно"),а может - гораздо неприятнее - обусловленные аппаратно...
Тогда надежд на "фокусы" не предвидится...
:(
Надо как-нить чиркнуть тест...
:write:
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

The Stack Pointer must be set to point above 0x0100, preferably RAMEND.
Прямое указание в DS на mega48 хороший тормоз. Наверно, есть внутренние цепи защиты. Просто интересно попробовать, хотя я и не сторонник такого.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Результаты натурных испытаний (в железе).
В качестве стека использовалась область ввода-вывода Timer/Counter1.
Стек настроен на адрес $8С.
Команды pop и push отрабатывает нормально,
rcall и ret - переходит на рестарт (похоже читает 0).
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Спойлер

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

	.INCLUDE "tn2313def.inc"

;.include "m48def.inc"
.cseg
.org 0
   RJMP RESET
;.org INT0addr   ; External Interrupt Request 0
.org	5
T1_OVER:
   PUSH   R0
   IN   R0,SREG
   PUSH   R0
   LDI   R16,0xCC
   MOV   R0,R16
   NOP
   POP   R0
   OUT   SREG,R0
   POP   R0
   OUT	PINB,R0
   RETI
;*********************************************
RESET:
	LDI	R16,0x6F
;	LDI	R16,15
	OUT	SPL,R16

	CLR   R0
	DEC   R0

	OUT	DDRB,R0
	OUT	PORTB,R0

   LDI   R16,1<<SE
   OUT   MCUCR,R16
;   OUT   SMCR,R16

	LDI	R16,1<<TOIE1
	OUT	TIMSK,R16
	OUT	TIFR,R16

	LDI	R16,2
	OUT	TCCR1B,R16
;   LDI   R16,1<<ISC01
;   STS   EICRA,R16

;   LDI   R22,1<<INT0
;   OUT   EIMSK,R22
;   OUT   EIFR,R22

   SEI
WAIT:
   SLEEP
   NOP
   RJMP   WAIT
.EXIT
Попытка использования РОН tiny2313 в качестве указателя стека с успехом провалилась :)) Контроллер зависает. Как только указатель стека ставится на область РАМ, работает.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Мндя...
Доступ к регистрам r0-r31 как к ОЗУ для LD/ST является нормой (как и для области портов ввода/вывода), а вот со стороны стековых операций там работы нету - видимо стоит какое-то аппаратное ограничение. Хотя... Изначально заявлено как "отображаемое на память" что не то же самое по сравнению что "полноценное ОЗУ"...
В каждом *def.inc файле есть дополнительная строчка с ограничением
#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60 ( 0x60 или какой другой - в зависимости от МК)
причем оговорено, что ее значения "лучше не трогать".
8)
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Как показала практика, ничего из этого невозможно.
А "#pragma AVRPART MEMORY INT_SRAM START_ADDR" не знаю на что влияет.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

trofim2 писал(а):Как показала практика, ничего из этого невозможно.
...
В каком смысле НИЧЕГО?
косвенное обращение по адресу регистра в указателях Z,X и Y выполняться будет также, как и обращение к ячейке ОЗУ
LD Rn,Ri/ST Ri,Rn ; Rn=r0-r31, Ri=Z,X,Y.
А вот установка указателя стека на область ниже, чем указано в #pragma AVRPART MEMORY INT_SRAM START_ADDR
вероятнее всего приведет к потере функционала POP/PUSH, CALL/RET и аппаратных прерываний - тех команд/операций, что завязаны на указатель стека (SPH:SPL).
:roll:
Кстати... Дебаггер у 4.19 при установке SPH:SPL (тинька 13) на область РОН команды CALL/RET отрабатывает но без наличия данных в регистрах (нет индикации соответствующих изменений - адрес возврата "где-то в дебрях" дебаггера).
:shock:
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Самое интересное, что Push/Pop тоже работает, (правда проверял с одной парой Push/Pop), но не нашел, куда складывает.
Указатель стека настраивал выборочно в диапазоне от 15 до $AF, даже на адреса, не занятые I/O.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Это скорее "ошибка среды" прикрывающая от "синего экрана" сам ПК.
Там же явно выбрасывается предупреждение:
Изображение
:wink:
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

У меня ошибок не выдает
screen_cr.jpg
(103.55 КБ) 445 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18791
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

господа, а вот оно вам нужно - ковыряние в неприличном? ну для какой цели эти "исследования"? неужели вы всерьез собираетесь использовать недокументированные возможности, которые по определению противоречат здравому смыслу, а именно использование области РОН под стек?! лучше посоветовать пожелавшему такое сделать лизнуть провода, торчащие из розетки, чем так писать программы...
trofim2 писал(а):Памяти не хватает
очевидно же, что решение на 100500% не в нескольких байтах ОЗУ под стек кроется! проблема ведь, скорее всего, в неправильном алгоритме, ошибках в программе, на худой конец, в неправильно выбранном МК... но никак не в увеличении стека за счет РОН!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

ARV писал(а):ну для какой цели эти "исследования"?
Ну праздное любопытство никто не отменял.
ARV писал(а):неужели вы всерьез собираетесь использовать недокументированные возможности
Я думаю никто тут и не собирался, кроме trofim2.
ARV писал(а):очевидно же, что решение на 100500% не в нескольких байтах ОЗУ под стек кроется!
Мне тоже не понятно. Даже если предположить, что если действительно не хватает нескольких байт, то почему нельзя оставить SP указывать туда куда следует, а в РОН хранить данные не влезшие в ОЗУ?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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