Отговори на тема  [ 9 мнения ] 
4-bit LCD Interface problem 
Автор Съобщение
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Чет Дек 09, 2004 3:15 pm
Мнения: 123
Местоположение: Благоевград
Мнение 4-bit LCD Interface problem
Здравейте, виждам че се разисква тема за HD44780.
Аз използвам KS0066U и се появява много странен проблем.
Работи с 4-битов интерфейс , като на портВ 4-7 са данните ,
а на портА 0-2 са управляващите битове. Така работи , но при
смяна - управляващите битове от портА 0-2 към портВ 1-3 нищо не става ??? Идеята ми е да използвам само портВ при управлението на модула /така съм предвидил и платката/ но работи само по горе описания начин. Естествено съм проверил подреждането на изводите на ЛСД спрямо порта на пик-а и в програмата съм ги предефинирал правилно , а проблема остава?
Използвам пик16Ф84А може би проблема идва от това , че всичко е на един порт?


Пон Фев 21, 2005 12:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение 
Не,не е от това проблема, някъде в програмата ти е. кай да видим процедурите за управление ан дисплея, инициалзация и т.н. ... и м-у другото, като позлваш порт b надявам се си забранил LVP функцията . не помня тоя имаше лия, но ако я има трябва да е забранена, иначе B.3 няма да функционира нормално.


Пон Фев 21, 2005 1:01 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Чет Дек 09, 2004 3:15 pm
Мнения: 123
Местоположение: Благоевград
Мнение 
Това е примерна програма за въртящо се съобщение на дисплея
която е работеща в този случай. При предефиниране на битовете RS , R/W и E към портВ абсолютно нищо не излиза на
дисплея. Не знам какво е LVP функция /ще съм благодарен ако обясниш/, но при този процесор не съм я срещал никъде. А и друго! Значи при работеща програма използвам изчакване по-голямо от посоченото за съответната инструкция вместо да проверавам флага за заетост защото при проверката той постоянно е зает /има го като подпрограма ,но не се ползва/.




list p=16F84A ; PROCESSOR TYPE
#include <p16F84A.inc> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC

;*************** DEFINE CONSTANT AND VARIABLES **************
w EQU 0
f EQU 1
CBLOCK H'0C'
BF_temp
Counter
Counter_2
Counter_Wr
Reg_Data
Reg_Note
LCD_temp
ENDC
;****************** DEFINE I/O PINS *********************
#define E PORTA,0
#define RW PORTA,1
#define RS PORTA,2
;*******************************************************
ORG H'0000'
goto start
;******************** START PROGRAM **********************
start bsf STATUS,RP0
movlw B'11000111'
movwf OPTION_REG
clrf TRISB
clrf TRISA
bcf STATUS,RP0
clrf PORTB
clrf PORTA
goto main
;-----------------------------------------------------------
;:::::::::::::::: 4-bit : LCD :::::::::::::::::::::::::::::
;-----------------------------------------------------------
Init_LCD movlw D'35'
movwf Counter
loop call Wait_1mS
decfsz Counter,f
goto loop
;------------------------------------
;************* FUNCTION SET *********
;------------------------------------
movlw B'00100000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------
movlw B'00100000'
movwf PORTB
bsf E
bcf E
;------------------------
movlw B'11000000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------------------
;******* Display ON/OFF Control *****
;------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'11000000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;-------------------------------------
;************* Display Clear *********
;-------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'00010000'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
;------------------------------------
;*********** Entry Mode Set *********
;------------------------------------
clrf PORTB
bsf E
bcf E
;------------------------
movlw B'01100000'
movwf PORTB
bsf E
bcf E
call Wait_60uS
;------------------------------------
;********* Initialization end *******
;------------------------------------
return
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;: 4-bit interface ::::::::::::::::::::::::::::::::::::::
Send_instr_153 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
return
;:::::::::::::::::::::::::::::::; 4-bit interface :::::::::::::::::::::::::::::::::::::::
Send_char movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bsf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;-----------------------------------------------------
Check_BF bsf STATUS,RP0
movlw H'FF'
movwf TRISB
bcf STATUS,RP0
bcf RS
bsf RW
bsf E
bcf E
movf PORTB,w
movwf BF_temp
btfsc BF_temp,7
goto Check_BF
bcf RW
bsf STATUS,RP0
clrf TRISB
bcf STATUS,RP0
return
;-----------------------------------------------------------
Wait_1mS movlw D'100'
movwf Counter_Wr
Again nop
nop
nop
nop
nop
nop
nop
decfsz Counter_Wr,f
goto Again
return
;------------------------------------------------------------
Wait_60uS movlw D'10' ; wait exactly 65uS
movwf Counter_Wr
Wait_Wr_ag nop
nop
nop
decfsz Counter_Wr,f
goto Wait_Wr_ag
return
;------------------------------------------------------------
Wait_1 movlw D'10'
movwf Counter
clrf TMR0
again_1 bcf INTCON,T0IF
loop_1 btfss INTCON,T0IF
goto loop_1
decfsz Counter,f
goto again_1
return
;-----------------------------------------------------------
Message ADDWF PCL,f
retlw '*'
retlw '*'
retlw '*'
retlw '*'
retlw ' '
retlw 'D'
retlw 'A'
retlw 'L'
retlw 'L'
retlw 'A'
retlw 'S'
retlw ' '
retlw 'D'
retlw 'S'
retlw '1'
retlw '8'
retlw 'B'
retlw '2'
retlw '0'
retlw ' '
retlw '*'
retlw '*'
retlw '*'
retlw '*'
;----------------------------------------------------------
main call Init_LCD
movlw H'90'
call Send_instr_43
clrf Reg_Note
UP_1 movf Reg_Note,w
call Message
call Send_char
INCF Reg_Note,f
movlw D'24'
SUBWF Reg_Note,w
btfss STATUS,Z
goto UP_1
UP_2 call Wait_1
movlw B'00011000' ; Display Shift to Left
call Send_instr_43
goto UP_2
sleep_1 nop
goto sleep_1
END


