Измерить ширину и период импульса на asm

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

подскажите как число записанное в регистре разложить на десятичные разряды.
к примеру
R16 = 0b10001000 ; 136
надо разложить на
r17 = 0b00000001 ; 1
r18 = 0b00000011 ; 3
r19 = 0b00001100 ; 6
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Такая вот простая комбинация:
Вход: R16; Выход:R17,R18,R19

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

sign_100:   ldi     r21,100
            clr     r20               ;Count result
div_100:    mov     r0,r16            ;Division 100's
            sub     r0,r21
            brcs    ok_100
            inc     r20
            mov     r16,r0
            rjmp    div_100           ; Go again
ok_100:     mov     r17,r20           ; Store result

sign_10:    ldi     r21,10
            clr     r20               ;Count result
div_10:     mov     r0,r16            ;Division 10's
            sub     r0,r21
            brcs    ok_10
            inc     r20
            mov     r16,r0
            rjmp    div_10            ; Go again
ok_10:      mov     r18,r20           ; Store result

ok_1:       mov     r19,r16           ; Store result
Реклама
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

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

Сообщение Jack_A »

И как умудрился 4 десятичных разряда втиснуть в один байт ?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

из 16 разрядного таймера, я хочу вывести на семисегментник миллисекунды
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Вот, 16 бит в десятичное:
Вход: r17:r16, выход: r25,r24,r23,r22,r21

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

sign_10000: ldi     r18,$10
            ldi     r19,$27
            clr     r20               ;Count result
div_10000:  movw    r0,r16            ;Division 10000's
            sub     r0,r18
            sbc     r1,r19
            brcs    ok_10000
            inc     r20
            movw    r16,r0
            rjmp    div_10000         ; Go again
ok_10000:   mov     r25,r20           ; Store result

sign_1000:  ldi     r18,$e8
            ldi     r19,$03
            clr     r20               ;Count result
div_1000:   movw    r0,r16            ;Division 1000's
            sub     r0,r18
            sbc     r1,r19
            brcs    ok_1000
            inc     r20
            movw    r16,r0
            rjmp    div_1000          ; Go again
ok_1000:    mov     r24,r20           ; Store result

sign_100:   ldi     r18,$64
            ldi     r19,$00
            clr     r20               ;Count result
div_100:    movw    r0,r16            ;Division 100's
            sub     r0,r18
            sbc     r1,r19
            brcs    ok_100
            inc     r20
            movw    r16,r0
            rjmp    div_100           ; Go again
ok_100:     mov     r23,r20           ; Store result

sign_10:    ldi     r18,$0a
            clr     r20               ;Count result
div_10:     mov     r0,r16            ;Division 10's
            sub     r0,r18
            brcs    ok_10
            inc     r20
            mov     r16,r0
            rjmp    div_10            ; Go again
ok_10:      mov     r22,r20           ; Store result

ok_1:       mov     r21,r16           ; Store result


Реклама
Родился
Сообщения: 13
Зарегистрирован: Вт фев 03, 2009 19:12:26

Сообщение spartanec »

Понял ошибку, считывал не в правильной последовательности старший и младший регистр таймера.
Ответить

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