Sari la conținut
ELFORUM - Forumul electronistilor

Probleme DEM16221SYH ...


kit

Postări Recomandate

... de fapt e o singura problema: la start LCD-ul imi arata o singura linie, neagra.Programelul este mai jos. Am verificat legaturile, mie-mi par bune. La iesirea din initializarea LCD-ului am pus sa-mi aprinda pinul 6 al portului D si face treaba asta.Singurul lucru care nu-l face este afisarea pe LCD... o chestie minora, dar treaba incepe sa ma enerveze.Va rog, parerea voastra: s-a dus LCD-ul sau am gresit undeva in rutina de initializare?Multumesc anticipat.program... (?)------------ LIST P=18F452 ;directive to define processor #include ;processor specific variable definitions CONFIG OSC = RCIO, WDT=OFF;****************************************************************************** CBLOCK 0x080 WREG_TEMP ;variable used for context saving STATUS_TEMP ;variable used for context saving BSR_TEMP ;variable used for context saving count lcd_temp table_index delay x_delay ENDC UDATA lcd_data equ PORTC lcd_data_tris equ TRISC lcd_ctrl equ PORTD lcd_e equ 4 lcd_rw equ 3 lcd_rs equ 2 lcd_line0 equ 0x00 UDATA_ACS ORG 0xf00000 DE "Test Data",0,1,2,3,4,5 ORG 0x0000 goto Main ;go to start of main code ORG 0x0008 bra HighInt ;go to high priority interrupt routine ORG 0x0018 movff STATUS,STATUS_TEMP ;save STATUS register movff WREG,WREG_TEMP ;save working register movff BSR,BSR_TEMP ;save BSR register retfieHighInt: retfie FAST ORG 0x42Main:; *** main code goes here *** clrf PORTC clrf PORTD movlw 0x00 movwf TRISC movwf TRISD call lcdinit movlw 0x33 call lcdputchar movlw 0x34 call lcdputchar bsf lcd_ctrl,6Loop: goto Looplcdinit: clrf lcd_ctrl movlw 0xff call x_delay500 movlw 0x38 call lcdputcmd ;1 movlw 0x04 call lcddmode call lcdclear movlw 0x02 call lcdemode returnlcdbusy: movlw 0xff movwf lcd_data_tris bcf lcd_ctrl,lcd_rs bsf lcd_ctrl,lcd_rw bsf lcd_ctrl,lcd_e call delay500 movf lcd_data,0 bcf lcd_ctrl,lcd_e andlw 0x80 btfss STATUS,Z goto lcdbusy movlw 0x00 movwf lcd_data_tris returnlcdclear: movlw 0x01 call lcdputcmd returnlcdemode: andlw 0x03 iorlw 0x04 call lcdputcmd returnlcddmode: andlw 0x07 iorlw 0x08 call lcdputcmd returnlcdputchar: movwf lcd_temp call lcdbusy bcf lcd_ctrl,lcd_rw bsf lcd_ctrl,lcd_rs bsf lcd_ctrl,lcd_e movf lcd_temp,0 movwf lcd_data call delay500 bcf lcd_ctrl,lcd_e returnlcdputcmd: movwf lcd_temp call lcdbusy bcf lcd_data,lcd_rw bcf lcd_data,lcd_rs bsf lcd_data,lcd_e movf lcd_temp,0 movwf lcd_data call delay500 bcf lcd_data,lcd_e clrf lcd_data returndelay500: movlw 0xff movwf delaydelay_loop decfsz delay,1 goto delay_loop returnx_delay500: movwf x_delayx_delay_loop: call delay500 decfsz x_delay,1 goto x_delay_loop return;******************************************************************************;End of program END

Link spre comentariu
  • Răspunsuri 6
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • kit

    3

  • vlad_2770

    2

  • bogdanm

    1

  • bld

    1

Top autori în acest subiect

daca ai o linie plina de dreptunghiuri negre inseaman ca LCD-ul nu este initializat.Banuiesc ca lucrezi cu LCD-ul pe 4 biti.In rutina ta am vazut:

lcdinit: clrf lcd_ctrl movlw 0xff call x_delay500 movlw 0x38 call lcdputcmd ;1 movlw 0x04 call lcddmode call lcdclear movlw 0x02 call lcdemode return

call x_delay500 > 30 ms? banuiesc ca nu (dar s-ar putea sa ai 500ms)apoi dupa ce trimiti 0x38 nu vad unde astepti 39 uS pentru a trimite al doilea octet de configurare.Ca sa iti mearga trebuie:1.astepti 30ms2.trimiti octet 2.astepti 39uS4.trimiti octet5.astepti 39 uS6. trimiti octet7.astepti 1.53 ms8. trimiti octetUnde cei 4 octeti sunt octeti de configurare.1 octet stabilesti pe cite linii vei afisa si la tine am vazut ca ai 00111000si daca vrei sa afisezi pe 2 linii ar trebui sa ai1xxxxxxxM-ai uita-te tu inca o data in PDF-ul LCD-ului. Eu cred ca tu te-ai uitat pe configurarea pe 8 biti si lucrezi cu LCD-ul pe 4 biti deci este normal sa nu mearga. Poate eu ma insel dar mai verifica inca o data.
Link spre comentariu

