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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Serhio писал(а):Обьясните пожалуйста как вы получили 22ЕН. Никак не могу понять...
а набрать в гугле http://ru.wikipedia.org/wiki/%D0%A1%D0% ... 0%B8%D1%8F кто мешает ?
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Skyer писал(а):Прилагаю код проекта: проблема между метками FracLoop2 и FracNext2....
проблема ИМХО в алгоритме, хотя можно сделать, как угодно ..... какова конечная цель? вывод температуры с дробной частью на индикатор?
Реклама
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Да, нужно выводить с точностью до десятых. Но нужно получать температуру с 12-битным расширением (с точностью до 1/10000) и потом вытаскивать первую цифру (как раз число тысяч). Я никак не могу понять почему код косячит, ведь алгоритм то в другом проекте работает как надо.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Skyer писал(а):Но нужно получать температуру с 12-битным расширением (с точностью до 1/10000)
дискретность преобразования ds18b20 - 1/16 градуса, а точность еще ниже (см. datasheet ), так что 1/10000 - из области фантастики. А все манипуляции с 1000 просто не нужны - разделите температуру на дробную и целую часть - при этом обработка станет проще и быстрее.
Реклама
Эиком - электронные компоненты и радиодетали
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Извините, неправильно выразился, да там дискретность 0,0625. Я получаю отдельно целую часть и дробную. С целой проблем нет, а дробная как раз и не работает. Получив данные из LS я умножаю их на 0625 и получаю температуру с 4 знаками после запятой, вот нужно первую цифру вытащить. Посмотрите код если есть время, там все видно
Реклама
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Skyer писал(а):Помогите пожалста.
Лень не позволяет мне ковыряться в чужих кодах, а нормальная суба приблизительно вот такая :

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

 ; R25,R24 / 1000, остаток
 ; там же, частное в R0.
DivT:	push	r16
	push	r17
	sub	r0,r0
	ldi	r17,high(1000)
	ldi	r16,low(1000)
_10T3:	sub	r24,r16
	sbc	r25,r17
	brcs	_10T5
	inc	r0
	rjmp	_10T3
_10T5:	add	r24,r16  ; ***
	adc	r25,r17  ; ***
	pop	r17
	pop	r16
	ret
Если остаток не важен, строчки со звездочками можно пропустить. А если не пропускать, то R25,R24 можно пропустить еще через п/п DivD и получить оставшиенся 3 цифры результата преобразования двоичного числа в 2-10
Реклама
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Skyer писал(а):Получив данные из LS я умножаю их на 0625 и получаю температуру с 4 знаками после запятой....
... пытаюсь объяснить, что все эти умножения не нужны при хранении дробной части отдельно.......

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

; таблица дробной части (12-битное преобразование)
table: .db '0','0','0',0'
         .db '0','6','2',5'
         .db '1','2','5','0'
 ....... 
         .db '9','3','7',5' ; всего 16 строк по 4 символа
...............
...............
; дробная часть в temp - диапазон 0b0000...0b1111
        ldi ZL,low(table*2)   
        ldi ZH,high(table*2) 
        rol temp
        rol temp ; temp=temp*4
        add ZL,temp
        clr   temp
        adc ZH,temp
        ; четыре команды LPM с инкрементом Z вытянут дробную часть из таблицы
        ..................
Последний раз редактировалось ChipKiller Пн май 02, 2011 13:39:38, всего редактировалось 1 раз.
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Подправил код:

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

	MOV		XL,Temp2
	MOV		XH,Temp1

	LDI     YL,LOW(1000)
    LDI     YH,HIGH(1000)
    CLR     Temp1
    CLR     Temp3
FracLoop2:
	SUB    	XL,YL
    SBC    	XH,YH
	 
;	CP     	XL,Temp3
;   CPC    	XH,Temp3

    BRMI   	FracNext2
    INC    	Temp1
    JMP    	FracLoop2          
FracNext2:

	CPI 	Temp1,0
	BREQ 	Fnext
	LDI 	Temp3,10
	SUB 	Temp3,Temp1
	MOV 	Temp1,Temp3
