Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

HD44780 Busy Flag Troubles

Pagina: 1
Acties:

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Hallo,

Ik heb een paar maanden geleden een 20x4 LCD schermpje gekocht uit China, via een samenkoopactie van LEDSEE Electronics. Er zit een HD44780-compatible controler op, maar welke het precies is weet ik niet want achterop het schermpje zit precies geen chip (wel 5 zwarte 'bolletjes') . Op de site van de samenkoopactie staat dat het een KS0066U is, maar ik ben niet zeker of dat klopt. Het aansturen van het schermpje werkt bijna perfect, maar ik heb toch nog een probleem bij het lezen van de 'Busy Flag'.

Ik wil het schermpje aansturen met een PIC, ik heb daarvoor wat code in assembly geschreven die het perfect doet op een oud 16x1 LCD schermpje dat ik uit een fax heb gehaald. De code is zo geschreven dat er voor elk nieuw commando/character dat naar het schermpje wordt verzonden gecontroleerd wordt of het schermpje al klaar is met de vorige bewerking door de BF te controleren.

Als ik het 20x4 schermpje aansluit op de PIC, en BF-checking gebruik, dan komen er allemaal vreemde tekens op het schermpje. De tekens lijken wel op Chineese tekens, maar het zouden ook gewoon random custom characters kunnen zijn. Als ik in plaats van BF-checking gewoon een delay van ongeveer 2ms na elk commando zet, dan werkt het schermpje perfect. Die oplossing is echter veel te traag, dus ik zou BF-checking toch graag aan de praat krijgen met dit schermpje.

Om het debuggen wat makkelijker te maken heb ik een simpel C-programma voor Linux geschreven dat het schermpje aanstuurt zoals de PIC dat zou doen. Hiermee heb ik dezelfde resultaten als met de PIC.

Wat er precies gebeurt in het programma is dit:
- Het schermpje wordt geïnitialiseerd op 4 bits, 2 rijen en 5x7 dots-modus.
- Er worden een paar characters en commando's verzonden om te testen.
Dit laatste gebeurt zo:
Als het programma niets doet, dan is de RW-lijn laag (staat dus op schrijven), de RS-lijn hoog (staat dus op data) en de EN-lijn laag.

Wanneer ik dus een character naar schermpje wil sturen, dan moet ik enkel de EN-lijn hoog maken, eerst de hoogste 4 databits op de datalijnen zetten, de EN-lijn terug laag maken, even wachten en dan weer hoog maken, de laagste 4 databits op de datalijnen zetten en ten slotte de EN-lijn weer laag maken.

Wanneer ik een commando naar het schermpje wil sturen, dan moet ik eerst de RS-lijn laag maken en vervolgens, analoog aan hoe het werkt bij een character, de data naar het schermpje sturen. Hierna zet ik de RS-lijn terug hoog.

Dat werkt dus perfect als ik de BF niet controleer. Om de BF te controleren doe ik het volgende, voordat ik bovenstaande procedures toepas:
Ik zet de parallelle poort op lees-modus, ik maak de RS-lijn laag en de RW-lijn hoog (staat dus op lezen), vervolgens maak ik de EN-lijn hoog, ik wacht even en ik lees de bits in die op de parallelle poort staan, tenslotte maak ik de EN-lijn weer laag en maak ik de RW-lijn terug laag, de parrallele poort zet ik terug op schrijven en ik maak de RS-lijn weer hoog.

Wanneer ik nu, na het controleren van de BF, een character naar het schermpje stuur is dat nogal omzeep (hoewel een reeks van characters soms nog wel gedeeltelijk leesbaar is).

Ziet er iemand een fout in deze procedures, die dit soort van gedrag van het schermpje kunnen veroorzaken? Het zou toch mogelijk moeten zijn om de BF te controleren want als ik het schermpje aanstuur met bijvoorbeeld LCD4Linux en BF-checking aanzet, dan werkt het schermpje wel perfect.

Ik heb al geprobeerd om de delays die ik zet na het hoog/laag maken van de EN-lijn aan te passen naar verschillende waarden, maar dat heeft niet geholpen...

  • guus.assmann
  • Registratie: Augustus 2006
  • Laatst online: 27-04-2021
Weet je zeker dat je maar 1 bit checkt?
Als in me goed herinner, gebruikte ik een AND instruktie om alle andere bits te masken.
Als je in 4 bit mode stuurt, zou het kunnen zijn dat de bits 4 t/m 7 hoog zijn.
En heb je die niet gemasked, dat zal de uitkomst van de check altijd true zijn....

