IN resL, ADCL ; Ecia?aiiia iai?y?aiea IN resH, ADCH reti ;*************************************************************************** Initial: ldi Temp1, LOW(RamEnd) out SPL, Temp1 ldi Temp1, HIGH(RamEnd) out SPH, Temp1
cli
ldi temp1,0b11111111 out DDRB,temp1 ;Iai?aaeaiea aaiiuo ii?oa B ia auaia,(LCD-aenieae) ; out PORTB,temp1 ;Auaaou aaiiua ia ii?o A
;---------- ; Input : XH:XL - number of CPU cycles to wait (divided by four) ;---------- Wait4xCycles: sbiw XH:XL, 1 brne Wait4xCycles ret ;---------- ; Input : r16 - number of miliseconds to wait ;---------- WaitMiliseconds: LDI XH,HIGH(1000*F_CPU/4/1000000) LDI XL,LOW(1000*F_CPU/4/1000000) WaitMsLoop: SBIW XH:XL,1 BRNE WaitMsLoop dec r16 brne WaitMiliseconds ret ;***** Subroutine Register Variables
div8u: sub drem8u,drem8u ; clear remainder and carry ldi dcnt8u,9 ; init loop counter d8u_1: rol dd8u ; shift left dividend dec dcnt8u ; decrement counter brne d8u_2 ; if done ret ; return d8u_2: rol drem8u ; shift dividend into remainder sub drem8u,dv8u ; remainder = remainder - divisor brcc d8u_3 ; if result negative add drem8u,dv8u ; restore remainder clc ; clear carry to be shifted into result rjmp d8u_1 ; else d8u_3: sec ; set carry to be shifted into result rjmp d8u_1
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
При включенном бите ADLAR и при максимуме (5 вольт) на входе значение ацп будет не 1023, а 65472, значит чтобы преобразовать значение ацп в вольты нужно 65472 поделить на 500 получим 130,9 =~131, точку просто потом выводим после старшего разряда на LCD. 131 это и будет наш коэффициент.
пример деления
Код:
; ---------- ; Деление слова на байт //////////////////////////////////////////////////////// ; ---------- ; --> R_TmpA1, R_TmpA2 -- делимое мл. и ст. байты ; R_Dat -- делитель ; <-- R_TmpA1, R_TmpA2 -- частное мл. и ст. байты ; R_OprA -- остаток ; Меняет: R_TmpA1, R_TmpA2, R_OprA, XL S_Div_WordByte: ldi XL, 17 ; Количество разрядов + бит C clr R_OprA ; Остаток clc S_Div_WordByte_Loop: rol R_OprA subR_OprA, R_Dat; Остаток минус делитель brcc S_Div_WordByte_1 add R_OprA, R_Dat S_Div_WordByte_1: rol R_TmpA1 rol R_TmpA2 dec XL brne S_Div_WordByte_Loop com R_TmpA1 com R_TmpA2 ret
Можно ничего с ним не делать, а можно заморочится с округлением. Берем половину коэффициента и отнимаем от остатка, если включился флаг переноса, значит округляем в меньшую сторону, т.е. ничего не делаем, а если перенос не включился, значит округляем в большую сторону - добавляем 1 к результату.
В подпрограмме деления перед RET вставьте этот кусок кода:
Все может быть, только программа не моя, а из тырнета. Я пользовался похожим кодом, но только для чисел с большей разрядностью, и там было неправильное деление чисел со знаком, хотя деление безнаковое.
Сейчас этот форум просматривают: miguell и гости: 22
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения