Так же в вышеприведенном алгоритме присутствует ошибка вычисления угла свыше 86 градусов, если функция начального угла – tg, и до 12 градусов, если ctg, из-за того, что табличные значения этих функций в данных углах не перечислены полностью. Это факт отражается в том, что все точки, попадающие в перечисленный диапазон, будут перемещены с большой погрешностью (из 170 возможных значений правильно переместятся только 12). В связи с этим было предложено следующее решение:
Ввести таблицы значений sin и cos. Далее
Синус угла находим по косинусу (таблично)
9. Выводы
Данную программу можно использовать для поворота на произвольный угол любого изображения, полученного на лабораторной установке с помощью камеры С3088. Для этого необходимо выделить еще один массив, равный по размеру массиву фрейма, куда будут записываться перерассчитанные данной программой точки, и, кроме этого, необходимо в программу добавить блок, определяющий начальную координату любой точки, лежащей в массиве(фрейме) изображения, и организовать цикл, позволяющий обработать всю область памяти, в которой находится исходное изображение.
Преимущество данного метода в том, что на расчет координаты новой точки уходит меньше времени, чем если бы нам пришлось рассчитывать каждый раз значения тригонометрических функций, тогда как памяти на хранение констант этих функций мы используем сравнительно мало (720 байт при том, что размер нашей программы без массивов с константами функций составляет около 700 байт). Т.е. у нас еще остается достаточно памяти, чтобы организовать массив-маску, о котором говорилось выше.
Недостатком вышеприведенного алгоритма является ошибка вычисления угла свыше 86 градусов, если функция начального угла – tg, и менее 12 градусов, если функция начального угла – ctg, из-за того, что табличные значения этих функций в данных углах не заданы полностью(90 значений вместо 255).
Приложение
Общий текст программного обеспечения нижнего уровня.
org 8100h
lcall init ;инициализация камеры
ret
org 8110h
lcall tune ;настройка камеры
ret
org 8120h
lcall capture ;захват кадра
ret
org 8130h
lcall upload ;передача кадра в ЭВМ
ret
INCLUDE ASMS\v_cam\init_inc.asm
INCLUDE ASMS\v_cam\tune_inc.asm
INCLUDE ASMS\v_cam\upl_inc.asm
INCLUDE ASMS\v_cam\cap_inc.asm
;Диапазон адресов памяти 8100h - 8300h задействован!
;Диапазон адресов памяти 9C00h - FFFFh задействован!
org 9C00h
frame: файл init_inc.asm
init: clr p3.4 ; снимаем RST
clr p3.5 ; снимаем PWDN
ret
файл tune_inc.asm
reg_adr: equ 50h ; адрес регистра настроек камеры
reg_val: equ 51h ; значение регистра настроек камеры
tune: lcall set_up ; инициализация камеры
; эта последовательность записей регистров настройки
; - установка минимальной частоты PCLK
mov reg_adr,#13h ; авто подстройка
mov reg_val,#00h ; auto adjust on/off, 0=off
lcall wr_proc ; трехфазная запись и чтение
lcall rd_proc
mov reg_adr,#12h ; AWB&AGC on/off
mov reg_val,#24h ; on
lcall wr_proc
lcall rd_proc
mov reg_adr,#29h ;AEC(автоэкспозиция) disable
mov reg_val,#80h
lcall wr_proc
lcall rd_proc
mov reg_adr,#10h ;AEC value
mov reg_val,#06h
lcall wr_proc
lcall rd_proc
mov reg_adr,#39h ;gate PCLK(синхронизация пикселей) with HREF
mov reg_val,#40h
lcall wr_proc
lcall rd_proc
mov reg_adr,#3eh ;PCLK /2
mov reg_val,#0h
lcall wr_proc
lcall rd_proc
mov reg_adr,#11h ;PCLK /64
mov reg_val,#3fh
lcall wr_proc
lcall rd_proc
mov reg_adr,#14h ;QCIF (176 x 144)
mov reg_val,#20h
lcall wr_proc
lcall rd_proc
ret
; процедура записи в регистр камеры значения
wr_proc:
lcall start ; начало обмена по шине
; посылка адреса устройства
mov a,#c0h ; c0h - назначенный камере по умолчанию
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.