Fnext:
	STS  	TempDigit,Temp1
To Jack_A, ваш код работает спасибо, но подобный вариант я уже пробовал. Проблема в том что при значении температуры XX.4 или XX.8 выдается значение на 0.1 больше действительного. В чем может быть проблема?
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Перечитал последние две страницы ветки - полностью согласен с ChipKiller, никакие умножения-делиния тут совсем не нужны. А поскольку, опять же согласен с ChipKiller,
1/10000 градуса - это ненаучная фантастика, то десятые доли градуса
для значений дробной части 0000...1111 будут 0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 соответственно (с округлением в ближайшую сторону). И никаких сдвигов аргумента не надо ( 2 раза rol temp убрать ) А что иногда двум соседним значениям аргумента соответствуют одинаковые цифры - а как же может быть иначе, ведь вариантов аргумента 16 ( 0000...1111), а десятичных цифр всего 10.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Jack_A писал(а):И никаких сдвигов аргумента не надо ( 2 раза rol temp убрать ....
... умножение на 4 (длина выводимой дробной части - 4 символа) нужно для правильного расчета смещения от начала таблицы и без него никак.....
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Решил проблему. Косяк в протеусе, датчик выдает 15.5625 а на датчике 15.6. Поэтому показания плавали. Всем спасибо
Аватара пользователя
VirZh
Встал на лапы
Сообщения: 86
Зарегистрирован: Вс фев 27, 2011 01:01:11
Откуда: Республика Крым

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

Сообщение VirZh »

Skyer писал(а):Решил проблему. Косяк в протеусе, датчик выдает 15.5625 а на датчике 15.6. Поэтому показания плавали. Всем спасибо
Да, в общем-то никакого косяка там нет. Температура при симуляции выставляется с точностью 0,1 градус. Поскольку у датчика дискретность дробной части идет с шагом 0,0625 градуса, то в Scratchpad устанавливается значение, которое при округлении дает то, что вы выставляете в симуляторе. Округлите 15.5625 с точностью до 1 десятой (шаг симулятора) и получите 15.6 :)
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Дык щас я так и делаю
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

ChipKiller писал(а):
Jack_A писал(а):И никаких сдвигов аргумента не надо ( 2 раза rol temp убрать ....
... умножение на 4 (длина выводимой дробной части - 4 символа) нужно для правильного расчета смещения от начала таблицы и без него никак.....
Вы сами себе противоречите. Поскольку тут уже все пришли к консексусу :) , что выводить на табло, к примеру, 32.5625 гр. - это, мягко говоря, идиотизм, выводить будем после точки одну цифру - десятые доли градуса с округлением в ближайшую сторону. Для 16 возможных значений дробной части 0000...1111 возможны только 10 значений цифры после точки, как я и привел постом выше, а эта таблица и занимет ровно 16 байт с учетом того, что некоторые соседние цифры одни и те же. В этой таблице уже учтен и пересчет, и округление.
Или я чего-то не догоняю, и мы собираеися, под дружное ржанье понимающей публики, все-таки выводить 41.8125 гр. ?
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:

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

TempTable: 
		.db '0','0','0','0'
		.db '0','6','2','5'
		.db '1','2','5','0'
		.db '1','8','7','5'
		.db '2','5','0','0'
		.db '3','1','2','5'
		.db '3','7','5','0'
		.db '4','3','7','5'
		.db '5','0','0','0'
		.db '5','6','2','5'
		.db '6','2','5','0'
		.db '6','8','7','5'
		.db '7','5','0','0'
		.db '8','1','2','5'
		.db '8','7','5','0'
		.db '9','3','7','5'


	LDI 	ZL,LOW(TempTable*2)   
	LDI 	ZH,HIGH(TempTable*2)
	ROL 	Temp3
	ROL 	Temp3 ; temp=temp*4
	ADD 	ZL,Temp3
	CLR   	Temp3
	ADC 	ZH,Temp3

	LPM		Temp1,Z+		
;   LPM		Temp1,Z+    
;	LPM		Temp1,Z+    	
;	LPM		Temp1,Z+  
	
