Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 8. Арифметические операции и операции в двоично-десятичном формате 213 А пр в и о м т е р о , д но из решений обратной задачи - преобразования упакованного BCD (на тех же значений часов, минут и секунд из RTC) в НЕХ-число, после чего с ним можно производить арифметические действия (листинг 8 . 1 3) . По сравнению с «фирменной» BCD2ЬinB эта процедура хоть и немного длиннее, но понятнее и бо лее предсказуема по времени выполнения («фирменнаю> может занимать от 3 до 48 тактов, наша - всегда 1 О тактов). ; на входе в temp упакованное ВСD-значение ; на выходе в temp hех-значение ; templ - вспомогательный регистр ; действительна только для семейства Mega bcd2Ьin8 : ldi mult l O , 1 0 ; если mult l O из числа регистров r0-r15 , то заменяется на пару ; ldi templ , 1 0 ; mov multl О , templ mov templ , temp andi temp , OЫl l l O O O O ; вьщеляем старший swap temp ; старший в младшей тетраде mul temp , mult l O ;умножаем на 1 0 , в rO резуль тат умножения mov temp , templ ; возвращаемся к исходному andi temp, ObO O O O l l l l ; вьщеляем младший add temp , rO ; получили hex ret Решение задачи преобразования в ВСD-формат 8-разрядного числа в общем случае (т. е. для чисел от О до 255) существенно сложнее, т. к. результат может иметь три д н е а с , ятичных разряда. Заметим, что такая процедура в «аппноте» 204 не представле но ее несложно составить самостоятельно. Можно сначала выполнить один раз деление на 1 О (по штатной процедуре divBu ное из «аппноть1» АVR200), получив част и остаток. Частное представляет старшие два десятичных разряда, оно будет укладываться в диапазон 0-99 и преобразовывается далее с помощью приведенной процедуры, а остаток - младший, он и так будет заведомо в диапазоне от О до 9 . При необходимости выполнить арифметические действия с ВСD-числом, проще е н г и о ч е п н р и е е о бразовать в обычное двоичное, выполнить действие (не забывая про огра сверху величиной 99 для одного байта), а затем преобразовать обратно. В «аппноте» АVR204 приведены процедуры сложения и вычитания 1 6-разрядных чисел с двоично-десятичной коррекцией, но они ничем не лучше такой очевидной последовательности действий. Для вывода чисел через UART, когда текст и числа идут вперемешку, может потре боваться еще один вариант преобразования чисел - конвертация ВСD-значения в строку текстовых символов в стандартной кодировке ASCII (пример вы встретите в программе установки часов, приведенной в главе 15) . Если одна цифра в диапазо-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==