De rest van de procedure lijkt me prima in orde.

Guus Assmann


  • LWY
  • Registratie: September 2004
  • Laatst online: 29-07-2022

LWY

= Louie

titan_pi8 schreef op zondag 15 april 2007 @ 12:03:
Wanneer ik dus een character naar schermpje wil sturen, dan moet ik enkel de EN-lijn hoog maken, eerst de hoogste 4 databits op de datalijnen zetten, de EN-lijn terug laag maken, even wachten en dan weer hoog maken, de laagste 4 databits op de datalijnen zetten en ten slotte de EN-lijn weer laag maken.
Ik denk dat het daar mis gaat. Zoals je zelf al zegt, als LCD in 4 bits mode staat gaat het schrijven in 2 stappen (twee keer 4 bits schrijven en twee keer de EN hoog/laag maken). Bij het lezen werkt dit net zo, ook al wil je enkel de BF checken, je moet toch een hele byte, dus 2 keer 4 bits, lezen. Aangezien bit 7 de BF is hoef je alleen de eerste nibble daadwerkelijk te lezen, bij de tweede stuur je alleen een enable signaal. Stukje code wat ik gebruik om de BF te checken in 4 bits mode (misschien heb je er wat aan):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
lcdbusy
        movlw   0xFF            ; Input (read)
        tris    lcd_data_port
        bcf rs_port, rs
        bsf rw_port, rw 
        bsf en_port, en
        clrf    temp
        btfsc   lcd_data_port, d4       ; Read busy flag
        bsf temp, 0x07
        bcf en_port, en
        bsf en_port, en     ; Skip low nibble
        bcf en_port, en
        btfsc   temp, 0x07
        goto    lcdbusy
lcdnotbusy  
        bcf rw_port, rw
        movlw   0xF0            ; Output (write)
        tris    lcd_data_port
        return

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Dat heb ik ook al geprobeerd, maar dat gaf hetzelfde resultaat. Ik maakte dan gewoon, na een korte delay, een 2de maal de EN-lijn hoog en na weer een korte delay weer laag, maar dat maakte geen verschil.

Ik zit trouwens momenteel op kot en het schermpje ligt thuis, dus ik kan jammergenoeg niet testen.

@LWY: Ik heb trouwens jouw code al eens in mijn PIC geflashed en dan geprobeerd met mijn schermpje, maar het gaf hetzelfde resultaat als bij mijn code...

[ Voor 22% gewijzigd door titan_pi8 op 15-04-2007 21:43 ]


  • Vuikie
  • Registratie: December 2003
  • Laatst online: 07:43
Wat als je nu eens niet 'even' wacht maar de EN lijn gewoon uit en de volgende clock tik weer aan zet? Ik had ook een probleem met een LCD die ook vreemd deed en daar heb ik alle NOP's tussen het aan en het uit zetten van de EN gehaald en toen deed ie het wel.

Voorbeeld in AVR assembler
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        mov     lcddata, lwreg
    cbr        lwreg,0b00001111

    mov     wreg, lwreg
    out        PORTB, wreg

    sbi     PORTB,RS
    sbi     PORTB,E
;geen NOP ;)
    cbi     PORTB,E
    cbi     PORTB,RS
        
    mov     lwreg, lcddata
    cbr     lwreg, 0b11110000

    swap       lwreg
    mov        wreg, lwreg
    out        PORTB, wreg

    sbi     PORTB,RS
    sbi     PORTB,E
;geen NOP ;)
    cbi     PORTB,E
    cbi     PORTB,RS


Dit doe ik met een 16 MHZ chip, wat redelijk snel is. In de data sheet van de HD44780 staat ook dat je de EN moet stroben.

[ Voor 28% gewijzigd door Vuikie op 19-04-2007 15:17 . Reden: Voorbeeld bijgewerkt ]


  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Ik heb eens geprobeerd om de EN line te stroben zonder wachten:

(code is grotendeels hetzelfde als die van LWY)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
lcdbusy
    movwf       temp
    bsf         STATUS,RP0          ; Select Register page 1
    movlw       TRISDATA_in         ; Set PORTB for input
    movwf       TRISDATA
    bcf         STATUS, RP0         ; Select Register page 0
    bcf         CTRL_port, RS       ; Set LCD for command mode
    bsf         CTRL_port, RW       ; Setup to read busy flag