;	subi temp1,30  
	
;	CPI 	Temp2,5
;	BRLO 	FracNext4
;	INC 	Temp1
Next:
	STS  	TempDigit,Temp1
В Temp3 хранится дробная часть. Такой вопрос а обязательны ли кавычки в таблице? Может потом нужно вычитать 30 чтоб перевести из ASCII в число?
Аватара пользователя
VirZh
Встал на лапы
Сообщения: 86
Зарегистрирован: Вс фев 27, 2011 01:01:11
Откуда: Республика Крым

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

Сообщение VirZh »

Jack_A писал(а):... выводить на табло, к примеру, 32.5625 гр. - это, мягко говоря, идиотизм...
Или я чего-то не догоняю, и мы собираеися, под дружное ржанье понимающей публики, все-таки выводить 41.8125 гр. ?
Абсолютно согласен
Skyer писал(а):ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:

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

TempTable: 
		.db '0','0','0','0'
		.db '0','6','2','5'
...
		.db '9','3','7','5'
:shock:

Мне кажется я уже начинаю улыбаться... :))) :)))
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Skyer писал(а):ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:
... метод этот не мой и называется табличное преобразование. Преимущество - простота и скорость, недостаток - иногда ест чуть больше Flash. Теперь на счет иероглифов - в Вашей программе определение выводимых символов описано так:

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

DcMatrix:
		; hgfedcba   hgfedcba
	.db 0b00111111,0b00000110	;0,1
	.db 0b01011011,0b01001111	;2,3
	.db 0b01100110,0b01101101	;4,5
	.db 0b01111101,0b00000111	;6,7
	.db 0b01111111,0b01101111	;8,9
поэтому

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

TempTable:
      .db '0','0','0','0'
      .db '0','6','2','5'
...............
нужно описать так

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

TempTable: .db 0b00111111,0b00111111,0b00111111,0b00111111
           .db 0b00111111,0b01111101,0b01011011,0b01101101
.................
PS. очень рекомендую чаще использовать определения через .egu и макросы, читать и изменять такую программу всегда проще... Когда "наиграетесь с супер точностью" сделайте величину дробной части 2-х символьной - вполне хватит и размер таблицы TempTable уменьшится вдвое :)
Skyer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт фев 18, 2011 20:37:34

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

Сообщение Skyer »

Chipkiller, насчет метода, в программировании всегда так: либо программа требует памяти и работает быстро, либо экономит память и жрет процессор. :)) Поэтому после написания своего варианта, задумался как сделать это быстрее.

Что касаемо иероглифов, причем тут DcMatrix? Это матрица для преобразования в код 7-сегментного индикатора. Я планировал из TempTable вытаскивать цифры, округлять и потом выводить результат на индикацию.

P.S. Макросы пока не использую, в будущем пока. А что с equ? Сам стараюсь их использовать, так как это удобнее.
Аватара пользователя
ChipKiller
Сверлит текстолит когтями
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

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

Сообщение ChipKiller »

Skyer писал(а):Что касаемо иероглифов, причем тут DcMatrix? Это матрица для преобразования в код 7-сегментного индикатора. Я планировал из TempTable вытаскивать цифры, округлять и потом выводить результат на индикацию.
... при том, что процедуру Display нужно переписать, а из TempTable нужно вытаскивать не цифры, а символы, иначе все "прелести табличного преобразования" теряют смысл....
Skyer писал(а):А что с equ? Сам стараюсь их использовать, так как это удобнее.
... тогда вместо

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

DcMatrix:
      ; hgfedcba   hgfedcba
   .db 0b00111111,0b00000110   ;0,1
пишут что-то вроде

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

DcMatrix: .db ch_0,ch_1... 
а в *.inc-файле определяют

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

ch_0 .equ 0b00111111
......
... и так далее.......
Serhio
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень
Контактная информация:

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

Сообщение Serhio »

Подскажите пожалуйста: SETB P1.3; (P1)=27H; (PC)=127H
Команда производит запись 1 в бит. Какая используется адресация для операнда-источника и операнда-приемника? и что чему будет равно?
Ответить

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