Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
Не трудно догадаться, что после "вождения носом по батарее", которое имело место
быть в предыдущем подразделе, неизбежно начнется поиск более оптимального
варианта инициализации графического модуля.
Диалектика "в чистом виде" ("жить - хорошо, но хорошо жить - еще лучше").
Вопрос: "Чем не мило то, что сваялось ранее, ведь железяка нормально работает"?
Ответ: транзистором. Он смотрится как некое "инородное тело", от которого имеется
маниакальное желание избавиться.
Проще говоря, а на фиг он нужен, ведь все гениальное просто?
Возразить на это просто нечем.
И именно потому, что люди постоянно ищут и находят ответы на подобного рода
вопросы, мы сейчас не шимпанзе, а человеки.
Так что, прошу осознать серьезность эволюционного момента и проникнуться… (тьфу
ты, запутался. Домыслите сами).
Вопрос: "Из чего выбирать"?
Ответ: из оставшихся вариантов инициализации.
2-й вариант инициализации отпадает, так как это та же "аналоговая гнусность", но
только "с другого бока".
Остается 1-й вариант инициализации графического модуля, который предлагают
разработчики ("штатный").
В "железе", это выглядит так:
1
После банального сравнения того, что было с тем, что есть, становится понятно, что
данный вариант, в "аппаратном смысле", более выигрышен.
И в самом деле, количество задействованных выводов портов - одно и то же, но
транзистор "моль съела".
Нет его. "Усоп" за ненужностью.
Мало того, и в "программном смысле" этот вариант более выигрышен.
Вопрос: "Почему"?
Ответ: потому, что в ходе инициализации графического модуля, не нужно программно
исполнять аж 2 инструкции: Display OFF (выключение дисплея) и Display StartLine
(выбор строки).
Вопрос: "Почему их не нужно программно исполнять"?
Ответ: потому, что они исполняются аппаратно (автоматически).
Вопрос: "Но для "запуска в работу" (инициализации) любого аппаратного процесса (а
тем более, нескольких) нужен строб? Где этот оболтус?".
Ответ: поосторожнее на поворотах. Соображение нужно иметь. Это вовсе и не
"оболтус", а вполне профессиональный "управленец", причем, в "ранге суперважняка".
Такого "на кривой козе не объедешь", а если и "объедешь", то "умоешься горькими
слезами".
Так что, хочешь - не хочешь, а "Боже царя храни" спеть придется.
Вопрос: "Неужели царь"?
Ответ: так точно. Самый натуральный. Если разрешит, то будет "счастье", а если не
разрешит, то будут "белые тапки" (и это еще мягко сказано).
Вопрос: "Пардон. А в чем заключаются его выдающиеся способности"?
Ответ: в том, что с этого строба начинается все сущее. Если, при данном "раскладе",
его не будет, то вместо него будет "легендарный Гитлер капут", причем, в особо
тяжелой форме.
Вопрос: "А если он (строб) будет, то какого счастья ждать"?
Ответ: всеобъемлющего. Но при условии, что в дальнейшем будут соблюдены
"правила игры".
А теперь конкретно.
Стробом является перепад от 1 к 0 на выводе внешнего сброса графического модуля
с названием RES.
Естественно, что для того чтобы такой перепад имел место быть, сначала нужно
озаботиться программным "выставлением", на выводе RES, единичного уровня, затем
подождать, как минимум, 1 мкс. (но лучше побольше), а только после этого программно
менять уровень 1 на уровень 0.
Сразу же после смены 1 на 0, происходит общий, аппаратный сброс всей "начинки"
графического модуля, после чего, так же аппаратно (автоматически), "запускаются в
работу" две упомянутые выше инструкции (Display OFF и Display StartLine).
Так как строб формируется в то время, когда Uпит. графического модуля установилось
и надежно зафиксировалось на уровне 5 вольт, то все "бяки", которые имели место
быть до этого общего, аппаратного сброса (см. предыдущий подраздел) - "по
барабану".
Если так можно выразиться, то после общего, аппаратного сброса, работа
графического модуля начинается "с чистого листа".
И никакого дополнительного транзистора не нужно.
И программно выполнять инструкцию Display OFF тоже не нужно.
С инструкцией Display OFF все ясно - выключение дисплея, а вот с инструкцией
Display StartLine - не очень.
Но это дело поправимое: в случае применения 1-го варианта инициализации
графического модуля, по умолчанию, автоматически, выставляется адрес 1-й строки
(00h).
То есть, если в дальнейшем, заполнение дисплея будет происходить с 1-й строки (как
в рассматриваемом случае), то инструкцию Display StartLine программно исполнять не
нужно.
Ее нужно программно исполнять только в том случае, когда, после инициализации
графического модуля, заполнение дисплея будет начинаться не с 1-й строки, а с
какой-нибудь другой.
2
Для обеспечения гарантированного исполнения "вышележащего", длительность
стробирующего импульса должна быть не менее 1 мкс.
Ну ладно, стробирующий импульс "сваяли", а дальше-то что?
Цитата из технического описания: "После деактивации сигнала RES (переключения
в логическую «1» с временем фронта не более 200нс) необходимо дождаться
сброса битов BUSY и RESET в регистре состояния обоих кристаллов или
выдержать паузу не менее 10 мкс. После этого модуль нормально
функционирует".
Так как, в данном случае, "упор" делается на флаги статуса, то на фиксированную
задержку "закрываю глаза".
Сразу же возникает вопрос: "А куда подевался флаг ON/OFF? Почему он
разработчиками замалчивается"?
"Это жу-жу неспроста"…
Так точно. Неспроста.
Пробовал "подпрячь".
Получился конфуз: рабочая точка программы "намертво зависает" в процедуре анализа
состояний флага ON/OFF.
Таким образом, получается, что в случае применения 1-го варианта инициализации,
этот флаг не сбрасывается.
Ну хоть бы намекнули (по-русски)!
Ладно. "Проехали". Хотя, к разработчикам и к сопровождающей их "обслуге", имеются
кое-какие, мелкие претензии.
Но еще большие претензии появляются после прочтения предложения "После этого
модуль нормально функционирует".
Детский вопрос: "С какой стати он будет нормально функционировать, если дисплей
выключен"?
Об этом - ни слова.
По всей видимости, это изречение предназначено для людей достаточно неординарных
(типа "догадайтесь сами").
В этом отношении, мы сильно отстали от американцев.
"Американский" пример (на вскидку):
1. Воткнуть вилку в розетку.
Внимание!!! Вилка это то, из чего торчат две круглые железяки типоразмера …
(рисунок прилагается), а в розетке (рисунки розеток различных фирм прилагаются),
есть две круглые дырки, в которые и нужно воткнуть эти круглые железяки.
Внимание!!! К вилке подключен электрический шнур (рисунок прилагается). Необходимо
проконтролировать, чтобы второй конец этого шнура находился в том изделии нашей
фирмы (рисунок прилагается), которое Вы пытаетесь включить.
В случае наличия квадратных, прямоугольных, N-угольных и прочих дырок, с формой,
отличной от круглой, просьба обращаться в наш многофункциональный, сервисный
центр быстрого реагирования (телефон …, E-mail …).
Наши высокопрофессиональные специалисты широкого, аварийного профиля,
оперативно Вам помогут в Вашей беде.
Внимание!!! Строго запрещается втыкать, в эти круглые дырки, человеческие
конечности, а также и прочие предметы, отличные от вилки (см. рисунок вилки)!
В случае наличия оного, возмущения и претензии не принимаются.
2. Указательным пальцем правой руки, нужно нажать на кнопку "Включение".
Внимание!!! Головой, ногой, а далее - по списку (список прилагается), нажимать на
кнопку "Включение" запрещается. В противном случае, к претензии, нужно будет
приложить справку об образовании, справку из психдиспансера и заключение терапевта
об отсутствии у Вас бешенства, эпилепсии, родильной горячки (далее - по списку.
Список прилагается).
Ну и так далее (N-страниц).
Пример для людей с чувством юмора, которые способны увидеть, в этом "идиотизме",
нечто большее, чем смех.
На первый взгляд, вроде как и смешно, но ведь и понятно, что именно и как именно
нужно делать, а чего делать нельзя!!! (скрытая форма обучения тому, чего человек не
знает).
3
Это гораздо лучше, чем описание типа: "После этого модуль нормально
функционирует".
"Муть в чистом виде".
Мне, как организму, не терпящему "мути", очень захотелось с ней как следует
разобраться (как быку с красной тряпкой).
Примечание: графический модуль стоит такую денюжку, что и разработчикам, и спецам
компании МЭЛТ, вполне можно было бы и подсуетиться.
Вот так и "родилась" следующая процедура "штатной" инициализации графического
модуля, с использованием его битов статуса (ниоткуда не скопирована. Made in
Здравый Смысл):
.................................
.................................
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Подготовительные операции.
;================================================================================
START bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisB ; Все выводы портов В и С
clrf TrisC ; работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
4
; на начало исполнения программы.
; Если RESET=0 (сброс был), то программа
; исполняется далее.
;-----------------------------------------
; Подготовка к работе в режиме записи.
;-----------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
clrf TrisC ; Все выводы порта С работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
bcf PortB,R_W ; Установка режима записи (R/W=0).
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
;################################################################################
; РАБОТА С ЛЕВЫМ (1-м) КРИСТАЛЛОМ.
;################################################################################
.................................
.................................
5
этого элемента картинки (или его части), из оперативной памяти графического модуля,
может оказаться выгодным.
Это - "на вскидку".
По этому поводу, понапридумать можно много всякого, но сейчас я этим заниматься
не буду, так как, для начала, нужно "въехать в механизм" такого считывания, а только
после этого прикидывать, "к какой стенке это счастье прислонить".
Для того чтобы что-то считать из оперативной памяти графического модуля, нужно
выполнить требования таблицы 1:
6
Ответ: либо оперативная, либо EEPROM память ПИКа.
EEPROM память это пока "крутовато", а вот оперативная память - в самый раз.
Вопрос: "Ну скопировали. А дальше что"?
Ответ: а дальше - "все что угодно". Байты-то сохранены.
Из них можно сделать "цифровой коктейль" (в том числе и с задействованием
"сторонних" байтов, и с задействованием вообще "черт знает чего". В пределах
дозволенного), но в обучающих целях, проще всего вывести эти байты на индикацию
"по верху" какого-нибудь элемента картинки 1-го "кадра".
Факт такого вывода на индикацию будет свидетельствовать о том, что чтение прошло
успешно и усилия не потрачены зря.
В качестве того, что будет копироваться, выбран символ "1" (3-я страница 2-го
кристалла).
В качестве того, что будет "убито" записью "по верху", выбран символ "2" (4-я
страница 2-го кристалла).
Но можно придумать и что-то другое.
Оба этих символа созданы в матрице 4х7 точек.
Значит, можно обойтись копированием 4-х байтов.
Вот Вам и исходные данные.
А теперь, "шашки наголо и в атаку":
...................................
...................................
;================================================================================
; Подпрограмма чтения данных.
;================================================================================
READ_D call STROB ; Строб (инициализация чтения).
;---> Возврат по стеку из ПП STROB
movf PortC,W ; Копирование считанного байта данных в W.
return ; Возврат по стеку в то место, откуда
; произошел вызов подпрограммы.
;================================================================================
...................................
...................................
;================================================================================
; ЗАДЕРЖКА (около 2 сек.)
;================================================================================
PAUSE movlw .93 ;
movwf Mem1 ;
movlw .38 ;
movwf Mem2 ;
movlw .11 ;
movwf Mem3 ;
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
START
...................................
...................................
7
;--------------------------------------------------------------------------------
; Запись в 8-ю страницу 2-го кристалла
;--------------------------------------------------------------------------------
call STRANICA_8 ;
call STOLB_1 ;
movlw .64 ;
movwf Temp ;
;================================================================================
; Чтение выбранных (из 3-й страницы 2-го кристалла) байтов.
;================================================================================
; Подготовка к чтению.
;------------------------------------
call STRANICA_3 ; Выбор 3-й страницы.
movlw b'01010010' ; Выбор адреса 19-го столбца (12h).
movwf PortC ; Вывод команды выбора адреса столбца на
; линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
bsf Status,RP0 ; Переход в 1-й банк.
movlw b'11111111' ; Все выводы порта С
movwf TrisC ; работают на вход.
bcf Status,RP0 ; Переход в 0-й банк.
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem2.
movwf Mem2 ;
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem3.
movwf Mem3 ;
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem4.
movwf Mem4 ;
;------------------------------------
; Подготовка к дальнейшей записи.
;------------------------------------
bsf Status,RP0 ; Переход в 1-й банк.
8
clrf TrisC ; Все выводы порта С работают на выход.
bcf Status,RP0 ; Переход в 0-й банк.
;********************************************************************************
; Таблицы данных, предназначенных для записи.
;********************************************************************************
...................................
...................................
Работа процедуры
В "шапке" программы "прописываются" 4 регистра оперативной памяти Mem1…Mem4.
Именно в них и будет производиться считывание байтов данных из оперативной
памяти графического модуля.
Сначала нужно считать нужные байты данных.
Перед этим, нужно произвести адресацию к 1-му байту этого массива:
;================================================================================
; Чтение выбранных (из 3-й страницы 2-го кристалла) байтов.
;================================================================================
; Подготовка к чтению.
;------------------------------------
call STRANICA_3 ; Выбор 3-й страницы.
movlw b'01010010' ; Выбор адреса 19-го столбца (12h).
movwf PortC ; Вывод команды выбора адреса столбца на
9
; линии DB7...DB0.
call STROB ; Строб ("запуск в работу").
;---> Возврат по стеку из ПП STROB
Так как перед входом в данную процедуру, происходила работа во 2-м кристалле, то и
включать 2-й кристалл не нужно.
Так как далее необходимо организовать чтение байтов данных из оперативной памяти
графического модуля, то нужно к этому подготовиться:
Имеет место быть перестройка направлений работы выводов порта (порта С),
подключенных к линиям DB7…DB0, обеспечение условий исполнения инструкции Read
Data from RAM и "пустой" цикл чтения.
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem2.
movwf Mem2 ;
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem3.
movwf Mem3 ;
10
call READ_D ;
;---> Возврат по стеку из ПП READ_D ; Аналогично для Mem4.
movwf Mem4 ;
Кристалл переключать не нужно, так как запись происходит в "епархии" 2-го кристалла.
12
13