mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Display am PIC - verstädnisfrage BUS Übertragung


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Seier M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle,

Ich will zu Testzwecken einen ganz einfachen 2 Zeilen LCD Display 
benutzen. Ich weiß dass das Thema hier schon durch und durchgekaut 
worden ist, jedoch habe ich eine Frage für die ich noch mir keine gute 
Erklärung gefunden habe.

Seite 16
Und zwar orientiere ich mich an folgende Anleitung: 
http://www.stefan-buchgeher.info/elektronik/lcd/lcd_doku.pdf

Es wird kein Interface(I2C, SPI, Uart..) benutzt. Das Display kommt mit 
seinen 4 Datenleitungen und die restlichen Pins (RS, Write etc) an den 
Mikrocontroller.

Wie funktioniert die Übertragung, ohne solche Peripherie? Seite 16 unten 
wird der ganze Bus irgendwie an den Port B gebunden, soganz verstehe ich 
das aber nicht. WIE könnte man die Datenleitungen für den PIC noch 
definieren? (ohne den ganzen Port dafür zu benutzen)

Da die LCD's alle gleich sind bzw mit dem HD44780 ausgestattet sind, 
habe ich an folgendes gedacht: 
https://www.amazon.de/AZDelivery-HD44780-Display-Schnittstelle-Anzeigen/dp/B01N3B8JMN
Das I2C Interface ist in meinem Fall ja Optional.

Danke im Vorraus,
Gruß!

Autor: Teo D. (teoderix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seier M. schrieb:
> Wie funktioniert die Übertragung, ohne solche Peripherie?

Wenn du keine HW hast, die dir diese Arbeit abnimmt, musst du diese 
Funktionalität halt selbst programmieren.

Seier M. schrieb:
> WIE könnte man die Datenleitungen für den PIC noch
> definieren? (ohne den ganzen Port dafür zu benutzen)

Du hast doch die volle Kontrolle über jeden einzelnen IO-Pin!
Entweder du machst es dir einfach und legst Daten und Steuerleitungen 
auf einen Port. Um die ungenutzten Pins für andre Aufgaben frei zu 
halten, werden diese ausmaskiert, so das diese nach nem beschreiben 
des Port unverändert bleiben. 
https://www.mikrocontroller.net/articles/Bitmanipulation
So ist es auch möglich, mit etwas mehr Aufwand, jeden beliebigen Pin auf 
unterschiedlichen Ports zu verwenden.

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seier M. schrieb:
> Seite 16 Und zwar orientiere ich mich an folgende Anleitung:...

Du verwendest auch den gleichen Compiler?
Welchen PIC hast du?

Seier M. schrieb:
> Wie funktioniert die Übertragung, ohne solche Peripherie?

Was meinst du hier mit Peripherie? Ganz allgemein brauchst du nur die 
entsprechende Anzahl von Pins zum Ansteuern des LCD. Die können alle am 
selben Port sein, müssen aber nicht...

: Bearbeitet durch User
Autor: Seier M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Wenn ich das richtig verstehe:
In der Anleitung wurde folgendes gemacht:
 #pragma char LCD_DATA @PORTB
Da wurde also der gesamte PORTB dem LCD_DATA zugewiesen. Das sieht für 
mich aus als wäre es das selbe wie bei einem #define.. Dass hier überall 
wo Daten in LCD_DATA geschrieben werden, das gleiche ist wie wenn da 
PORTB stehen würde?
Obwohl das #define ja nur etwas ersetzen geht, das #pragma hat da ja 
schon ne wichtigere Rolle.

Verwende den XC16 Compiler mit einem PIC24.
Damit meinte ich dass ich kein I2C, SPI oder sontiges mehr zur Verfügung 
habe.:/

lG

Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seier M. schrieb:
> Wie funktioniert die Übertragung, ohne solche Peripherie?

Direkt mit Bit setzen/löschen. Damit spart man den Umweg über einen 
extra IC.
Oftmals kann man aber nicht alle Pins auf den selben Port legen, dann 
kann man es so lösen:
https://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001

Die Syntax für Bitdefinitionen kann beim PIC-Compiler abweichen.

Seier M. schrieb:
> Damit meinte ich dass ich kein I2C, SPI oder sontiges mehr zur Verfügung
> habe.:/

I2C, SPI lassen sich ebenfalls mit beliebigen IO-Pins durch Bit 
setzen/löschen implementieren.

Autor: Volker S. (vloki)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seier M. schrieb:
> In der Anleitung wurde folgendes gemacht: #pragma char LCD_DATA @PORTB

Das scheint mir etwas eher Compiler spezifisches zu sein.
Ich kenne das eher so (etwas speziell, weil auch für Daten beliebige 
Pins möglich)
#define  LCD_E       LATCbits.LATC1
#define  LCD_E_DIR   TRISCbits.TRISC1
#define  LCD_RW      LATCbits.LATC0
#define  LCD_RW_DIR  TRISCbits.TRISC0
#define  LCD_RS      LATAbits.LATA5
#define  LCD_RS_DIR  TRISAbits.TRISA5

#define  LCD_D4_IN  PORTBbits.RB2
#define  LCD_D5_IN  PORTBbits.RB3
#define  LCD_D6_IN  PORTBbits.RB4
#define  LCD_D7_IN  PORTBbits.RB5
#define  LCD_D4_OUT  LATBbits.LATB2
#define  LCD_D5_OUT  LATBbits.LATB3
#define  LCD_D6_OUT  LATBbits.LATB4
#define  LCD_D7_OUT  LATBbits.LATB5
#define  LCD_D4_DIR  TRISBbits.TRISB2
#define  LCD_D5_DIR  TRISBbits.TRISB3
#define  LCD_D6_DIR  TRISBbits.TRISB4
#define  LCD_D7_DIR  TRISBbits.TRISB5

#define LCD_DIR_IN()  LCD_D4_DIR = LCD_D5_DIR = LCD_D6_DIR = LCD_D7_DIR = 1
#define LCD_DIR_OUT() LCD_D4_DIR = LCD_D5_DIR = LCD_D6_DIR = LCD_D7_DIR = 0

#define LCD_STROBE()    LCD_E = 1; LCD_DELAY_1US(); LCD_E = 0;

Beim Schreiben sieht das dann etwa so aus:
void LCD_Write(unsigned char value) // command or data
{
    LCD_data.all = value;
    LCD_RW = LCD_WR;

    LCD_D7_OUT = LCD_data.bit7;
    LCD_D6_OUT = LCD_data.bit6;
    LCD_D5_OUT = LCD_data.bit5;
    LCD_D4_OUT = LCD_data.bit4;
#ifndef LCD_USE_8BIT_DATA
    LCD_STROBE();
#endif

    LCD_D3_OUT = LCD_data.bit3;
    LCD_D2_OUT = LCD_data.bit2;
    LCD_D1_OUT = LCD_data.bit1;
    LCD_D0_OUT = LCD_data.bit0;
    LCD_STROBE();
}

Kannst du natürlich auch in deinem PDF schauen, wie das dort läuft.
(Die Anleitung scheint allerdings auch eher für einen PIC16 zu sein)

: Bearbeitet durch User
Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Seier M. schrieb:
> Und zwar orientiere ich mich an folgende Anleitung:
> http://www.stefan-buchgeher.info/elektronik/lcd/lcd_doku.pdf
>
> Es wird kein Interface(I2C, SPI, Uart..) benutzt. Das Display kommt mit
> seinen 4 Datenleitungen und die restlichen Pins (RS, Write etc) an den
> Mikrocontroller.
>
> Wie funktioniert die Übertragung, ohne solche Peripherie?

Ja an was für eine Peripherie hast du denn so gedacht? Für sowas gibt es 
keine! Guck dir das Diagramm auf Seite 7 an, da findest du alles, was du 
an Informationen brauchst.

Also setze RS high oder low, je nachdem ob du Displaydaten oder 
Steuerkommandos schreiben willst, dann:

Setze R/W auf low zum Schreiben, dann:

Setze deine 4 Datenbit so, wie du sie haben willst, dann:

Mache nen High-Impuls an E(nable), dann:

bei 4 Bit Betrieb nochmal das Ganze mit den anderen 4 Bit, dann:

Warte bei manchen Steuerkommandos ne Weile, weil deren Verarbeitung im 
Display halt dauert.

Das war's eigentlich. Ich geb dir mal ein Beispiel (Auszug, zum 
Angucken. Nicht zum gedankenlosen copy&paste):
          INCLUDE P16F716.PIC

