Пост N: 153
Info: Среднее
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг:
0
Фото:
Отправлено: 27.01.07 19:28. Заголовок: Индикатор на основе HD44780
Ребята, что-то я начал парить по черному. Объясните мне вкратце каким образом общаться с данным индикатором при 4х проводном интерфейсе? Что-то я начал путаться совсем. В самоучителе при инициализации модуля даются совершенно другие команды. Да вот еще что, я запутался как же выставить в 4х проводном интерфейсе бит выбора страницы, он кажется 1й. Когда разбирался с 8ми проводным все было ясно как день и команды соответствовали даташитовским, а тут... короче заааапутался.
Пост N: 12
Зарегистрирован: 26.03.07
Откуда: Россия , Зеленогорск
Рейтинг:
0
Отправлено: 04.09.09 19:02. Заголовок: Alberto пишет: для ..
Alberto пишет:
цитата:
для вставки текста...
Alberto, спасибо за помощь.
Alberto пишет:
цитата:
Выделяете свой текст
Alberto, вы имеете ввиду скопировать нужный участок в буфер обмена и нажать указанную кнопку?
igor пишет:
цитата:
команда выделенная синим не нужна.
А как же быть с младшим полубайтом? Ведь если её убрать, командой swapf 11110000 поменяется на 00001111. ??? Может я очевидных вещей не вижу, или мешают стереотипы. ???
Пост N: 886
Зарегистрирован: 26.12.06
Откуда: Россия, Архангельск
Рейтинг:
1
Фото:
Отправлено: 04.09.09 19:05. Заголовок: igor пишет: команда..
igor пишет:
цитата:
команда выделенная синим не нужна. Если её выполнять, то в регистр Mem запишется результат предыдущего побитного "ИЛИ".
Она просто не нужна, но она и не мешается, она просто из мем копирует в аккумулятор... Тут скорее всего глюк в том, что блокируется младший полубайт, а если в младшем полубайте находятся и сигнальные линии, то на них установится нулевой уровень. С сигналом Е конечно не мешается но с остальными мешается. Индикатор никогда не сможет выдать флаг BF. Ведь при выдаче полубайта слова управления индикатор сразу же переходит в режим записи. Так что глюк здесь...
Пост N: 1475
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
4
Награды:
Отправлено: 04.09.09 19:40. Заголовок: stas_00 пишет: вы и..
stas_00 пишет:
цитата:
вы имеете ввиду скопировать нужный участок в буфер обмена и нажать указанную кнопку?
нет, вставить текст, потом его выделить и нажать кнопку. Попробуйте, есть же предосмотр. Просто текст программы выделен и размечен с ним приятнее работать. Алексей пишет:
цитата:
Она просто не нужна, но она и не мешается
а зачем нужно копировать данные из регистра в W, если следующая команда всё равно затрет данные в W. Мусор в чистом виде. И распишите, пожалуйста, как у Вас подключен ЖКИ, а то непонятно, там и RA, и RB. Где окнчательный вариант?
Пост N: 1476
Зарегистрирован: 12.02.07
Откуда: Argentina, Lincoln
Рейтинг:
4
Награды:
Отправлено: 04.09.09 20:10. Заголовок: Вот Ваш код: ENTER_B..
Вот Ваш код:
ENTER_BF: movwf Mem ; Сохраняем данные в регистре памяти. andlw b'11110000' ; Блокируем младший полубайт. movwf PortB ; Выводим данные в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
movfw Mem ; swapf Mem,W ; Меняем местами полубайты. andlw b'11110000' ; Блокируем младший полубайт. movwf PortB ;
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
я так понимаю что выводы управления RS, R/W и E также подключены к порту В? Если так, то что мы имеем на выходах RB0-RB3 после команды andlw b'11110000'? Строб Вы подали, а чему равен RS? Или для записи данных в ЖКИ у Вас другая п/программа ENTER_BF?
Пост N: 13
Зарегистрирован: 26.03.07
Откуда: Россия , Зеленогорск
Рейтинг:
0
Отправлено: 05.09.09 15:33. Заголовок: Alberto пишет: И ра..
Alberto пишет:
цитата:
И распишите, пожалуйста, как у Вас подключен ЖКИ
ЖКИ подключен так:
RB0 - E, RB1 - RS, RB2 - R/W, Весь PortB задействован RB3 - для управления HD44780. RB4 - DB4, RB5 - DB5, RB6 - DB6, RB7 - DB7.
Алексей и igor, почему команды MOV лишние? В первом случае, при выводе старшего полубайта, я сохраняю исходный байт (выделено синим), во втором случае (выделено зелёным) восстанавливаю значение для процедуры переправки младшего полубайта в дисплей, вот смотрите:
movlw b'00000110' ; Команда включения режима автоинкремента ОСНОВНОЕ call ENTER_BF ; и режима "дисплей не сдвигается". "ТЕЛО" ;----> Возврат по стеку из ПП ENTER_BF ПРОГРАММЫ return ; Возвращаемся.
;======================================================================== ; ПП "плавающей" задержки на основе анализа состояния флага занятости BF. ;======================================================================== ; "Запуск в работу" текущего байта, выставленного на выходах защелок порта В. ;---------------------------------------------------------------------------- ENTER_BF movwf Mem ; Сохраняем данные в регистре памяти. andlw b'11110000' ; Блокируем младший полубайт. movwf PortB ; Выводим данные в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
movfw Mem ; swapf Mem,W ; Меняем местами полубайты. andlw b'11110000' ; Блокируем младший полубайт. movwf PortB ;
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
igor пишет:
цитата:
команда выделенная синим не нужна. Если её выполнять, то в регистр Mem запишется результат предыдущего побитного "ИЛИ".
igor, у меня в тексте нет команд "ИЛИ", а только "И" (andlw).
спасибо, я так и понял. Просто лучше когда это написано явно, чем догатываться.
цитата:
почему команды MOV лишние?
пишут не про все команды MOV, а только про выделенную зеленым цветом. Первая команда "movfw Mem" переписывает данные из Mem в регистр W, а вторая (swapf Mem,W) переписывает данные из Mem в W с перестановкой полубайт (тетрад). Какой смысл в первой команде если вторая тут же затирает предидущие данные? P.S. Игорь писал про командую выделенную синим цветом в своем сообщении. Будьте, пожалуйста, внимательнее. P.P.S. Вы так и не приняли во внимание мое замечание на построение Вашей п/программы Enter_BF? Ведь при таком построении линия RS у Вас всегда равна "0". И при выводе данных, и при выводе команд, а это глюк в явном виде.
;============================================================================================ ; ПП "плавающей" задержки на основе анализа состояния флага занятости BF. ;============================================================================================ ; "Запуск в работу" старшего полубайта, выставленного на выходах защелок RB4...RB7. ;---------------------------------------------------------------------------------- ENTER_BF movwf Mem ; Сохраняем данные W в регистре временной памяти. movlw b'00001111' ; Очищаем старший полубайт регистра PortB, andwf PortB,F ; оставляя неизменным младший. movlw b'11110000' ; Блокируем младший полубайт, andwf Mem,W ; сохраняем в аккумуляторе, iorwf PortB,F ; и выводим в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
;----------------------------------------- ; "Запуск в работу" младшего полубайта данных. ;----------------------------------------- swapf Mem,F ; Меняем местами полубайты. movlw b'00001111' ; Очищаем старший полубайт регистра PortB, andwf PortB,F ; оставляя неизменным младший. movlw b'11110000' ; Блокируем младший полубайт, andwf Mem,W ; сохраняем в аккумуляторе, iorwf PortB,F ; и выводим в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
;----------------------------------------- ; Проверка флага BF. ;----------------------------------------- Bank1 ; Переход в 1-й банк. movlw b'11110000' ; Перестраиваем RB4...RB7 на вход, movwf TrisB ; для опроса флага BF. Bank0 ; Переход в 0-й банк.
SNOVA bcf PortB,RS ; Установка на линии RS "0" (режим команд). bsf PortB,RW ; Установка на линии R/W "1" (режим чтения). nop ; bsf PortB,E ; Установка на линии E "1".
clrwdt ; Обнуляем WDT. btfsc PortB,BF ; Если флаг BF опустился, программа исполняется далее, goto SNOVA ; а если нет, ждём-с.
movlw b'00001000' ; Очищаем старший полубайт регистра PortB, кроме RB3, andwf PortB,F ; оставляя неизменным младший. Bank1 ; Переход в 1-й банк. clrf TrisB ; Весь PortB работает на выход. Bank0 ; Переход в 0-й банк.
;============================================================================================ ; ПП "плавающей" задержки на основе анализа состояния флага занятости BF. ;============================================================================================ ; "Запуск в работу" старшего полубайта, выставленного на выходах защелок RB4...RB7. ;---------------------------------------------------------------------------------- ENTER_BF movwf Mem ; Сохраняем данные W в регистре временной памяти. comf Mem,W ; Инвертируем значение регистра Mem, т.к. при выводе в порт В младший полубайт останется ; таким же, каким был до записи в порт, а старший будет просто инвертирован логическим ; "Исключающее ИЛИ" andlw b'11110000' ; Блокируем младший полубайт, xorwf PortB,F ; и выводим в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
;----------------------------------------- ; "Запуск в работу" младшего полубайта данных. ;----------------------------------------- swapf Mem,F ; Меняем местами полубайты. comf Mem,W ; То же самое, что и впредыдущем случае. andlw b'11110000' ; Блокируем младший полубайт, xorwf PortB,F ; и выводим в порт.
nop ; Задержка в 1 м.ц. bsf PortB,E ; Установка на линии E "1". nop ; Задержка в 1 м.ц. bcf PortB,E ; Установка на линии Е "0" (активный перепад).
;----------------------------------------- ; Проверка флага BF. ;----------------------------------------- Bank1 ; Переход в 1-й банк. movlw b'11110000' ; Перестраиваем RB4...RB7 на вход, movwf TrisB ; для опроса флага BF. Bank0 ; Переход в 0-й банк.
SNOVA bcf PortB,RS ; Установка на линии RS "0" (режим команд). bsf PortB,RW ; Установка на линии R/W "1" (режим чтения). nop ; bsf PortB,E ; Установка на линии E "1".
clrwdt ; Обнуляем WDT. btfsc PortB,BF ; Если флаг BF опустился, программа исполняется далее, goto SNOVA ; а если нет, ждём-с.
movlw b'00001000' ; Очищаем старший полубайт регистра PortB, кроме RB3, andwf PortB,F ; оставляя неизменным младший. Bank1 ; Переход в 1-й банк. clrf TrisB ; Весь PortB работает на выход. Bank0 ; Переход в 0-й банк.
return ; Возврат по стеку.
А вот так попробуйте... Я как то так делал и все работало. Если нигде с логикой не ошибся, то заработает. Но то что можно заставить работать используя только три команды это точно.
Все даты в формате GMT
3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет