Страница 175 из 400

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

Добавлено: Ср янв 30, 2013 08:55:24
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: до этого я как-то не допёр. Это из аппнота или откуда?

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

Добавлено: Ср янв 30, 2013 09:05:47
Kavka
Gudd-Head писал(а):Етить-колотить, модифицированная процедура деления занимает 17 слов!
Но работает-то быстее, чем 243 такта.
Gudd-Head писал(а):ОМГ :facepalm: до этого я как-то не допёр. Это из аппнота или откуда?
Ага, 201-ый.

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

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

Кстати, как допереть или где почитать про нетривиальные операции с двоичными числами? Вот например, смотрю я функцию деления и нифига не понимаю: что-то сдвигается, вычитается, иногда прибавляется, в из флагов Carry получается результат. Или та же процедура BCD...

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

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

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

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

Добавлено: Ср янв 30, 2013 10:12:39
Gudd-Head
Kavka писал(а):Генри Уоррен "Алгоритмические трюки для программистов" (Hackers Delight), например.
Ооо... почитаем :))

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

У меня получилось 16 маш. слов + возврат, 2 регистра и 1 байт в стэке, 23 такта.

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

Добавлено: Ср янв 30, 2013 13:45:12
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

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

Добавлено: Ср янв 30, 2013 20:39:42
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

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

Добавлено: Чт янв 31, 2013 07:41:42
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

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

Добавлено: Чт янв 31, 2013 08:47:41
Gudd-Head
Это всё хорошо когда всё сидит на одном порту. У меня RS и E раскиданы по остальным портам, так что к ним проще обращаться побитово.
А насчёт RS я вообще делаю 2 подпрограммы: одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода команд: устанавливает RS в 0, вызывает первую ПП, перед ret устанавливает RS обратно в 1.

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

Добавлено: Чт янв 31, 2013 09:12:27
ILYAUL
Но есть, правда, момент нарушения временной диаграммы - одновременная подача RS и EN,
Начхать, я так же делаю и проблем нет.
одна для вывода данных (RS в режиме ожидания всегда = 1), другая — для вывода данных: устанавливает RS в 0,
Загадка- куда надо вставить слово command ? :)))

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

Добавлено: Чт янв 31, 2013 09:16:28
Gudd-Head
ILYAUL писал(а):Начхать, я так же делаю и проблем нет.
Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Загадка- куда надо вставить слово command ? :)))
:facepalm:

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

Добавлено: Чт янв 31, 2013 09:20:59
ILYAUL
Не очень понял, как? Выставлять одновременно данные, RS и Е, а потом сбрасывать Е?
Ну да. Как в примере выше. Или выставлять только Е для команд. Только сначала RS и Е . потом данные.

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

Добавлено: Чт янв 31, 2013 09:47:27
Kavka
Если эти два сигнала должны всегда идти с задержкой один относительно другого, то может снаружи поставить RC-цепочку на один, и в программе не извращаться?

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

Добавлено: Чт янв 31, 2013 09:51:58
ILYAUL
Да брось. Им вообще пофинг всё, главное чтобы на момент сброса Е эти сигналы "твёрдо" обозначали какие идут данные

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

Добавлено: Чт янв 31, 2013 17:59:49
xkp
Всем МУР-мяфки. котейки, подскажите как замерить 2 АЦП на мега8. задача замерить 2 разных уровня. один уровень мерию. а вот как 2 не знаю.

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

Добавлено: Чт янв 31, 2013 19:29:33
zero648
Мерить уровни необходимо в один момент времени? Если не критично, то просто нужно переключать мультиплексор каналов АЦП в регистре ADMUX.

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

Добавлено: Чт янв 31, 2013 20:41:02
xkp
мерить не в один момент. интервал между измерениями около минуты. но каналы должны быть разные. какие битики отвечают за номер канала АЦП?

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

Добавлено: Чт янв 31, 2013 20:47:36
zero648
Биты 2...0 регистра ADMUX
000 = ADC0
001 = ADC1
...
111 = ADC7
Но есть и другие режимы, нужно смотреть даташит на конкретный МК.

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

Добавлено: Чт янв 31, 2013 21:31:21
xkp
спасибо. другие режимы не надо. пока хватит и этого.

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

Добавлено: Пн фев 04, 2013 18:05:06
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 также горят оба светодиода?

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