PIC: fördröjning i LCD-rutiner

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

PIC: fördröjning i LCD-rutiner

Inlägg av persika »

Håller på med en 16F676 och en LCD-display.
Har använt sodjans rutiner som grund, det funkar bra, men..
Har anropat "lcd_init_hd44780" och sen skickat ett "A" med "lcd_send_data".
Inget A syntes i displayen, markör fanns där så initieringen borde gått rätt.
Sen testade jag att skicka 10 st A'n, och då kom det fram sju stycken, alltså måste displayen varit upptagen med nåt annat då de tre första skickats.
Så med en fördröjning efter anropet till "lcd_init_hd44780" funkar det fint.
Fördröjningar borde ligga efter kommandona i "lcd_init_hd44780" ?

Kod: Markera allt

lcd_init_hd44780
;
        call    delay_1s        ; Ge LCD'n tid att starta...
        bcf     LCD_E           ; Se till att E och RS är
        bcf     LCD_RS          ; nollade...
;
; Skicka initkoder enligt manual för HD44780.
; För detaljer, se manual för HD44780 eller datablad för en LCD.
;
        movlw   h'30'
        call    lcd_send_4_bit
        call    delay_5ms
        movlw   h'30'
        call    lcd_send_4_bit
        call    delay_5ms
        movlw   h'30'
        call    lcd_send_4_bit
        call    delay_100us
        movlw   h'20'           ; Byt till 4-bitars interface !
;       
        call    lcd_send_4_bit
        call    delay_100us
;
; Allt härefter sänds som två
; 4-bittars "nibbles". Först
; den höga delen (bit 4-7) sedan
; den låga (bot 0-3).
; Se lcd_send_cmd och lcd_send_data för detaljer.
;
        movlw   b'00101000'     ; Function set
        call    lcd_send_cmd
        movlw   b'00010100'     ; Display/curs shift
        call    lcd_send_cmd
        movlw   b'00001110'     ; Display/curs on/off
        call    lcd_send_cmd
        movlw   b'00000110'     ; Entry mode set
        call    lcd_send_cmd
        movlw   b'00000010'     ; Display/curs home
        call    lcd_send_cmd
        movlw   b'00000001'     ; Display clear
        call    lcd_send_cmd
;
; För detaljer kring varje kommando oven hänvisas till
; manual för HD44780 eller ett datablad för en LCD.
;
        return
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC: fördröjning i LCD-rutiner

Inlägg av Icecap »

Efter ett "Display Clear"-kommando ska LCD'n ha 1,64ms att utföra jobbet.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: fördröjning i LCD-rutiner

Inlägg av sodjan »

Alla HD44780 LCD'er tar en viss tid på sig att utföra olika saker.
Att skriva enskilda tecken går normalt snabbt, men vissa saker
som "reset" och "clear" tar längre tid. Ofta är inte tiderna mot en
LCD speciellt kritiska så man "tar till så det räcker", helt enkelt.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC: fördröjning i LCD-rutiner

Inlägg av persika »

Därför borde det ligga fördröjningar efter varje kommando som är i andra delen av rutinen "lcd_init_hd44780".
Jag ska lägga in det i min kopia iaf.
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: PIC: fördröjning i LCD-rutiner

Inlägg av bearing »

LCD_send_cmd innehåller anrop till delay_5ms, vilket ska räcka. Går din krets i 4Mhz? om frekvensen är högre än 12Mhz blir delayen för kort ifall du använder rutinen oförändrad.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC: fördröjning i LCD-rutiner

Inlägg av persika »

När jag påbörjade denna tråd tänkte jag inte på att det finns en 5ms fördröjning inlagd i "LCD_send_cmd". Jag har ju tidigare rättat fördröjningarna så de ska passa 12MHz som jag kör PICen med.
Så tydligen behöver displayen mer än 5ms, eller så är det nåt annat fel som jag inte ser just nu.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC: fördröjning i LCD-rutiner

Inlägg av sodjan »

> Därför borde det ligga fördröjningar efter varje kommando som är i andra delen av rutinen "lcd_init_hd44780".

Inget problem. Jag ser ett par olika lösningar på detta lilla problem.
1. Mot en faktura kan du få exakt vilka ändringar du vill i koden.
2. Jag kan återbetala varenda krona du har betalt för att läsa koden.
3. Du lägger upp en egen sida med din "rättade" kod.
Användarvisningsbild
persika
EF Sponsor
Inlägg: 1541
Blev medlem: 31 juli 2006, 22:14:37
Ort: Österlen, Skåne

Re: PIC: fördröjning i LCD-rutiner

Inlägg av persika »

sodjan> 1. Mot en faktura kan du få exakt vilka ändringar du vill i koden.
Tack för erbjudandet, men det är inte aktuellt, eftersom det 100% hobbyprojekt och känns som att jag klarar ut detta.

sodjan> 2. Jag kan återbetala varenda krona du har betalt för att läsa koden.
:)

sodjan> 3. Du lägger upp en egen sida med din "rättade" kod.
Kanske jag kan göra nån gång. Tänkte bara jag skulle vara lite till hjälp, det är ju många som kollar på sodjans sida.

Nu har jag letat upp originaldatabladet till just den display jag har, Optrex DMC16129.
Databladet:
http://www.optrex.com/pdfs/Dmcman_full.pdf

Där hittade jag för kommandot:

Clear Display
15.2ms Execution time (max.) when fcp or fosc is 250 kHz

Så alltså borde man ha 16ms i "LCD_send_cmd", för att vara på helt säkra sidan.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: PIC: fördröjning i LCD-rutiner

Inlägg av vfr »

Det "säkra" sättet att lösa problemet på är att använda statusbiten i LCD-kontrollern. Nackdelen är att man då även måste kunna läsa från kontrollern och kan inte lägga R/W-signalen fast låg. Alltså tar det en pinne extra att styra. Dock så slipper man hålla på med olika fördröjningar. Dessutom kan man även läsa ut "teckenminnet" ur kontrollern för att veta vad som står i varje position.
MGL
Inlägg: 131
Blev medlem: 1 oktober 2008, 19:38:16
Ort: Åland

Re: PIC: fördröjning i LCD-rutiner

Inlägg av MGL »

Sen är det ju inte så effektivt att ha en snabb µc att vänta på det sättet med en delay, bättre är att använda någon form av "state machine" för hantering av långsamma enheter och som vfr skriver läsa statusflaggan eller bara använda en tidsräknare för att hålla reda på tiden.
Delay rutiner borde inte finnas i µc-program tycker jag (åtminstone om de är längre än några µs..)
/Magnus
Skriv svar