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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

Z_h_e писал(а): Как на равенство проверять с помощью флага С?
Да, тут я с BREQ/BRNE, пожалуй, несколько ошибся. Одного флага будет недостаточно, например, для чисел вроде 0x5678 и 0x5531 (младшие байты не равны, старшие отличаются на 1) будет ошибочно воспринято равенство. 0x78..0x31 установят C, а 0x56..0x55+1 ошибочно его снимут.
Реклама
dimmer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

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

Сообщение dimmer »

dimmer писал(а): В Атмелевском файле AVR202.asm представлена идиома "Negate a 16-bit Register Variable":

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

	com	ng1l
	com	ng1h
	subi	ng1l,low(-1)
	sbci	ng1h,high(-1)
на самом деле можно сделать короче:

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

	neg	ng1h
	neg	ng1l
	sbci	ng1h,0
Выше в этой ветке я приводил ещё пример использования особенности флага С.
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Как проверять на равенство... да много байтев...
адрес массива в указатель (X,Y,Z)
какой-нить счетчик количества байт cntb...
ну и покатились...

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

loop_cp:
       ld r16,x+
       ld r17,y+
       spse r16,r17
         rjmp error
       dec cntb
       brne loop_cp
     return ; or rjmp adr
error:
    обрабатываем ошибку
как-то и без срс и размер массива побольше...
примерно таким же манером и по регистровому файлу пройтись можно

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

   cpse r16,r17
   rjmp error
   cpse r14,r15
   rjmp error
 нормальное завершение...
одначе собственно по случаю размещения данных в регистровом файле конструкция с срс более оптимальна...
:roll:

dimmer
"0 - число" не одно и то же, что "число - 0"...
ежли уж "сокращать"

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

   com   ng1l
   com   ng1h
   subi   ng1l,low(-1)
   sbci   ng1h,high(-1)
так используя то, что система команд АВР для двухбайтовых значений надурняк предоставляет

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

  com   ng1l
   com   ng1h
   adiw ng1l,1
разместив ng1h:ng1l где-нибудь в парах R25:R24, R27:R26, R29:R28 или R31:R30.
НО... поскольку последние три индекс-указатели, то для двухбайтовых и прочих фоуксов весьма напрашивается R25:R24 с выделением этой пары с отметкой "псевдобазовый регистр"...
:beer:
dimmer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

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

Сообщение dimmer »

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

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

Сообщение akl »

BOB51 писал(а):Как проверять на равенство... да много байтев...
адрес массива в указатель (X,Y,Z)
какой-нить счетчик количества байт cntb...
ну и покатились...

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

loop_cp:
       ld r16,x+
       ld r17,y+
       CPSE R16,R17         ;имелась в виду spse r16,r17
         rjmp error
       dec cntb
       brne loop_cp
     return ; or rjmp adr
error:
    обрабатываем ошибку
как-то и без срс и размер массива побольше...
Команда CPSE сравнивает регистры, НЕ меняя флаги. Бывает полезно. По мне, лучше определить конец массива, по которому определять окончание процедуры. Тогда и счетчик cntb не нужен.

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

loop_cp:
       ld r6,x+
       ld r7,y+
       CP R6,R7
        BRNE  ERROR         ;здесь ставится любой(ые) BRxx 
 CPI YL,LOW(BUFER_END)
 BRLO loop_cp
;       dec cntb
;       brne loop_cp
     return ; or rjmp adr
error:
    обрабатываем ошибку
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Это в случае когда массив не пересекает переход старшего байта через 0, а это в общем случае неверно. Тем более для ассемблерной вставки, когда массив ей предоставляется языком высокого уровня и неизвестно заранее куда он его распределил.
А в таком случае придется проверять оба байта, то есть нет выигрыша ни по скорости, ни по ОЗУ. Выигрыш будет либо при ручном распределении памяти, либо если размер массива больше 256 байт, либо на младших моделях, где меньше 256 байт ОЗУ.

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

ldi temp, high(BUF_END)
cpi YL, low(BUF_END)
cpc YH,temp
brne loop_cp
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

COKPOWEHEU писал(а):Это в случае когда массив не пересекает переход старшего байта через 0, а это в общем случае неверно.
Если Вы про флаг C, то в данном циклическом алгоритме он и не нужен. Достаточно определить любую пару неравных регистров (или ее не найти), чтобы понять равные ли области памяти или нет. Так что алгоритм с командой CPSE в цикле рабочий.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Нет, я про определение конца массива.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Можно еще глупость спрошу?
просто, когда я задаю здесь вопросы, то их надо написать, а когда пишешь, то их приходится понятно формулировать, а когда понятно формулируешь, часто ответ сам находится. . :)

Короче, можно ли в АВР загрузить в ОЗУ некоторый массив данных (довольно много, но определенный) из ФЛЕШа, а потом его тупо с какого-либо адреса начать читать и с легкой обработкой выдавать ПОБИТНО (последовательно) в порт? Или вообще без обработки отдавать ПОБИТНО в порт? Ну, например, пошли нули, то и вывод порта в нуле, пошли единицы - переключился в единицу...
понимаю, что это не СТМ32, у которого всякие DMI или как их там...
Станислав
Alkul
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

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

