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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Alexeyslav писал(а):А не лучше ли масштабировать входное напряжение аналоговым способом?
Нет. Ответ выше.
Alexeyslav писал(а):Не уверен что внутренний ИОН обеспечит хорошую точность
О внутреннем ИОНе речи не было — см. выше.
Alexeyslav писал(а):Да, и как ты собрался достичь 0.5мв, тогда как квант при 12битах и опоре 3.3В составляет примерно 0.8мв?
Никак не собирался, это я ответил akl, которому не понравилась моя вносимая погрешность 0,013%. К тому же, речь о 10-ти битах.
Kavka писал(а):Занимает порядка 140 байт.
Етить-колотить, модифицированная процедура деления занимает 17 слов!
Kavka писал(а):А, как говорится, слона то и не заметили.
Спойлер

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

;******************************************************************************
;*	Unsigned multiply of two 16bits numbers with 24bits result.
;*	r18:r17:r16 = r23:r22 * r21:r20
;* STATISTICS
;*	Cycles :	14 + ret
;*	Words :		10 + ret
;*	Register usage: r0 to r1, r16 to r18 and r20 to r23 (9 registers)
;******************************************************************************

mul16x16_24:
	mul		r23, r21		; ah * bh
	mov		r18, r0
	mul		r22, r20		; al * bl
	movw	r17:r16, r1:r0
	mul		r23, r20		; ah * bl
	add		r17, r0
	adc		r18, r1
	mul		r21, r22		; bh * al
	add		r17, r0
	adc		r18, r1
	ret
ОМГ :facepalm: до этого я как-то не допёр. Это из аппнота или откуда?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Gudd-Head писал(а):Етить-колотить, модифицированная процедура деления занимает 17 слов!
Но работает-то быстее, чем 243 такта.
Gudd-Head писал(а):ОМГ :facepalm: до этого я как-то не допёр. Это из аппнота или откуда?
Ага, 201-ый.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Kavka писал(а):Но работает-то быстее, чем 243 такта.
Мне торопиться некуда, а флэша всего 8 кбайт :facepalm:
Kavka писал(а):Ага, 201-ый.
Мдя. Я слепой.

Кстати, как допереть или где почитать про нетривиальные операции с двоичными числами? Вот например, смотрю я функцию деления и нифига не понимаю: что-то сдвигается, вычитается, иногда прибавляется, в из флагов Carry получается результат. Или та же процедура BCD...
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Gudd-Head писал(а):Мдя. Я слепой.
Бывает. Рад, что помог.
Про деление, ну, самое тривиальное, это как обычное деление в столбик. Только цифр в числах всего две.

Про не тривиальные, это Генри Уоррен "Алгоритмические трюки для программистов" (Hackers Delight), например.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Kavka писал(а):Генри Уоррен "Алгоритмические трюки для программистов" (Hackers Delight), например.
Ооо... почитаем :))

Итак, товарищи: новая задача. На сей раз тривиальная:
Вывод информации на ЖКИ 44780 по 4-х битному интерфейсу.
Младшая (старшая) тетрада PORTX подключена напрямую к старшей тетраде данных ЖКИ (DB4...DB7).
При вызове функции печати символа его код передаётся в регистре.

У меня получилось 16 маш. слов + возврат, 2 регистра и 1 байт в стэке, 23 такта.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

У меня, примерно, так же. Под спойлером ещё то, о чем был разговор вчера.
Спойлер

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

; 30.01.2013
; 29.01.2013
	.INCLUDE "2313def.inc"

	.CSEG

RESET:
	LDI	R31,LOW(RAMEND)
	OUT	SPL,R31
	
	RJMP	LCD_OUT
;	RJMP	ADC_CONVERT
;*************************************************
; Прогон в студии для виртуальной опоры 3300 и 10 разрядного АЦП
; Прогон в студии для виртуальной опоры 3313 и 14 разрядного АЦП
; Прогон в студии для виртуальной опоры 3277 и 16 разрядного АЦП
ADC_CONVERT:
	LDS	R6,$60
	LDS	R7,$61
	LDS	R8,$62
	LDS	R9,$63		; занесение константы Ur*64(10р), Ur*4(14р), Ur*1(16р)

	LDS	R18,$70
	LDS	R19,$71		; занесение CODE

;************************************************
; Программа умножения 24 разрядного числа на 16 разрядное число
; R6...R9-MNOGIMOE,R18,R19-MNOGITEL,
; R26...R29-RESULT
; ZL(R30)-TEMP
;************************************************
MULT:
	CLR	ZH
	
	CLR	R26
	CLR	R27
	CLR	R28
	CLR	R29

	LDI	ZL,16		; установить счетчик сдвигов
OBRAT:
	LSR	R18
   	ROR	R19		; показать значение младшего разряда множителя в С,
	BRCC	NO_SUMMIR	; С=0 пропустить суммирование
SUMMIR:
				; С=1 суммировать значение множимого с частичным результатом
	ADD	R29,R9
	ADC	R28,R8
	ADC	R27,R7
	ADC	R26,R6
NO_SUMMIR:
	LSL	R9
	ROL	R8
	ROL	R7
	ROL	R6

	DEC	ZL
	BRNE	OBRAT

	LSL	R28
	ADC	R27,ZH
	ADC	R26,ZH	; результат Ux=CODE*Ur*64/65536

	RJMP	RESET
;**********************************************************************
	.equ	RS	=2
	.equ	EN	=1