Пон Фев 21, 2005 1:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Проста работа :D Това за LVP го забрави...PIC16F84 няма такава функция (LVP - Low Voltage Programming, заема ти RB3 и не можеш да го ползваш в програмата си)...Проблема с BusyFlag-а и аз го имах при няколко дисплея, явно хардуерен проблем...ама и той не е важен...
Тука проблема ти е прост, решението също...

1. Забележи, че навсякъде в подпрограмите пращаш към PORTB битове 7:4, а не 3:0...Първо оправи това...
2. Тия тричките имат нужда от промяна...
Код:
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;: 4-bit interface ::::::::::::::::::::::::::::::::::::::
Send_instr_153 movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_1mS
call Wait_1mS
return
;:::::::::::::::::::::::::::::::; 4-bit interface :::::::::::::::::::::::::::::::::::::::
Send_char movwf LCD_temp ; 4-bit interface
movf LCD_temp,w
andlw H'F0'
movwf PORTB
bcf RW
bsf RS
bsf E
bcf E
swapf LCD_temp,w
andlw H'F0'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
;-----------------------------------------------------

По-точно ей тия редове:
Код:
movf LCD_temp,w
andlw H'F0'
movwf PORTB
...
swapf LCD_temp,w
andlw H'F0'
movwf PORTB

...трябва да изглеждат така:
Код:
swapf LCD_temp,w
andlw H'0F'
movwf PORTB
...
movf LCD_temp,w
andlw H'0F'
movwf PORTB

Пример за Send_instr_43:
Код:
;::::::::::::::::4-bit interface ::::::::::::::::::::::::
Send_instr_43 movwf LCD_temp ; 4-bit interface
swapf LCD_temp,w
andlw H'0F'
movwf PORTB
bcf RW
bcf RS
bsf E
bcf E
movf LCD_temp,w
andlw H'0F'
movwf PORTB
bsf E
bcf E
call Wait_60uS
return
.
Оттук нататък си ти... 8)


Пон Фев 21, 2005 2:53 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Чет Дек 09, 2004 3:15 pm
Мнения: 123
Местоположение: Благоевград
Мнение 
Данните при мен са на портВ 7-4 и ако ги умножа с 0F то според мен тези битове след операцията ще са нула? А и по този начин си работи само управлението е от друг порт.

10101010
and
00001111
00001010
MSB LSB


Пон Фев 21, 2005 4:07 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Значи извинявай, не съм те разбрал както трябва.... :lol: Но проблема е точно там където казвам...аз предположих, че искаш да си преместиш 4-те бита на RB3:0...Нищо де, проблема е пак в тия редове, а именно "ANDLW 0xF0" ти маскира долната тетрада, и като си сложиш управлението там (на RB3:0), те постоянно ще излизат в "0". Преправи ги тия редове със малко логика, че мене ме домързя да ти го напиша...Трябва да маскираш първо LCD_temp, след това да го OR-неш или AND-неш със PORTB, без да засягаш младшата тетрада (RB3:0).


Пон Фев 21, 2005 4:22 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Добре де....
Код:
Send_instr_43 movwf LCD_temp ; 4-bit interface
movlw 0x0F ;!!!!
andwf PORTB,f  ;Изчистваш старшата на PORTB
movf LCD_temp,w
andlw 0xF0       ; Махаш младшата тетрада
xorwf PORTB,f  ;Вдигаш битовете на старшата,без да буташ младшата
bcf RW
bcf RS
bsf E
bcf E
movlw 0x0F ;пак !!!! внимавай, така трябва да е
andwf PORTB,f  ; Чистиш старшата на PORTB
swapf LCD_temp,w  ; Разменяш тетрадите на LCD_temp
andlw 0xF0             ; Маскираш младшата, остава ти старшата...
xorwf PORTB          ; и я слагаш на PORTB :)
bsf E
bcf E
call Wait_60uS
return

Ша черпиш :D


Пон Фев 21, 2005 4:33 pm
Профил
Ранг: Новодошъл
Ранг: Новодошъл
Аватар

Регистриран на: Чет Дек 09, 2004 3:15 pm
Мнения: 123
Местоположение: Благоевград
Мнение 
Благодаря ти приятелю! Утре ще пробвам... Интересно ми е защо се получава така , че при запис в регистъра на константа след това не можеш да променяш битовете поотделно...какъвто е случая с портВ...предполагам , че същото важи и за регистри с общо предназначение... :axe:


Вто Фев 22, 2005 3:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
То си може побитово...bsf,bcf...ама струва ли си да губиш 30-ина реда да гласиш битове...отколкото 4 реда да маскираш тия дето няма да ги буташ. Всичко в тоя (тия) контролери става с елементарна булева алгебра (не че съм я учил..ама съм чел малко :D )


Вто Фев 22, 2005 3:12 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 9 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 9 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни