Atmega48 ассемблер.
- Сообщения: 11
- Зарегистрирован: Пт июл 18, 2014 23:02:53
Всем привет. Нужна помощь - вытащить несколько функций из хекса для атмеги48. Может кто-то помочь за вознаграждение?
- Реклама
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
Лучше всего будет пояснить, что за функции вам нужны. Хекс не всегда полезен.
- Сообщения: 11
- Зарегистрирован: Пт июл 18, 2014 23:02:53
А не проще ли написать свою математику, нежели заниматься дизассемблированием и догадываться о ходе мысли автора?
Что именно за математика ?
Реализация какого то известного алгоритма или какие то проприетарные вычисления ?
Что именно за математика ?
Реализация какого то известного алгоритма или какие то проприетарные вычисления ?
- Сообщения: 11
- Зарегистрирован: Пт июл 18, 2014 23:02:53
- Реклама
сумму вознаграждения озвучьте.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Напишите подробности мне в личку и приложите хекс.
Docendo discimus
- Сообщения: 11
- Зарегистрирован: Пт июл 18, 2014 23:02:53
[uquote="BOB51",url="/forum/viewtopic.php?p=3578791#p3578791"]metcal
А просто прогнать в дебаггере авр студии сапсем влом?
[/uquote]
Я с атмелом последний раз лет 12 назад работал. Разбираться с студией времени нет, да и асм плохо знаю.
А просто прогнать в дебаггере авр студии сапсем влом?
Я с атмелом последний раз лет 12 назад работал. Разбираться с студией времени нет, да и асм плохо знаю.
- Сообщения: 11
- Зарегистрирован: Пт июл 18, 2014 23:02:53
- Сообщения: 17
- Зарегистрирован: Сб фев 25, 2017 07:26:17
Понимаю что не в тему но в лом искать подходящую, что-то они все закрытые.
Видно АВР совсем не в моде нынче..
Надо стало быстрое деление константы 32767 на переменную 16 бит.
Придумал вот такую делилку.
Она проста, понятна, легко может быть приспособлена под любую разрядность
Для сравнения, делилка 16\16 из АВР аппноты тратит 260 тактов
DivU_TempHL_BT: ; TempH:L делимое (потом здесь будет удвоенный остаток)-
ldi Cnt, 1 ; -Buff:Temp делитель, R1:R0 округленный результат
mov One, Cnt
clr R1 clr R0
mov R2, One ; начальное значение маски для записи единиц в результат-
clr R3 clr Zero ; -она же будет счетчиком в цикле деления
cpi Temp, 128
cpc Buff, Zero
brsh shl
cpi Temp, 32 ; чтоб не повиснуть при делении на 0 :
cpc Buff, Zero
brsh swdv
ldi Temp, 32
swdv:
mov Buff, Temp ; для ускорения работы, если делитель <128-
clr Temp ; -можно сдвинуть делитель влево сразу на 8 бит
mov R3, One ; -и маску тоже
clr R2
shl:
sbrc Buff, 6
rjmp dv
lsl Temp rol Buff ; сделать делитель близким к делимому
lsl R2 rol R3 ; при этом приготовить маску
rjmp shl
dv:
cp Temp_L, Temp ; в цикле, сравнить делимое и делитель
cpc Temp_H, Buff
brlo shr
sub Temp_L, Temp ; если можно то вычесть
sbc Temp_H, Buff
or R1, R3 ; и маской внести единицу в результат
or R0, R2
shr:
lsr R3 ror R2 ; в любом случае, сдвинуть 1 в маске вправо
brcs edv ; (пока она совсем не обнулится, тогда выйти из цикла)
lsr Buff ror Temp ; и сдвинуть вправо делитель
rjmp dv
edv:
lsl Temp_L rol Temp_H ; удвоить остаток
cp Temp, Temp_L ; сравнить его с делителем
cpc Buff, Temp_H
adc R0, Zero ; округлить
adc R1, Zero
ret ; 185 тактов макс. время, мин. время 31 тактов
Видно АВР совсем не в моде нынче..
Надо стало быстрое деление константы 32767 на переменную 16 бит.
Придумал вот такую делилку.
Она проста, понятна, легко может быть приспособлена под любую разрядность
Для сравнения, делилка 16\16 из АВР аппноты тратит 260 тактов
DivU_TempHL_BT: ; TempH:L делимое (потом здесь будет удвоенный остаток)-
ldi Cnt, 1 ; -Buff:Temp делитель, R1:R0 округленный результат
mov One, Cnt
clr R1 clr R0
mov R2, One ; начальное значение маски для записи единиц в результат-
clr R3 clr Zero ; -она же будет счетчиком в цикле деления
cpi Temp, 128
cpc Buff, Zero
brsh shl
cpi Temp, 32 ; чтоб не повиснуть при делении на 0 :
cpc Buff, Zero
brsh swdv
ldi Temp, 32
swdv:
mov Buff, Temp ; для ускорения работы, если делитель <128-
clr Temp ; -можно сдвинуть делитель влево сразу на 8 бит
mov R3, One ; -и маску тоже
clr R2
shl:
sbrc Buff, 6
rjmp dv
lsl Temp rol Buff ; сделать делитель близким к делимому
lsl R2 rol R3 ; при этом приготовить маску
rjmp shl
dv:
cp Temp_L, Temp ; в цикле, сравнить делимое и делитель
cpc Temp_H, Buff
brlo shr
sub Temp_L, Temp ; если можно то вычесть
sbc Temp_H, Buff
or R1, R3 ; и маской внести единицу в результат
or R0, R2
shr:
lsr R3 ror R2 ; в любом случае, сдвинуть 1 в маске вправо
brcs edv ; (пока она совсем не обнулится, тогда выйти из цикла)
lsr Buff ror Temp ; и сдвинуть вправо делитель
rjmp dv
edv:
lsl Temp_L rol Temp_H ; удвоить остаток
cp Temp, Temp_L ; сравнить его с делителем
cpc Buff, Temp_H
adc R0, Zero ; округлить
adc R1, Zero
ret ; 185 тактов макс. время, мин. время 31 тактов
по округлению:
при равенстве делителя и удвоенного остатка у тебя не будет округления (добавки 1 к целой части).
а положено 0,5 округлять до 1.
при равенстве делителя и удвоенного остатка у тебя не будет округления (добавки 1 к целой части).
а положено 0,5 округлять до 1.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
- Сообщения: 17
- Зарегистрирован: Сб фев 25, 2017 07:26:17
обычно делается так:
сравнивается удвоенный остаток с делителем - если меньше, то 1 не прибавляется.
либо (больше или равно) - то прибавляется.
сравнивается удвоенный остаток с делителем - если меньше, то 1 не прибавляется.
либо (больше или равно) - то прибавляется.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.