; Данные в R20. R21-рабочий. Оба портятся
; 14 слов + возврат, 18 тактов
LCD_OUT:
	MOV	R21,R20
	SWAP	R21
	ANDI	R20,$F0
	ANDI	R21,$F0
	SBR	R20,$06	; добавляем RS+EN
	SBR	R21,$06
	OUT	PORTB,R20
	NOP
	NOP
	CBI	PORTB,EN
	
	OUT	PORTB,R21
	NOP
	NOP
	CBI	PORTB,EN

	RJMP	LCD_OUT
;END
Реклама
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Вот как то так

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

LCD_OUT:
   MOV   R21,R20
   SWAP   R21
   ANDI   R20,$F0
   SBR   R20,$06   ; добавляем RS+EN
   OUT   PORTB,R20
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
   ANDI   R21,$F0
   SBR   R21,$06
   CBI   PORTB,EN 
   OUT   PORTB,R21
Можно убрать и эти , но уже в контексте всей подпрограммы вывода
   NOP
   NOP
   CBI   PORTB,EN
   RJMP   LCD_OUT
;END
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Да, так лучше. Но есть, правда, момент нарушения временной диаграммы - одновременная подача RS и EN, хотя фронт EN должен быть задержан на 40нс

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

   SBR   R20,$06   ; добавляем RS+EN
Когда написал эту команду, внутренний голос стал нашептывать - "Фигню, паря, пишешь. Как к этому отнесутся hd44780 и ks0066 без проверки неясно..." Поэтому
Спойлер

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

	.equ	RS	=2
	.equ	EN	=1
; Данные в R20. R21-рабочий. Оба портятся
; 14 слов + возврат, 18 тактов
LCD_OUT:
   MOV   R21,R20
   SWAP   R21
   ANDI   R20,$F0
   SBR   R20,$04   ; добавляем RS
;   SBR   R20,$06   ; добавляем RS+EN
   OUT   PORTB,R20
   SBI   PORTB,EN   ; взводим EN
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
   ANDI   R21,$F0
   SBR   R21,$04   ; добавляем RS
;   SBR   R21,$06
   CBI   PORTB,EN   ; занесение старшей тетрады по спаду EN

   OUT   PORTB,R21
   SBI   PORTB,EN   ; взводим EN
;Можно убрать и эти , но уже в контексте всей подпрограммы вывода
   NOP
   NOP
   CBI   PORTB,EN   ; занесение младшей тетрады по спаду EN
   RJMP   LCD_OUT
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

Это всё хорошо когда всё сидит на одном порту. У меня RS и E раскиданы по остальным портам, так что к ним проще обращаться побитово.
А насчёт RS я вообще делаю 2 подпрограммы: одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода команд: устанавливает RS в 0, вызывает первую ПП, перед ret устанавливает RS обратно в 1.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Но есть, правда, момент нарушения временной диаграммы - одновременная подача RS и EN,
Начхать, я так же делаю и проблем нет.
одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода данных: устанавливает RS в 0,
Загадка- куда надо вставить слово command ? :)))
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

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

ILYAUL писал(а):Начхать, я так же делаю и проблем нет.
Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Загадка- куда надо вставить слово command ? :)))
:facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Ну да. Как в примере выше. Или выставлять только Е для команд. Только сначала RS и Е . потом данные.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Если эти два сигнала должны всегда идти с задержкой один относительно другого, то может снаружи поставить RC-цепочку на один, и в программе не извращаться?
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

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

Сообщение ILYAUL »

Да брось. Им вообще пофинг всё, главное чтобы на момент сброса Е эти сигналы "твёрдо" обозначали какие идут данные
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Всем МУР-мяфки. котейки, подскажите как замерить 2 АЦП на мега8. задача замерить 2 разных уровня. один уровень мерию. а вот как 2 не знаю.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Мерить уровни необходимо в один момент времени? Если не критично, то просто нужно переключать мультиплексор каналов АЦП в регистре ADMUX.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

мерить не в один момент. интервал между измерениями около минуты. но каналы должны быть разные. какие битики отвечают за номер канала АЦП?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

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

Сообщение zero648 »

Биты 2...0 регистра ADMUX
000 = ADC0
001 = ADC1
...
111 = ADC7
Но есть и другие режимы, нужно смотреть даташит на конкретный МК.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

спасибо. другие режимы не надо. пока хватит и этого.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
gauss
Держит паяльник хвостом
Сообщения: 920
Зарегистрирован: Сб янв 16, 2010 15:34:57
Откуда: Sevsk/Moscow

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

Сообщение gauss »

Решил написать такую программку для АЦП (МК - ATmega8):

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

.def temp=R16
.def del=R17
.cseg
.org 0
ldi temp,high(RamEnd)
out SPH,temp
ldi temp,low(RamEnd)
out SPL,temp
ldi temp,0b00100000
out ADMUX,temp
Loop: 
ldi temp,0b11000111
out ADCSRA,temp
in temp, ADCH
cpi temp, 192
brpl two
cpi temp, 128
brpl red
cpi temp, 64
brpl yellow
ldi temp,0
out PortB,temp
rcall delay
rjmp Loop
Delay:
ldi del,0
Loop1:
dec del
nop
nop
nop
brne Loop1
ldi temp,0b11000000
out ADCSRA,temp
ret
red:
ldi temp,0b00000001
out PortB,temp
rjmp Loop
yellow:
ldi temp,0b00000010
out PortB,temp
rjmp Loop
two:
ldi temp,0b00000011
out PortB,temp
rjmp Loop

Когда значение АЦП от 0 до 64, не горит не один светодиод. Когда от 64 до 127-желтый, от 128 до 191 - красный,
выше - оба.
Вопрос такой: почему светодиоды горят очень тускло, и почему при значении АЦП от 0 до 63 также горят оба светодиода?

П. С.:Насчет тусклости уже понял - забыл настроить порт на вывод.
:idea:
Ответить

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