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

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

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

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

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

Сообщение BOB51 »

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

Сообщение 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
Откуда: Иркутск

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

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

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

Сообщение Z_h_e »

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

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

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

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

Сообщение Z_h_e »

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

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

А , да, простите. 20 МГц у меня.


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

Сообщение BOB51 »

Z_h_e
С аппаратным ШИМом...
можно разве что на прерываниях работать...
:dont_know:
суть ожидания флага по специфике аналогична.
:cry:
гляньте вот это:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887
по крайней мере алгоритм проверен в железе m.ixом
да и сама идея использования структур при решении не имеющих разной длительности при выполнении ветвлений по "ложь" и по "истина" дает весьма интересные области применения. При том, что код чуток более громоздкий.
Там бы еще разрядность счетчика массива увеличить... да мне пока ВЛОООМКИИ...
подсказка:
сам счетчик ставим в R26:R25 (вместо однобайтового по тексту исходника)
и выполняем банальное
sbiw r25,1
но снова надо на симуляторе подгонять будет...
:sleep:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Я короче, сделал тупо так:
Спойлер

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

; =================
; ОБЪЯВЛЕНИЯ И КОНСТАНТЫ (.def, .equ)
; =================
 
	.def	temp 	= R16	
	.def	SETX 	= R17			
	.def 	CLIX	= R18
	.def	cnt		= R19
	.def	Dt		= R20	
	.def	NopX	= R21	


	.equ	HIGHX	= 0b11111111			; Единички в нужных местах для выводв порта управленя светодиодами
	.equ	LOWX	= 0b00000000			; Нолики в нужных местах для выводв порта управленя светодиодами

	.equ	PORTX	= PORTB					; Порт управления светодиодами, выводы которого используются для передачи данных
		
;=====================

ВСЕ ОСТАЛЬНОЕ

;===========

;           --------- конфигурация портов -----------------------------------------------           

	Reset:	ldi temp, 0b11111111			; Конфигурируем порт B (направление порта)
			out DDRB, temp	
		
			ldi temp, 0b00000000			; Конфигурируем порт В (выводы порта)
			out PORTB, temp
		    ldi SETX, HIGHX					; Загружаем единички выводов для высокого уровня порта вывода
			ldi CLIX, LOWX					; Загружаем нолики выводов для низкого уровня порта вывода

			ldi temp, RAMEND				; Загрузка указателя стека
			out SPL, temp

			SBI ACSR,ACD					; Выключаем аналоговый компаратор (для меньшего потребления)
; *******************************************************************************************************************
; ОСНОВНАЯ ПРОГРАММА (основной цикл) ********************************************************************************
; *******************************************************************************************************************

	Start:

				ldi ZH, high (DATA*2) 
				ldi ZL, low (DATA*2)
													;	add ZL, RAZ1 				; Переходим на элемент
				ldi Dt, 55

		NEXT:	dec Dt
				breq Rst
		
				ldi cnt, 9
		
				lpm	temp, Z+						; Загружаем элемент (загрузка с пост-инкрементом) 3 такта

			BY:		dec cnt
					breq NEXT	
			
					rol temp
					
					brcc T							; 1/2 такта

						ldi NopX, 6
						out PORTX, SETX				; Установили порты, отправляем высокий уровень
						M:	dec NopX
							brne M
						
						out PORTX, CLIX				; Сбросили порты, отправляем низкий уровень
						nop							; 9 тактов ожидания высокого 4500 нс
						nop
												
					rjmp BY

T: 									ldi NopX, 3
						out PORTX, SETX				; Установили порты, отправляем высокий уровень
						N:	dec NopX
							brne N

						out PORTX, CLIX				; Сбросили порты, отправляем низкий уровень
						nop							; 17 тактов ожидания высокого 850 нс
						nop
						nop
						nop

						nop
						nop
						nop
						nop

					rjmp BY							; 2 такта

		Rst:	out PORTX, CLIX

	;	rjmp Rst
						
	rjmp Start	; Конец программы, переход на начало

; ***************************************************************************************************
; ПОДПРОГРАММЫ **************************************************************************************
; ***************************************************************************************************

;----------------------- ВЫВОД НА СВЕТОДИОДЫ --------------------------------------------------


	DATA:	.db 0b11111111, 0b11111111, 0b00000000, 0b00000000, 0b11111111, 0b11111111	; 1,2
		  	.db 0b11111111, 0b00000000, 0b11111111, 0b00000000, 0b11111111, 0b00000000	; 3,4
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 5,6
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 7,8
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 9,10
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 11,12
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 13,14
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 15,16
			.db 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00000000	; 17,18



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

Сообщение Z_h_e »

Может в пределах часа, двух портирую. Я тут параллельно еще всякой хренью занимаюсь.
BOB51 писал(а):С аппаратным ШИМом...
можно разве что на прерываниях работать...
Че это. Тем более прерывание внесет задержку на прыжок в него и обратно. А на 16 МГц все впритык.
BOB51 писал(а):гляньте вот это:
Позже гляну. Главное не забыть.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

Еще бы к нему приделать то, чтобы каждый раз новый вывод массива начинался со следующего элемента, а заканчивался теми, которые пропустили. Тогда, можно сделать двигающуюся радугу... :roll:


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

Сообщение BOB51 »

Блок вывода в ленту стабилен - ибо длина самой ленты также стабильна.
А поскольку выборочно изменить статус произвольного светика не перезагружая ВСЕ СВЕТИКИ ленты невозможно (разве что если это не последний в текущем пакете светик - тогда можно отбросить передачу в последующие не подверженные изменениям) то удовольствуемся условием как и для обычной динамической развертки на светодиодах - используем буфер вывода для обслуживания ленты, а в промежутках между загрузками пакетов изменяем его содержимое по собственному усмотрению.
8)
И дабы не флудить в теме, касательно ассемблера спецификой применения компонентов предлагаю желающим продолжить обсуждение ws2812b в свою винну тему:
http://radiokot.ru/forum/viewtopic.php? ... 7#p2858887
:beer:
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Z_h_e писал(а):Сейчас сам портирую. На атмеге 8 таймер0 ущербный, потому и сделал на 1. Погляжу сейчас ДШ. Может на другом 8 битном сделаю.
А таймер2 не подошёл бы?
Я всё-всё узнAю и стану профессором.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

да он такой же как и таймер 0, нет ограничения верха счета в режиме FAST PWM.


------------
Создал новую тему по таким светодиодам в периферии.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

Всем доброго времени суток. Мне необходимо перебирать последовательность нулей и единиц от 0000 до 1111. Единица, например, 100мкс высокого уровня, 100мкс низкого, ноль - 100мкс низкого, 100мкс высокого (цифры беру с потолка) :lol:. Пишу подпрограмму "Единица", пишу подпрограмму "Ноль" (задержки 100мкс организовываю без таймера - простым пожиранием процессорных тактов). Алгоритм такой - допустим нужно выплюнуть число 0101, МК смотрит и видит, что первое число "0" и некая подпрограмма говорит мол выбери подпрограмму "Ноль" и выплюнь с такого то пина, затем МК смотрит дальше и видит "1" и опять некая подпрограмма говорит выбери подпрограмму "Единица" и выплюнь, затем опять "0", опять "1". То есть между импульсами нуля и единицы получается цикл проверки (на ноль или единицу), что само по себе занимает процессорное время, а затем еще "некая подпрограмма говорит", пока она "говорит" проц.время тоже тратится тем самым выходит, что между нулями и единицами возникает пауза (пусть в 6-10мкс, но она есть). То есть получается так - выплюнули "ноль", затем пауза, выплюнули "единицу", затем пауза и тд. Допустима ли такая пауза или алгоритм изначально не верен. Хочу переписать переборщик кодов для шлагбаумов САМЕ с пик 18f252 на Мегу8. Проект вот этот http://phreakerclub.com/forum/showthread.php?t=29. Прошу помощи знающих котов так как разбираю исходник и мне кажется, что алгоритм тамошний так и работает, а мне не дает покоя эта пауза между импульсами или я что-то не так понимаю?
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные. Подготавливать данные можно вне обработчика, это позволит точнее выдерживать паузы. Также можно в обработчике прерывания изменять длительность следующей паузы в зависимости от значения данных. Главное, чтобы от момента входа в прерывание до момента "выдачи" данных всегда было одинаковое время.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

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

Сообщение Serhio »

dimmer писал(а):Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные.
Таймер хочу использовать для отсчетов времени высокого и низкого уровней -установили высокий уровень, таймер отсчитал 100мкс, затем низкий, таймер снова отсчитал 100мкс и тд. Не совсем понял про прерывание- зачем именно там выдавать данные. Данных будет 12 бит и посылка повторяется раза 4. Думаю не стоит этого делать в прерывании?!
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Serhio писал(а):
dimmer писал(а):Можно один из таймеров установить на 100мкс, и в обработчике его прерывания выдавать данные.
Таймер хочу использовать для отсчетов времени высокого и низкого уровней
Вот в обработчике прерывания этого таймера и выдавать очередной бит, а значение следующего бита затем вычислять в основной программе или после передачи в самом обработчике. Это позволит жестко привязать момент передачи бита к моменту возникновения прерывания.
Ответить

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