Daca iti apare prima linie neagra, inseamna ca LCDul functioneaza, dar nu l-ai initalizat corect SAU nu ai timing-urile bune(adica delay-urile necesare dupa scrierea comenzilor sau datelor in LCD sunt nepotrivite). Asa am patit si eu cand am inceput sa lucrez cu LCDuri compatibile cu standard-ul HD44780. P.S. Desi din program am vazut ca faci, ai putea sa verifici daca se face toggle din 1 in 0 pe intrare E(nable) de la LCD...

Link spre comentariu

Multumesc pentru lamuririle date pana acum.Am uitat sa spun ca eu incerc sa initializez minunea pe 8 biti.Pana acum am marit timingul, am verificat (din nou) pinii, dar nimic. Am verificat fizic daca imi ridica pinul E si o face (de fapt o face pe toti pinii, ce trimit se pare ca si ajunge la LCD).Din ce am inteles de la voi, LCD-ul nu este busit, asta este o veste buna. Dar tot nu merge si asta-i nasol. Ma puteti ajuta cu initializarea asta, ca eu ma declar aproape batut.Multumesc!

Link spre comentariu

Uite cum ar trebui sa arate rutina de initializare:

LCDINIT: ;POWER ON CLRF LCD_CTRL MOVLW D'50' ; temporizare 50ms (am pus 50 care este > decit 30 ms) CALL X_WAIT ;Function SET MOVLW 0x3C ; trimite 3C(hex) 111100 binar:N=1=>2 linii,F=1=>caracter=5x10dots call lcdputcmd CALL WAIT_100U ; temporizare 100us (am pus 100 in loc de 39uS pentru a fi acoperitor pentru toate LCD-urile ;Display ON/OFF MOVLW 0x0C ; trimite 0C(hex) 1100 binar (am ales cursor off, blink off) call lcdputcmd CALL WAIT_100U ; temporizare 100us ;Display Clear MOVLW 0x01 call lcdputcmd MOVLW D'5' ; temporizare 5ms (la fel 5 > 1,53ms) CALL X_WAIT ;Entry Mod SET MOVLW 0x06 ;se pune 1 la increment ca sa se poata scrie un sir de caractere si 0 la shift call lcdputcmd MOVLW D'5' ; temporizare 5ms ca sa fiu sigur ca totul este OK CALL X_WAIT return

eu am doua rutine de delay: X_WAIT si WAIT_100U, pe care le ai mai jos:

WAIT_100U MOVWF T1 ; 1 cycle MOVLW D'36' ; 1 cycle MOVWF T2 ; 1 cycleW_LOOP2 DECFSZ T2,1 ; 1 cycle GOTO W_LOOP2 ; 2 cyclesW_END2 MOVF T1,0 ; 1 cycle RETURN ; 2 cyclessiX_WAIT MOVWF X_DELAY ; 1X_WAIT_LOOP CALL WAIT_100U ; 2 DECFSZ X_DELAY,1 ; 1 GOTO X_WAIT_LOOP ; 2 X_WAIT_END RETURN ; 2

Din cate imi aduc aminte rutina este valabila pentru un quartz de 4MHz, daca ai mai mare, trebuie modificate valorile, altfel delay-ul rutinei va fi de 5 ori mai mic (20:4=5).T1 si T2 ti le definesti tu in ce locatie vrei.Daca celelate rutine ale tale sunt corecte ar trebui sa mearga.Codul tau este copiat de pe net, sau facut de tine?
Link spre comentariu

Se pare ca am reusit!Codul era adaptat dupa o chestie de pe net, scrisa pentru 12C???.Se pare (?) ca de vina era rutina de initializare, care folosea un test de busy-flag, care nu este disponibil in momentul de start al LCD-ului. Nu sunt chiar convins de acest enunt, dar alta explicatie n-am (e singurul lucru pe care l-am modificat).Mai exista urmatoarele explicatii:- e marti seara si ghinionul s-a terminat- LCD-ul asta este senbibil la rugaciuni / injuraturi (dar insensibil la trantitul de perete)- mercur a trecut in alta casuta zodiacala.Lasand supozitiile deoparte, va multumesc mult pentru ajutor, fara indicatiile date de voi faceam poster LCD-ul si atat. In sfarsit, pot trece la etapa urmatoare de dezvoltare ( :toimonster: ).

Link spre comentariu

Busy flag-ul chiar NU este disponibil la inceput, devine disponibil dupa initializare. Acu imi inchipui ca exista enspe mii de versiuni mai mult sau mai putin compatibile cu originalu, deci pica cum e norocu :)

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări