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

Обсуждаем контроллеры компании Atmel.
Ответить
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

shads писал(а): например для сравнения с 0 регистров нижней половины.

.....
а чем собсно TST не устраивает, работает со всеми регистрами.

ну и, простите, грузить регистры "00" или "FF", это уже совсем не по асмовски, есть же команды CLR и SER
Последний раз редактировалось GP1 Пт май 25, 2012 11:49:22, всего редактировалось 1 раз.
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

ploop писал(а):например для 8МГц
Нафига такие частоты?.. 1 МГц хватает сполна.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

ILYAUL писал(а):subi Zl,-2
Заметано!
ILYAUL писал(а):Из 2 подпрограмм на запись и чтение EEPROM - сделайте только 2 для обоих случаев - b можно назначать не в теле подпрограммы а перед входом в нее т.е 1 - запишите байт , b=40 - 40 байтов
Не совсем понял..... Хотя вижу что 2 блока EEPgWr и EEPgRd практически одинаковы..... Но не понял как их объединить.....
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Нафига такие частоты?.. 1 МГц хватает сполна.
Хе, смотря для чего. Иногда нужна производительность. Грамотно разруливая прерывания + основной код (например на флаговом автомате с приоритетами) можно в, казалось бы, слабый контроллер такого упихать! Плюс ассемблер даёт неплохую такую экономию флеша. Но и времени убивает немеряно...
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

GP1 писал(а):а чем собсно TST не устраивает, работает со всеми регистрами. Ну и, простите, грузить регистры "00" или "FF", это уже совсем не по асмовски, есть же команды CLR и SER
Это я к примеру привел (да и честно говоря, упомянутыми вами командами, сильно не заморачивался, надо будет пошшупать (а еще честнее сказать я вообще на них не обратил внимания)).

А так в большинстве случаев эти константы еще используются для иниц регистров в SRAM.
ploop писал(а):можно в, казалось бы, слабый контроллер такого упихать! Плюс ассемблер даёт неплохую такую экономию флеша. Но и времени убивает немеряно...
Зато в итоге ПРОИЗВЕДЕНИЕ получается..... (в отличие от С (хотя это субъективное мнение, т.к. на контроллерах я его еще не шшупал))
Реклама
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

shads писал(а): А так в большинстве случаев эти константы еще используются для иниц регистров в SRAM.
я бы рекомендовал про инициализацию и SRAM и R0-R31 почитать у ДиХалта, там сделано очень красиво порядка 15-20 байт флеша, и все память чиста как девственница :)))
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Дык у меня тоже вроде не много 18 байт

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

;очистка РОН и SRAM
			ldi		a,0
			ldi		zh,0				
			ldi		zl,0				;начало RON
ClrRam:	st		z+,a
			cpi		zl,30				;достигли ли конца поля RON 
			brne	ClrRam1				
			ldi		zl,cSramStrt		;продолжать с начала SRAM
ClrRam1:	cpi		zl,cSramStrt+128	;достигли ли конца поля SRAM
			brne	ClrRam
Пробовал еще укоротить вот так:

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

;очистка РОН и SRAM
			ldi		zh,0				
			ldi		zl,0				;начало RON
ClrRam:	st		z+,zh
			cpi		zl,30				;достигли ли конца поля RON 
			brne	ClrRam1				
			ldi		zl,cSramStrt		;продолжать с начала SRAM
ClrRam1:	cpi		zl,cSramStrt+128	;достигли ли конца поля SRAM
			brne	ClrRam
Дак, компилятор ругается: "результат может быть непредсказуемым", и не дает ходу, хотя все там предсказуемо, zh остается все время нулем.....
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Эммм... Всегда было интересно, зачем очищать ОЗУ? :shock:
Так делает Кейловский компилятор.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

подскажите пож. как выполняется выделенная строка (даташит почитал - не совсем понял)
.ORG $00
RESET:
RJMP START ;
RETI ; On Interrupt 0
RJMP GO_ISR1 ; On Interrupt 1 прерывание при нажатии кнопки "РЕЖИМ"
IJMP ; Timer 1 capture
RETI ; Timer 1A compare
NOP ; Timer 1B compare
ADIW XL, 1 ; Timer 1 overflow

что происходит в случае прерывания Timer 1 capture ? некий Indirect Jump to (Z)
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

igor-x писал(а):что происходит в случае прерывания Timer 1 capture ? некий Indirect Jump to (Z)
Прыгает на то место кода, адрес которого содержится в регистровой паре Z.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

shads писал(а): Но не понял как их объединить.....

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

MAIN:
		ldi		zl,cSRAMStrt+sWireDevN
		mov		EEAdr,Const00
		ldi		b,XXX
		rcall   EEBWr
.............
EEBWr:	sbic	eecr,eewe
		rjmp	EEBWr
		cli
		out		eear,EEAdr
		out		eedr,a
		sbi		eecr,eemwe
		sbi		eecr,eewe
		dec		b
        breq	EEBEnd
		inc		EEAdr
		ld		a,z+
		rjmp	EEBWr
EEBEnd:
		sei
		ret
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

shads
замени ldi на clr сократишь еще на пару-тройку байтов
igor-x писал(а):подскажите пож. как выполняется выделенная строка (даташит почитал - не совсем понял)
.ORG $00
RESET:
RJMP START ;
RETI ; On Interrupt 0
RJMP GO_ISR1 ; On Interrupt 1 прерывание при нажатии кнопки "РЕЖИМ"
IJMP ; Timer 1 capture
RETI ; Timer 1A compare
NOP ; Timer 1B compare
ADIW XL, 1 ; Timer 1 overflow

что происходит в случае прерывания Timer 1 capture ? некий Indirect Jump to (Z)
что-то вААбще не вкурил о чем это :shock:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

Gudd-Head писал(а):Эммм... Всегда было интересно, зачем очищать ОЗУ? :shock:
Так делает Кейловский компилятор.
Я тоже не знаю, но на всякий случай очищаю..... Я чуть раньше спрашивал, но чето никто не ответил, после выполнения reset, все регистры обнулены, или там мусор может быть? Если второе, то однозначно лучше в начале все почистить, чем потом отдельно писать нули туда где они должны быть (а таких регистров которые при старте должны быть в 0, уйма)
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

Gudd-Head писал(а):Эммм... Всегда было интересно, зачем очищать ОЗУ? :shock:
Так делает Кейловский компилятор.
Это так...
для большей лучшести :))) :wink:
в симуляторе удобней наблюдать, ИМХО
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

shads писал(а):после выполнения reset, все регистры обнулены, или там мусор может быть?
Что значит "после выполнения reset"? Если после подачи питания то да, в ОЗУ лежит мусор.
shads писал(а):лучше в начале все почистить, чем потом отдельно писать нули туда где они должны быть
Если где-то должны быть нули, то естессно их надо туда писать, а не полагаться на то, что они там будут.
GP1 писал(а):в симуляторе удобней наблюдать, ИМХО
В симуляторе-то как раз везде одни нули.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

igor-x писал(а):подскажите пож. как выполняется выделенная строка
Что-то, до боли, знакомое... :) Да, перед разрешением прерывания по захвату (в данном случае) нужно загрузить адрес входа в пару ZH:ZL.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

GP1 писал(а):shads замени ldi на clr сократишь еще на пару-тройку байтов
Каким образом? Помоему что LDI A,0 что CLR A суть одно.....
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

shads писал(а):Дак, компилятор ругается: "результат может быть непредсказуемым", и не дает ходу, хотя все там предсказуемо, zh остается все время нулем.....
Это не очевидно для компилятора, вот и ругается, ставьте вместо zh const00, и все.

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

Сообщение ploop »

Не, народ, на счет очистки ОЗУ есть два варианта: очищать нужный блок отдельно при инициализации какой-то подпрограммы (например перед первым её вызовом, если используется переменная, можно сделать STS ляля, нулевой_регистр), но если этих перемеенных/буферов и прочего набирается целый воз, то проще разом после ресета прочесать ОЗУ и забыть про это.
Так же не стоит забывать, что некоторые данные нужны после ресета, и должны сохраниться в ОЗУ (актуально для тинек, когда из-за недостатка ног на ресет вешают кнопки)
Мудрый кот
Аватара пользователя
Сообщения: 1817
Зарегистрирован: Пн ноя 29, 2010 15:58:43

Сообщение igor-x »

akl писал(а): Что-то, до боли, знакомое... :)
решил адаптировать Ваш измеритель для работы без индикатора..
Извините что без разрешения :))
Ответить

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