; Hardware:
; Pollin-LCD 2x8Zeichen Alpha, 4 Datenbit
; der PIC läuft mit 18.432 MHz


; Portbelegung
; Port B
CE_LCD:   BIT   PortB,0  ; out
RefCt:    BIT   PortB,1  ; in
RW_LCD:   BIT   PortB,2  ; out
RS_LCD:   BIT   PortB,3  ; out
D4:       BIT   PortB,4
D5:       BIT   PortB,5
D6:       BIT   PortB,6
D7:       BIT   PortB,7



; Port D auf Input stellen OHNE W anzurühren
Dir_IN:   BSF    RP0
          BSF    TrisB,4
          BSF    TrisB,5
          BSF    TrisB,6
          BSF    TrisB,7
          BCF    RP0
          RETURN

; Port D auf Output stellen OHNE W anzurühren
Dir_OUT:  BSF    RP0
          BCF    TrisB,4
          BCF    TrisB,5
          BCF    TrisB,6
          BCF    TrisB,7
          BCF    RP0
          RETURN

; Ausgabepuffer löschen
ClearString:
         MOVLW  16
         MOVWF  Hudl
         MOVLW  RString+1
         MOVWF  FSR
         MOVLW  ' '
_clz:    MOVWF  Indirect
         INCF   FSR,F
         DECFSZ Hudl,F
         GOTO   _clz
         CLRF   RString
         RETURN   
                  


; Ausgabe auf LCD mit Warten auf Ready vom LCD
SayIt:   BSF    toRS_LCD
         SKIP   toString
         GOTO   OutLCD
         MOVWF  RChar
         MOVF   RString,W
         ANDLW  15
         ADDLW  RString+1         
         MOVWF  FSR
         MOVF   RChar,W
         MOVWF  Indirect
         INCF   RString,F
         RETURN      
         

; toRS-LCD muß für Zeichenausgabe gesetzt sein
OutLCD:  MOVWF  RChar
         INCF   LxPos,F
         CALL   Dir_IN
_ow:     BSF    RW_LCD
         BCF    RS_LCD
         BSF    CE_LCD
         NOP
         NOP
         MOVF   PortB,W
         BCF    CE_LCD
         ANDLW  10000000b
         SKIP   Z
         GOTO   _ow
         CALL   Dir_OUT
         GOTO   _out

; direkte Ausgabe auf LCD ohne Warten.
Out_imm: MOVWF  RChar

_out:    CALL   Dir_OUT
         ; RS einstellen
         SKIP   toRS_LCD
         BCF    RS_LCD
         SKIP   NOT toRS_LCD
         BSF    RS_LCD
         MOVF   PortB,W
         ANDLW  B'00001111'
         MOVWF  RPort

         ; zuerst hi
         MOVF   RChar,W
         ANDLW  B'11110000'
         IORWF  RPort,W
         MOVWF  PortB
         BCF    RW_LCD
         BSF    CE_LCD
         NOP
         NOP
         BCF    CE_LCD

         ; dann lo
         SWAPF  RChar,W
         ANDLW  B'11110000'
         IORWF  RPort,W
         MOVWF  PortB
         BCF    RW_LCD
         BSF    CE_LCD
         NOP
         NOP
         BCF    CE_LCD
         SKIP   toRS_LCD
         RETURN
         MOVLW  5
         CALL   Wait
         RETURN

; Schreibposition im LCD setzen.

GoLast:  MOVLW  71
         GOTO   SetPosi

GoZeile2:
         MOVLW  64
         GOTO   SetPosi
GoZeile1:
         CLRW

SetPosi: MOVWF  LxPos
         IORLW  B'10000000'
         BCF    toRS_LCD
         CALL   OutLCD
         BSF    toRS_LCD
         MOVLW  15
         ANDWF  LxPos,F
         RETURN


ClrEol:  MOVF   LxPos,W
         ANDLW  16
         SKIP   Z
         RETURN
         MOVLW  ' '
         CALL   SayIt
         GOTO   ClrEol


; LCD initialisieren
InitLCD:
         BCF      CE_LCD      ; CE lo
         BCF      RS_LCD      ; RS lo
         BCF      RW_LCD      ; R/W auf write
         BCF      toRS_LCD    ; auch in den Flags
         MOVLW    30          ; 30 ms
         CALL     Wait
         BCF      toRS_LCD
         MOVLW    B'00101000' ; 4 Bit Modus
         CALL     Out_imm
         MOVLW    10          ; 10 ms
         CALL     Wait
         MOVLW    00010100b   ; CursorMove+rechts
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00001100b   ; On+noCursor+noBlink
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000110b   ; Increment+noShift
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000001b   ; Clear
         CALL     Out_imm
         CALL     Wait_1
         MOVLW    00000011b   ; Clear
         CALL     Out_imm
         CALL     Wait_1
         BSF      toRS_LCD    ; 1 = Zeichenausgabe
         MOVLW    30          ; 30 ms
         CALL     Wait
         CALL     LadeLcdCharset
         RETURN
So, das war's, ist ja auch recht länglich geworden (ausnahmsweise...)
Die restlichen Daten und Unterprogramme (Wait und so) kannst du dir ja 
denken.

W.S.

Autor: Karl B. (gustav)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> Mache nen High-Impuls an E(nable), dann:


Hi,
ein High/Low-Übergang kommt natürlich noch danach. (Impulsdauer meistens 
1000 ns.)
LCD Enable triggert auf die fallende Flanke.


Seier M. schrieb:
> Wie funktioniert die Übertragung, ohne solche Peripherie?

Beitrag "Re: RE Bit Display EA DIP204-4 (KS0073)"
so sieht das Display die Signale.
Im Zeitlupentempo. Und der MC-Port wird entsprechend programmiert.

(OK. Da sind noch Fehler im Video. 0x0C z.B. Aber sollte nur das Prinzip 
veranschaulichen.)

ciao
gustav
P.S.:
Die Portbitzuordnung kann auch anders gewählt werden. 
(Software-Anpassung)
Hier:
LSB-MSB
RS-R/W-Enable-n.c. D4-D5-D6-D7

: Bearbeitet durch User
Autor: Peter D. (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
W.S. schrieb:
> So, das war's, ist ja auch recht länglich geworden

Wer sich heutzutage sich noch mit Assembler abquält, der wird eben mit 
langem und unportablen Code bestraft.

Autor: picfan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe noch eine fertige LCD44780 Routine, geschrieben für einen 
DSPIC30F4012,kann auch für PIC24 direkt eingesetzt werden(gleiche 
Architektur).
Gruss PICFAN

Autor: picfan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier noch zwei Routinen zum Einbinden
Gruss Picfan

Autor: Seier M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Vielen vielen Dank an alle! Ich merke, das Thema ist immer noch sehr 
aktuell!
Dann ist die Ansteuerung ja doch nicht schwierig. Mich hatte eben wie 
gesagt nur die eine Compiler spezifische Anlegung des Buses gewundert.

Hier ist auch noch eine gute Code Sammlung aus diesem Forum:
Beitrag "[ASM & C] HD44780 an PIC24 (3.3V oder 5V)"

Somit ist dieses Thema abgeschlossen, hier wird der eine oder andere 
wohl auf gute Sammlungen zurückgreifen können!
Nochmals Liebend Dank!

-Seier M.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.