Более громоздкая задача — преобразование многоразрядных чисел. Преобразовывать BCD-числа, состоящие более чем из одного байта, обратно в НЕХ-формат приходится крайне редко, зато задача прямого преобразования возникает на каждом шагу. Я здесь приведу отсутствующую в «аппноте» 204 процедуру конвертации чисел, выходящих за рамки 16-разрядного диапазона. Например, такая задача может возникнуть при конструировании многоразрядных счетчиков. Ограничимся диапазоном в 7 десятичных знаков (9 999 999), тогда исходное число будет укладываться в 3 байта (24 разряда). В целях универсальности в процедуре, которая приводится далее в листинге 15.5, на выходе получается отдельно неупакованный (сразу для индикации) и упакованный десятичный формат. Сократить число необходимых регистров можно, если большую часть результатов сразу записывать в SRAM — в дальнейшем мы так и будем поступать, а здесь для наглядности работаем только с регистрами.

Отметим, что процедура bin2BCD24 сделана на основе «фирменной» bin2BCD16 и, как и последняя, использует хитрый прием с записью значений в регистры по адресам памяти: так можно производить над адресами разные манипуляции, меняя регистры (аналогично адресной арифметике в языке С). Как и в других случаях, сохранена часть оригинальных комментариев из исходной «фирменной» процедуры.

Листинг 15.5

;процедура преобразования 3-байтового hex в упакованный (4 регистра)

;и неупакованный (7 регистров) BCD

;исходное значение в регистрах

.def Count0 = r25

.def Count1 = r26

.def Count2 = r27

;на выходе упакованный BCD в регистрах

.def tBCD0 =r13  ;BCD value digits 1 and 0

.def tBCD1 =r14  ;BCD value digits 3 and 2

.def tBCD2 =r15  ;BCD value digit 4,5

.def tBCD3 =r16  ;BCD value digit 6

; на выходе неупакованный BCD в регистрах

.def N1 =r1  ;младший

.def N2 =r2

.def N3 =r3

.def N4 =r4

.def N5 =r5

.def N6 =r6

.def N7 =r7  ;старший

;вспомогательные регистры

.def cnt16a =r18  ;счетчик цикла

.def tmp16a =r19  ;временное значение

;адреса регистров в памяти

.equ AtBCD0 =13  ;address of tBCD0

.equ AtBCD3 =16  ;address of tBCD3

bin2BCD24:

         ldi cnt16a,24  ;Init loop counter clr tBCD3

         clr tBCD2  ;clear result (4 bytes)

         clr tBCD1

         clr tBCD0

         clr ZH  ;clear ZH (not needed for AT90Sxx0x)

bBCDx_1: lsl Count0  ;shift input value

         rol Count1  ;through all bytes

         rol Count2  ;through all bytes

         rol tBCD0

         rol tBCD1

         rol tBCD2

         rol tBCD3

         dec cnt16a  ;decrement loop counter

         brne bBCDx_2 ;if counter not zero

;распаковка

         ldi temp,0b00001111

         mov N1,tBCD0

         and N1,temp

         mov N2,tBCD0

         swap N2

         and N2,temp

         mov N3,tBCD1

         and N3,temp

         mov N4,tBCD1

         swap N4

         and N4,temp

         mov N5,tBCD2

         and N5,temp

         mov N6,tBCD2

         swap N6

         and N6,temp

         mov N7,tBCD3

         ret; return

bBCDx_2:ldi r30;AtBCD3+1  ;Z points to result MSB + 1

bBCDx_3:

          ld tmp16a, — Z  ;get (Z) with pre-decrement

          subi tmp16a, — $03  ;add 0x03

          sbrc tmp16a,3  ;if bit 3 not clear

          st Z,tmp16a  ;store back

          ld tmp16a,Z  ;get (Z)

          subi tmp16a, — $30  ;add 0x30

          sbrc tmp16a,7  ;if bit 7 not clear

          st Z,tmp16a  ;store back

          cpi ZL,AtBCD0  ;done all three?

          brne bBCDx_3  ;loop again if not

          rjmp bBCDx_1

Использование встроенного АЦП

Встроенный АЦП последовательного приближения входит в состав почти всех МК семейства Mega и большинства МК семейства Tuny, кроме простейших младших моделей. В семействе Classic был только один тип МК со встроенным АЦП — AT90S8535 — несколько доработанный вариант популярного AT90S8515. На примере его Mega-версии под названием ATmega8535 мы в дальнейшем и разберем работу встроенного АЦП, но сначала стоит сделать несколько общих замечаний.

Перейти на страницу:

Поиск

Похожие книги