а набрать в гугле http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F кто мешает ?Serhio писал(а):Обьясните пожалуйста как вы получили 22ЕН. Никак не могу понять...
Ассемблер (ASM) для AVR в вопросах и ответах
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
проблема ИМХО в алгоритме, хотя можно сделать, как угодно ..... какова конечная цель? вывод температуры с дробной частью на индикатор?Skyer писал(а):Прилагаю код проекта: проблема между метками FracLoop2 и FracNext2....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, нужно выводить с точностью до десятых. Но нужно получать температуру с 12-битным расширением (с точностью до 1/10000) и потом вытаскивать первую цифру (как раз число тысяч). Я никак не могу понять почему код косячит, ведь алгоритм то в другом проекте работает как надо.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
дискретность преобразования ds18b20 - 1/16 градуса, а точность еще ниже (см. datasheet ), так что 1/10000 - из области фантастики. А все манипуляции с 1000 просто не нужны - разделите температуру на дробную и целую часть - при этом обработка станет проще и быстрее.Skyer писал(а):Но нужно получать температуру с 12-битным расширением (с точностью до 1/10000)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Извините, неправильно выразился, да там дискретность 0,0625. Я получаю отдельно целую часть и дробную. С целой проблем нет, а дробная как раз и не работает. Получив данные из LS я умножаю их на 0625 и получаю температуру с 4 знаками после запятой, вот нужно первую цифру вытащить. Посмотрите код если есть время, там все видно
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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 в вопросах и ответах
... пытаюсь объяснить, что все эти умножения не нужны при хранении дробной части отдельно.......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 раз.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подправил код:
To Jack_A, ваш код работает спасибо, но подобный вариант я уже пробовал. Проблема в том что при значении температуры XX.4 или XX.8 выдается значение на 0.1 больше действительного. В чем может быть проблема?
Код: Выделить всё
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,Temp1To Jack_A, ваш код работает спасибо, но подобный вариант я уже пробовал. Проблема в том что при значении температуры XX.4 или XX.8 выдается значение на 0.1 больше действительного. В чем может быть проблема?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Перечитал последние две страницы ветки - полностью согласен с 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.
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 в вопросах и ответах
... умножение на 4 (длина выводимой дробной части - 4 символа) нужно для правильного расчета смещения от начала таблицы и без него никак.....Jack_A писал(а):И никаких сдвигов аргумента не надо ( 2 раза rol temp убрать ....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Решил проблему. Косяк в протеусе, датчик выдает 15.5625 а на датчике 15.6. Поэтому показания плавали. Всем спасибо
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Skyer писал(а):Решил проблему. Косяк в протеусе, датчик выдает 15.5625 а на датчике 15.6. Поэтому показания плавали. Всем спасибо
Да, в общем-то никакого косяка там нет. Температура при симуляции выставляется с точностью 0,1 градус. Поскольку у датчика дискретность дробной части идет с шагом 0,0625 градуса, то в Scratchpad устанавливается значение, которое при округлении дает то, что вы выставляете в симуляторе. Округлите 15.5625 с точностью до 1 десятой (шаг симулятора) и получите 15.6
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Дык щас я так и делаю
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ChipKiller писал(а):... умножение на 4 (длина выводимой дробной части - 4 символа) нужно для правильного расчета смещения от начала таблицы и без него никак.....Jack_A писал(а):И никаких сдвигов аргумента не надо ( 2 раза rol temp убрать ....
Вы сами себе противоречите. Поскольку тут уже все пришли к консексусу
Или я чего-то не догоняю, и мы собираеися, под дружное ржанье понимающей публики, все-таки выводить 41.8125 гр. ?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:
В Temp3 хранится дробная часть. Такой вопрос а обязательны ли кавычки в таблице? Может потом нужно вычитать 30 чтоб перевести из ASCII в число?
Код: Выделить всё
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 в число?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Jack_A писал(а):... выводить на табло, к примеру, 32.5625 гр. - это, мягко говоря, идиотизм...
Или я чего-то не догоняю, и мы собираеися, под дружное ржанье понимающей публики, все-таки выводить 41.8125 гр. ?
Абсолютно согласен
Skyer писал(а):ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:Код: Выделить всё
TempTable:
.db '0','0','0','0'
.db '0','6','2','5'
...
.db '9','3','7','5'
Мне кажется я уже начинаю улыбаться...
Опыт и мудрость приходят с годами... К некоторым годы приходят одни...
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
... метод этот не мой и называется табличное преобразование. Преимущество - простота и скорость, недостаток - иногда ест чуть больше Flash. Теперь на счет иероглифов - в Вашей программе определение выводимых символов описано так:Skyer писал(а):ChipKiller, к сожалению только щас понял простоту и гениальность вашего метода. Но натыкаюсь на иероглифы при выводе. Вот код:
Код: Выделить всё
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 уменьшится вдвое
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Chipkiller, насчет метода, в программировании всегда так: либо программа требует памяти и работает быстро, либо экономит память и жрет процессор.
Поэтому после написания своего варианта, задумался как сделать это быстрее.
Что касаемо иероглифов, причем тут DcMatrix? Это матрица для преобразования в код 7-сегментного индикатора. Я планировал из TempTable вытаскивать цифры, округлять и потом выводить результат на индикацию.
P.S. Макросы пока не использую, в будущем пока. А что с equ? Сам стараюсь их использовать, так как это удобнее.
Что касаемо иероглифов, причем тут DcMatrix? Это матрица для преобразования в код 7-сегментного индикатора. Я планировал из TempTable вытаскивать цифры, округлять и потом выводить результат на индикацию.
P.S. Макросы пока не использую, в будущем пока. А что с equ? Сам стараюсь их использовать, так как это удобнее.
- ChipKiller
- Сверлит текстолит когтями
- Сообщения: 1163
- Зарегистрирован: Ср янв 05, 2011 16:25:15
Re: Ассемблер (ASM) для AVR в вопросах и ответах
... при том, что процедуру Display нужно переписать, а из TempTable нужно вытаскивать не цифры, а символы, иначе все "прелести табличного преобразования" теряют смысл....Skyer писал(а):Что касаемо иероглифов, причем тут DcMatrix? Это матрица для преобразования в код 7-сегментного индикатора. Я планировал из TempTable вытаскивать цифры, округлять и потом выводить результат на индикацию.
... тогда вместоSkyer писал(а):А что с equ? Сам стараюсь их использовать, так как это удобнее.
Код: Выделить всё
DcMatrix:
; hgfedcba hgfedcba
.db 0b00111111,0b00000110 ;0,1Код: Выделить всё
DcMatrix: .db ch_0,ch_1... Код: Выделить всё
ch_0 .equ 0b00111111
......-
Serhio
- Прорезались зубы
- Сообщения: 249
- Зарегистрирован: Вс авг 15, 2010 20:42:44
- Откуда: Тюмень
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Подскажите пожалуйста: SETB P1.3; (P1)=27H; (PC)=127H
Команда производит запись 1 в бит. Какая используется адресация для операнда-источника и операнда-приемника? и что чему будет равно?
Команда производит запись 1 в бит. Какая используется адресация для операнда-источника и операнда-приемника? и что чему будет равно?


