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

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

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

Сообщение ChipKiller »

Serhio писал(а):Обьясните пожалуйста как вы получили 22ЕН. Никак не могу понять...
а набрать в гугле 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 кто мешает ?
Реклама
Аватара пользователя
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
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 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
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 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
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 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»