Сообщение Alkul »

СКАЗОЧНИК писал(а):Короче, можно ли в АВР загрузить в ОЗУ некоторый массив данных (довольно много, но определенный) из ФЛЕШа, а потом его тупо с какого-либо адреса начать читать и с легкой обработкой выдавать ПОБИТНО (последовательно) в порт? Или вообще без обработки отдавать ПОБИТНО в порт?
Конечно можно. Вот моя подпрограмма для печати строки, находящейся во флеш. Вам нужно делать также, только полученные данные не печатать, а помещать в ОЗУ.
Спойлер

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

;Подпрограмма вывода строки, хранящейся в программной памяти
;В регистровой паре Z начало строки, в регистре R19 адрес первой позиции вывода в строке дисплея	
PRNSTR:	push R18			;
	lsl ZL			;Умножить адрес начала строки на 2, так как доступ нужно
	rol ZH			;осуществлять побайтно
PRNS1:	lpm R18,Z+		;Занести в R18 байт из памяти программ, содержащий код выводимого символа
	cpi R18,$0		;Сравнение с нулем - кодом конца строки
	brne PRNS2		;Если принят не нуль, то переход на метку PRNS1
	pop R18
	ret			;Строка напечатана, выход из подпрограммы
PRNS2:	rcall PRNSYM		;Печать символа, хранящегося в R18, в позицию, адрес которой в R19
	inc R19			;Увеличение адреса для вывода следующего символа
	rjmp PRNS1		;Возврат на метку PRNSTR
А можно обойтись и без создания буфера в ОЗУ, если модификация данных не требуется. Сразу из флеш брать и отдавать
СКАЗОЧНИК писал(а):Ну, например, пошли нули, то и вывод порта в нуле, пошли единицы - переключился в единицу...
Написать подпрограмму, выдвигающую байт побитно в порт (на один из выводов порта) элементарно
Только надо протокол продумать - нужны ли старт-стоповые биты и т.д.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Ежли сразу из флешки - скорость значительно ниже максимально возможной.
Это ежли только при внешнем параллельном ОЗУ (флешка с параллельным доступом) - тогда еще вписаться в максимум скорости можно.
СКАЗОЧНИК
Речь как я понял о тех же WS2812B?
я ж вроде уже ссыль на исходник того алгоритма давал...
:wink:
Там побитовая передача ШИМ 1/3-2/3 причем желательно без накопления "лишнего времени".
И никаких стартовых/стоповых - гонится массив по три байта на каждый светик без каких-либо разделителей и/или разрывов передачи.
Весьма тоскная задачка...
8)
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

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

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

Сообщение BOB51 »

Не надо ничего там менять - программно более оптимальный вариант не получится - скорость там на пределе возможного (разве что только частоту еще до 20МГц поднять - рассчет велся/проверялся под 16МГц для внутреннего RC генератора) там в одном из последних слотов и так все такты выбраны.
Можно как в "типовых решениях" грузить рутину на SPI или USART -но там предварительное дробление для каждого байта и выбор лапок ограничен аппаратными "традициями".
:beer:
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Короче, написал. И даже работает! ))) 8)
Один минус... Плату, которую я делал для этого испортил... Вот там пожаловался. :cry:
http://radiokot.ru/forum/viewtopic.php? ... 5#p2893655

Добавлено after 11 minutes 33 seconds:
Работает вообще по тупому... И с первого раза. Главная задержка у них это первая самая, а вторую можно растягивать, как я понял даже до 10 мкс. Поэтому у меня вышло при 20 МГц тактировании - 1 такт = 50 нс.
Первую соблюдаем, т.е. надо было 8 тактов для нуля и 16 тактов для единицы (+- 3 такта). А вторые главное выдержать самую мелкую с учетом всех процессов обсчета следующего бита или даже байта, который брался из Флеша.
И все пашет.
Станислав
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15562
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Там один "подводный камень"...
ежли использовать для анализа бита данных обычные команды условного перехода будем иметь непредсказуемую накапливающуюся ошибку до +/- 8 тактов на каждом байте (не считая анализатор счетчика массива - еще добавочное время, но более предсказуемо). Ибо теоретически каждый байт содержит разное количество нуликов и единичек.
Как результат - возможность подпакостить при больших длительностях (больше 50 светиков).
На практике возможно допуск технологических отклонений от такого защищает, одначе желательно от того "джиттера" изначально избавится.
Вот ту задачу моя алгоритма и выполняет.
8)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Отличные светодиоды. Не знал про такие. Спасибо за инфу. :beer:

Стало интересно и решил попробовать написать код выдачи пакета цифр из ОЗУ, может самому пригодится. Ну например, для 200 светодиодов. Что-то мне подсказывает, требуется именно это количество. Всего то 6 мс требуется чтобы передать на них данные.

МК - Атмега8. Тактовая частота 16МГц. Выход - PB2 .Прерывания должны быть запрещены при передачи. Вроде как работает. Вы бы не могли, ув. СКАЗОЧНИК, проверить этот код в железе. У меня то светодиодов нет. Принцип передачи - FAST PWM таймера1, т.е. на нем все привязки по времени и никаких сдвигов и накоплений ошибок не должно происходить.
Спойлер

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

.def zero=R1

.def buf=R16

.def Bit1 =R17
.def Bit0 =R18
.def SbrosFlag=R19

.def Chislo=R20

//-----------------
.macro SetBit
	out TIFR,SbrosFlag
	//sbrc chislo,@0
	out OCR1BL,bit1
	sbrs chislo,@0
	out OCR1BL,bit0
.endm

.Macro WaitFlag//ждем когда сбросится счетчик
		in BUF,TIFR			
		ANDi buf,1<<TOV1
		breq PC-2
.endm
//---------------------

 .org 0

rjmp RESET ; Reset Handler
reti//rjmp EXT_INT0 ; IRQ0 Handler
reti//rjmp PCINT0 ; PCINT0 Handler
reti//rjmp TIM0_OVF ; Timer0 Overflow Handler
reti//rjmp EE_RDY ; EEPROM Ready Handler
reti//rjmp ANA_COMP ; Analog Comparator Handler
reti//rjmp TIM0_COMPA ; Timer0 CompareA Handler
reti//rjmp TIM0_COMPB ; Timer0 CompareB Handler
reti//rjmp WATCHDOG ; Watchdog Interrupt Handler
reti//rjmp ADC ; ADC Conversion Handler
;

//--------------------------------------------

RESET:  //
ldi buf,low(RAMEND)
out SPL, buf
ldi buf,High(RAMEND)
out SPH,buf

//константы
ldi buf,0
mov zero,buf
ldi Bit1,0x0C //значение для передачи 1
ldi Bit0,0x06 //0
ldi SbrosFlag,1<<TOV1

//Настройка таймера 1
Ldi buf,0x13          //Предел счета
out OCR1AH,zero
out OCR1AL,buf

         


//настройка порта
ldi buf,1<<PB2
out DDRB,buf
cbi PORTB,1<<PB2 //на всякий случай выключить порт



//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//**************************************************8
ldi Xl,low(600) //счечтик отправленных байт
ldi XH,High(600)

ldi Zl,low(0x60) //адрес откуда считывать данные
ldi ZH,High(0x60)



out TCNT1h, zero  //установить счетчик чуть меньшим значение верха
ldi buf,$11
out TCNT1l,buf

//*************************
//Занести ноль в старшой буфер
out OCR1BH,zero
//переключение выхода

ld chislo,Z+
//ldi chislo,0x55
SetBit 7
		

//------------------------------------------
// понеслась
LDI buf,(1<<WGM10)|(1<<WGM11)|(1<<COM1B1)|(0<<COM1B0)
out TCCR1A,buf
LDI buf,(1<<WGM13)|(1<<WGM12)+1
out TCCR1B,buf
//______________________

		WaitFlag
		
Cicle:		
		SetBit 6
		WaitFlag
		
		SetBit 5
		WaitFlag
		
		SetBit 4
		WaitFlag
		

		SetBit 3
		WaitFlag
		
		SetBit 2
		WaitFlag
		

		SetBit 1
		WaitFlag
		
		SetBit 0
		WaitFlag
		
		
SBIW X,1
breq Stop
		ld chislo, Z+
		
		SetBit 7
		WaitFlag
		 

		rjmp Cicle

//таймер стоп 
Stop:
		out TCCR1B,zero
		out TCCR1A,zero
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
loop:

	rjmp loop

Если код рабочий, можно попроовать биты тоже в цикле передавать. Слегка объем уменьшится.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

На данный момент могу проверить на 3х светодиодах... Т.к. плату первую, где их было хотя бы 36, испортил.... (((
и если портировать код на ТИНИ2313, не надо там много менять? Просто я не вникал еще. ))

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

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

Сообщение Z_h_e »

Сейчас сам портирую. На атмеге 8 таймер0 ущербный, потому и сделал на 1. Погляжу сейчас ДШ. Может на другом 8 битном сделаю.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Сообщение СКАЗОЧНИК »

Просто макетка у меня с 2313. А Мегу8 надо плату травить и в квадратном планарном распаивать. Другой нету. ( И если не сложно, поправьте сразу на РВ1, либо РВ2, либо на РВ3. ))) ну, что-то такое. )))) А я залью и посмотрю.

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

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

Сообщение Z_h_e »

Тактовая частота то какая? Данный алгоритм не получится при снижении частоты.
Ну и оперативки явно меньше у 2313, но это для реализации алгоритма конечно не важно.
Последний раз редактировалось Z_h_e Чт окт 20, 2016 17:25:13, всего редактировалось 1 раз.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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