checkbusy
    bsf         CTRL_port, EN       ; LCD E-line High
    movfw       DATA_port           ; Read busy flag + DDram address
    bcf         CTRL_port, EN            ; LCD E-line Low
 
    bsf         CTRL_port, EN
    bcf         CTRL_port, EN
    andlw       0x80                ; Check Busy flag, High = Busy
    btfss       STATUS, Z
    goto        checkbusy
    
lcdnotbusy
    bcf         CTRL_port, RW
    bsf         STATUS, RP0         ; Select Register page 1
    movlw       TRISDATA_out
    movwf       TRISDATA            ; Set PORTB for output
    bcf         STATUS, RP0         ; Select Register page 0
    movfw       temp
    return


Maar dat werkt ook niet, ik heb nu het probleem dat elk character na een spatie corrupted is:
meestal wordt het teken dat na de spatie komt vervangen door een $ of een &. Als ik allemaal spaties na elkaar ingeef, dan staat er iets van: " """ " """"""

Ook custom characters geven problemen. Er is dus nog altijd iets mis met die busy flag routine.

Zou het kunnen dat mijn PIC gewoon te traag werkt? Hij draait nu op 4Mhz.

  • software
  • Registratie: Mei 2003
  • Laatst online: 02-01 09:26
Misschien een vraag dat niet echt te maken heeft met je probleem :
Kan je eens een foto nemen van die chinese charakters ?
Ik heb namelijk ook zo'n probleem .

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Nu werkt het schermpje opeens vrij goed, er komen veel minder corrupte characters op (maar ze komen nog wel ooit). Het enige dat ik heb veranderd is de string die erop komt na initialisatie :?.

@software:
ik zal straks eens booten naar linux en daar mijn testprogrammaatje draaien, dan krijg ik zeker weer van die vreemde (chinese?) characters en dan zal ik er een foto van maken.

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Hier is een foto van de vreemde characters. Bij nader inzicht zijn ze volgens mij toch gewoon random en niet chinees ofzo.

Je ziet da de tekst die er op zou moeten komen eigenlijk nog wel goed erop staat ('INIT OK'), maar ervoor staan telkens vreemde tekens. Het zijn er telkens 5 en altijd dezelfde. Nu is het ook zo dat om het display te initialiseren, ik 5 commando's zend. Dus waarschijnlijk interpreteert het display de commando's als characters...


Maar deze dingen zijn eigenlijk irrelevant want ik wil eigenlijk het schermpje werkend krijgen op die PIC, en daar vertoont het schermpje nu andere problemen (corruptie na een spatie)...


Edit:
Ik heb de binaire voorstelling van een spatie en een "-character vergeleken en een spatie is
00100000

een "-character is
00100010

En als ik enkel spaties typ, dan krijg ik iets als:
code:
1
'         "  "        "           '

(de buitenste enkele aanhalingstekens niet meegerekend).
Wat er dus volgens mij gebeurt is dat de eerste nibble 2x geïnterpreteerd wordt door het schermpje, dus zowel als hogere en als lagere nibble.

Ik heb nu de 2e nibble al iets eerder op de datalijnen gezet en dan pas de EN-lijn gestrobed, maar dat veranderde weer niets...

Dit is momenteel de code om gegevens naar het schermpje te sturen:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
lcdput      
        movwf   temp                ; Backup character to be send
        swapf   temp, W             ; Swap upper/lower 4 bits of
                                    ; temp and put result in W
        andlw   0x0F                ; Keep only the lower nibble

        bsf     CTRL_port, EN       ; Make the LCD process the data
        movwf   DATA_port           ; Send nibble to lcd data port
        bcf     CTRL_port, EN       ; (nop might need to be left out)
        movfw   temp                ; Load original data back into W            
        andlw   0x0F                ; Keep only the lower nibble (no
                                    ; swap this time)

        movwf   DATA_port           ; Send nibble to lcd data port
        bsf     CTRL_port, EN       ; Make the LCD process the data
        nop
        bcf     CTRL_port, EN       ; (nop might need to be left out)
        return

[ Voor 48% gewijzigd door titan_pi8 op 21-04-2007 15:47 ]


  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Het schermpje werkt nu ongeveer.

Ik begruik nu deze code om data te verzenden naar het schermpje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
lcdput      
        movwf   temp                ; Backup character to be send
        swapf   temp, W             ; Swap upper/lower 4 bits of
                                    ; temp and put result in W
        andlw   0x0F                ; Keep only the lower nibble

        movwf   DATA_port           ; Send nibble to lcd data port
        bsf     CTRL_port, EN       ; Make the LCD process the data
        bcf     CTRL_port, EN
        movfw   temp                ; Load original data back into W            
        andlw   0x0F                ; Keep only the lower nibble (no
                                    ; swap this time)
        nop
        nop
        nop
        nop
        nop
        movwf   DATA_port           ; Send nibble to lcd data port
        bsf     CTRL_port, EN       ; Make the LCD process the data
        bcf     CTRL_port, EN       
        return


De PIC draait terug op 4 Mhz dus ik wacht 5 µs tussen de hogere en lagere nibble. Ik heb nu geen last meer van corrupte tekens, maar het schermpje werkt wel über traag! Ik heb de uart op 600 baud gezet, en zelfs dan wordt de buffer van de uart soms niet op tijd leeggehaald en is er een buffer overflow!

Dit kan volgens mij niet komen door die extra 5 µs, of wel? Ik denk dat de PIC gewoon zeer lang moet wachten op het schermpje, maar dat is moeilijk na te gaan denk ik.

Stel dat dit het probleem is, waarom zou het schermpje zijn Busy Flag zo lang hoog houden? Ik weet dat het schermpje sneller moet kunnen, want als je het gewoon aan de LPT-poort van de PC hangt, dan kan ik er vlotjes de Winamp equalizer op zetten.

Hieronder heb ik de code voor de BF te checken nog eens gezet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
lcdbusy
    movwf       temp
    bsf         STATUS,RP0          ; Select Register page 1
    movlw       TRISDATA_in         ; Set PORTB for input
    movwf       TRISDATA
    bcf         STATUS, RP0         ; Select Register page 0
    bsf         CTRL_port, RW       ; Setup to read busy flag
    bcf         CTRL_port, RS       ; Set LCD for command mode
checkbusy
    bsf         CTRL_port, EN       ; LCD E-line High
    ;nop
    ;nop
    movfw       DATA_port           ; Read busy flag + DDram address
    bcf         CTRL_port, EN
   
    ;bcf         CTRL_port, EN      ; LCD E-line Low
    bsf         CTRL_port, EN
    bcf         CTRL_port, EN
    andlw       0x80                ; Check Busy flag, High = Busy
    btfss       STATUS, Z
    goto        checkbusy
    
lcdnotbusy
    bcf         CTRL_port, RW
    bsf         STATUS, RP0         ; Select Register page 1
    movlw       TRISDATA_out
    movwf       TRISDATA            ; Set PORTB for output
    bcf         STATUS, RP0         ; Select Register page 0
    movfw       temp
    return

  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Ik heb nu de PIC weer op 20Mhz draaien. Nu kan hij de invoer wel bijhouden, maar nu heb ik ook weer last van de "-characters die geregeld in plaats van een spatie komen.

Als ik een delay van 1 ms toevoeg na de busy flag check procedure, dan heb ik hier ook geen last meer van. Maar dan kan ik net zo goed heel de busy flag checking procedure weg doen en enkel die delay van 1 ms plaatsen, dat geeft namelijk hetzelfde resultaat.

Het lijkt dus alsof het display de BF nu te vroeg laag maakt. Heeft er iemand nog een idee van wat ik nog zou kunnen proberen?

Verwijderd

Gewoon die busy-flag vergeten, en passende delays gebruiken. Opdrachten als "clear display" en "cursor at home" nemen 1.64mS in beslag, al de rest vergt amper 40 µS. Dat is bij de originele HD44780; het zou me verbazen, moest een modernere variant meer tijd nodig hebben...

Nog een woordje over je code: de EN-pin v/d LCD-module reageert op een neergaande flank. Je mag die hoog maken, voor er data klaar staat. Zo:
EN hoog.
Data klaarzetten.
EN laag.
...

[ Voor 25% gewijzigd door Verwijderd op 24-04-2007 20:49 ]


  • titan_pi8
  • Registratie: Januari 2004
  • Laatst online: 11-11 23:10
Ik denk dat ik inderdaad deze methode ga proberen volgend weekend. Wel jammer dat dit schermpje die BF niet goed ondersteunt. Maarja heeft ook maar 8.50€ ofzo gekost ;).

Ik zal nog posten wanneer ik deze methode heb getest.
Pagina: 1