www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Ansteuern mit PIC 16F84A funzt nicht


Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
Ich sitze schon einige Tage an der Ansteuerung des LCD Displays und es 
will einfach nicht funktionieren. Ich verwende einen 16F84A PIC und die 
Hitachi HD44780 LCD Steuereinheit Auf dem LCD steht DEM 16216 SYH - PY. 
Ich hab schon überall in Foren gesucht und auch einiges gefunden, jedoch 
nichts das mein LCD zum funktionieren gebracht hat. Im Quellcode kann 
man sehen, dass ich das Beispiel von Sprut.de verwendet hab.

Ich hab sogar die Leitungen zw Display und PIC an ein Oszi 
angeschlossen. Der Fehler liegt irgendwo in der Übertragung vom Init. 
Nachdem es in den 4 Bit Modus umgeschalten wird, sendet der PIC 
irgendwie nur Schrott.

Die erste Zeile des Displays Leuchtet beim Einschalten kurz auf , geht 
wieder aus und leuchtet dann wieder schwach.

Ich hoffe das reicht erstmal an infos. Falls ihr noch was wissen müsst, 
schreibt einfach.

Danke im Voraus für eure Antworten,

Thomas

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch der Quellcode der LCD Ansteuerung. Ich hab das als Anhang 
nicht hinbekommen. Ich hoff ihr seit mir nicht böse.
  list p=16f84
;**************************************************************
;*    Pinbelegung
;*  ----------------------------------  
;*  
;*  PORTB:  0-3  LC Display D4-D7
;*    4  Read/Write
;*    5  Register Select
;*    6  ENABLE 
;*  
;**************************************************************
;
;sprut (zero) Bredendiek 05/2000 (mod. 15.01.2002)
;
; LCD-Display mit Matrixtastatur
;
; Taktquelle: 4 MHz
;
;**************************************************************
; Includedatei für den 16F84 einbinden

  #include <P16f84.INC>

; Configuration festlegen
; bis 4 MHz: Power on Timer, kein Watchdog, XT-Oscillator

  __CONFIG  _PWRTE_ON & _WDT_OFF & _XT_OSC

;**************************************************************
; Variablen festlegen

w_copy  Equ  0x20
s_copy  Equ  0x21
LcdDaten  Equ  0x22
LcdStatus Equ  0x23
loops  EQU  0x24
loops2  EQU  0x25

; Constanten festlegen
PORTC EQU PORTB
PORTD EQU PORTB
EN  equ  4    ; enable Lcd
RW  equ  6    ; read Lcd
RS  equ  5    ; Daten Lcd (nicht control)  

;********************************************************
; Das Programm beginnt mit der Initialisierung

Init  bsf     STATUS, RP0  ; Bank 1
    movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
    movwf  TRISA    ; 
    movlw  B'00000000'  ; PortB alle outputs 
    movwf  TRISB
    bcf     STATUS, RP0  ; Bank 0
    clrf  PORTA    
    clrf  PORTB      
    call  InitLCD    ; Display initialisieren
    call  start
    call   Main

; am LCD "Hallo" ausgeben
  
start
  movlw  'H'
  movwf  LcdDaten
  call  OutLcdDaten
  movlw  'a'
  movwf  LcdDaten
  call  OutLcdDaten
  movlw  'l'
  movwf  LcdDaten
  call  OutLcdDaten
  movlw  'l'
  movwf  LcdDaten
  call  OutLcdDaten
  movlw  'o'
  movwf  LcdDaten
  call  OutLcdDaten

Main        
  goto   Main  

;*****************************************************************  
;Zeitverzögerung um loops * 1 ms
; 4MHz externer Takt bedeutet 1MHz interner Takt
; also dauert 1 ms genau 1000 Befehle
; 110 Schleifen a 9 Befehle sind 990 Befehle = 0.99 ms
; die restlichen 10 Befehle für Einsprung und Rücksprung

WAIT
top      movlw   .110           ; timing adjustment variable (1ms)
         movwf   loops2
top2     nop                    ; sit and wait
         nop
         nop
         nop
         nop
         nop
         decfsz  loops2, F      ; inner loops complete?
         goto    top2           ; no, go again
                                ;
         decfsz  loops, F       ; outer loops complete?
         goto    top            ; no, go again
         return              ; yes, return from subWAIT

;**********************************************************  
; Initialisierung des LCD-Displays

InitLCD
  movlw  D'255'    ; 250 ms Pause nach dem Einschalten
  movwf  loops  
  call  WAIT    

  movlw  B'00000011'  ; 1
  movwf  PORTB
  bsf  PORTB,EN
  nop  
  bcf  PORTB,EN
  
  movlw  D'50'    ; 50 ms Pause
  movwf  loops
  call  WAIT
  
  movlw  B'00000011'  ; 2
  call  Control8Bit
  movlw  B'00000011'  ; 3
  call   Control8Bit
  movlw  B'00000010'  ; 4
  call   Control8Bit

  movlw  B'00000010'  ; löschen und cusor home
  call  OutLcdControl  
  movlw  B'00001000'  ; 5 function set, 4-bit  2-zeilig,  5x7
  call  OutLcdControl  
  movlw  B'00000000'  ; 6 display off
  call  OutLcdControl
  movlw  B'00001000'  ; 7 entry mode, increment, disable display-shift
  call  OutLcdControl
  movlw  B'00000000'  ; 8 cursor home, cursor home
  call  OutLcdControl
  movlw  B'00000001'  ; 9 display on
  call  OutLcdControl
  movlw  B'00000000'
  call  OutLcdControl
  movlw  B'00000110'
  call  OutLcdControl
  return

; ein Steuerbyte 8-bittig übertragen
Control8Bit
  movwf  PORTB
  bsf  PORTB, EN
  nop
  bcf  PORTB, EN
  movlw  D'10'
  movwf  loops
  call   WAIT
  return

; darauf warten, daß das Display bereit zur Datenannahme ist
LcdBusy
        bsf     STATUS, RP0  ; make Port B0..3 input
  movlw  B'00001111'
  iorwf   TRISB, f 
        bcf     STATUS, RP0
BusyLoop    
  bcf  PORTC, RS
  bsf  PORTC, RW  ; Lesen
  bsf  PORTC, EN
  nop
  movf  PORTD, w
  movwf  LcdStatus
  bcf  PORTC, EN
  nop
  bsf  PORTC, EN  ; Enable
  nop
  bcf  PORTC, EN
  btfsc  LcdStatus, RS  ; teste bit 7
  goto  BusyLoop
  bcf  PORTC, RW
        bsf     STATUS, RP0  ; make Port B4..7 output
  movlw  B'00000000'
  andwf   TRISB, f    
        bcf     STATUS, RP0
  return  

; ein Byte mit Steuerdaten von LcdDaten zum Display übertragen
OutLcdControl
  movwf  LcdDaten
  call  LcdBusy
  swapf  LcdDaten, w
  andlw  H'0F'
  movwf  PORTD    ; Hi-teil Daten schreiben
  bsf  PORTC, EN
  nop
  bcf  PORTC, EN  ; Disable LcdBus
  movf  LcdDaten, w
  andlw  H'0F'
  movwf  PORTD    ; Lo-teil Daten schreiben
  bsf  PORTC, EN
  nop
  bcf  PORTC, EN  ; Disable LcdBus
  return

; ein Datenbyte von LCDDaten zum Display übertragen
OutLcdDaten
  movwf  LcdDaten
  call  LcdBusy
  movf  LcdDaten, w
  andlw  H'F0'
  movwf  PORTD    ; Hi-teil Daten schreiben
  bsf  PORTC, RS  ; Daten
  bsf  PORTC, EN  ; Enable LcdBus
  nop
  bcf  PORTC, EN  ; Disable LcdBus  
  swapf  LcdDaten, w
  andlw  H'F0'
  movwf  PORTD    ; Lo-teil Daten schreiben
  bsf  PORTC, RS  ; Daten
  bsf  PORTC, EN
  nop
  bcf  PORTC, EN  ; Disable LcdBus  
  bcf  PORTC, RS  ;
  return

  end    


Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe mit einem DEM16217 auch ewig Probleme gehabt, bis ich die 
Initialisierung etwas abgewandelt habe zu:

WriteCommandByteFourBitMode_LCD(0x03);
Sleep(15);
WriteCommandByteFourBitMode_LCD(0x03);
Sleep(4);
WriteCommandByteFourBitMode_LCD(0x03);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x02);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x10);
Sleep(1);
WriteCommandByteFourBitMode_LCD(0x0c);
WriteCommandByteFourBitMode_LCD(0x01);
WriteCommandByteFourBitMode_LCD(0x00);
WriteCommandByteFourBitMode_LCD(0x28);
WriteCommandByteFourBitMode_LCD(0x80);

probiers mal. Ich glaube das Teil hat keinen HD44780, sondern was 
"halbwegs" kompatibles, KS0070B. Auf www.Sprut.de steht dazu:

Der Controllerchip KS0073
In letyter Zeit tauchen vermehrt Displays mit dem Controller KS0073 von 
Samsung auf. Dieser Chip ist dem HD44780 sehr ähnlich, aber leider nicht 
100% kompatibel. Dass der Controller (im Vergleich zum HD44780) größere 
Displays ohne zusätzliche Spaltentreiber ansteuern kann, ist für den 
Nutzer belanglos, es gibt aber auch einige deutliche Unterschiede mit 
Konsequenzen für die Nutzung:

Displayanschluß
Der Controller hat einen Reseteingang, der normalerweise auf den 
Steckverbinder des Displays herausgeführt ist. Das wirkt sich auf die 
Stecker-Pinbelegung aus. Die Pins 1..14 sind in der Regel normal belegt. 
Dann folgt ein freies Pin (15), dann das Reset-Pin (16) und dann erst 
die LED-Anschlüsse für die Hintergrundbeleuchtung Led+ (17) und LED- 
(18).
Der Reseteingang ist Low-activ und wird im display auf high gezogen. Man 
kann ihn also einfach frei lassen.

RAM-Adressen
Die Anfangsadressen der zweiten (und aller weiteren) Displayzeile 
weichen vom HD44780 Standard ab.

4-Bit-Initialisierung
Die Initialisierung des 4-Bit-Datenbus-Modes weicht etwas vom 
HD44780-Standard ab.

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Display sind sicher sehr gut ... ein paar Tausend davon haben wir 
schon verbaut.

Aber ... da fällt mir auf:

Du verwendest den 16F84A - im Assembler definierst Du den 16F84 ? Warum 
?

Das Programm verwendet dann auch PortC für die Signale und PortD für die 
Daten. In meiner Kopie des Handbuchs für den 16F84A gibt es diese Ports 
nicht...

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit den Bibliotheken des 16f84 war n copy und paste fehler :D. Hab 
die richtigen header eingebunden. PORTC und PORTD sind PORTB nur unter 
anderem Namen: PORTB EQU PORTC usw.

Das Programm funktioniert jedoch immer noch nicht.

Könnte mal jemand nachkontrollieren ob die Initialisierung rein von der 
Übertragung so funktionieren könnte?

danke

Autor: Bernd Rüter (Firma: Promaxx.net) (bigwumpus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,
mich stört die b'00000011' in der Initialisierung.
Hast Du schon mal das Datenblatt des LCD-Controllers durchgesehen ? Da 
stehen für die Initialisierung des 8-Bit-Modus mit 1/2-Zeilen etwas ganz 
anderes drin.

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich hab 2 verschiedene Initialisierungen versucht. Einmal die des 
HD44780 und dann noch die Initialisierung des KS0070B-00.

HD44780 Init:
RS  RW  DB7  DB6  DB5  DB4

Warte 15 ms oder länger
0   0   0    0    1    1
Warte 4,1 ms oder länger
0   0   0    0    1    1
Warte 100 us oder länger
0   0   0    0    1    1

0   0   0    0    1    0    4 Bit Modus
0   0   0    0    1    0
0   0   0    0            1 Zeile, 5 * 7 Zeichen (* = 0)
0   0   0    0    0    0
0   0   1    0    0    0    Display aus
0   0   0    0    0    0
0   0   0    0    0    1    Display clear
0   0   0    0    0    0
0   0   0    1    1    0    Inkrement, Shift aus

KS0070B-00 Init:
RS  RW  DB7  DB6  DB5  DB4

Warte 30 ms oder mehr
0   0   0    0    1    0    4 Bit Modus
0   0   0    0    1    0
0   0   0    0            (* = 0)
Warte 39 us oder mehr
0   0   0    0    0    0
0   0   1    0    1    1    Display aus, Kurser an und blinkend
Warte 39 us oder mehr
0   0   0    0    0    0    Display clear
0   0   0    0    0    1
warte 1.53 ms oder mehr
0   0   0    0    0    0
0   0   0    0    1    0    Inkrement und shift aus

Vielleicht sind die datenblätter die ich hab veraltet oder falsch. Das 
LCD ist vom TYP DEM 16216 SYH-PY. Welcher Controller da jetzt drin is 
steht jedoch nicht drauf.

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich will übrigens im 4 Bit modus übertragen...

Autor: Frank Zöllner (frankovic)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
bei dem Datenblatt hier ist auf Seite 2 in figure 1 der Controller mit 
KS0070 eingezeichnet. Wenn ich Zweifel an einem Display hab, ratter ich 
einfach Zufallszahlen an E, RS, und D4 bis D7. Früher oder später muss 
dann irgendein Buchstabensalat erscheinen...

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sehe gerade unter Beitrag "LCD (Ks0066) initialisieren" , dass 
meine Initialisierung eigentlich eher auf einen KS0066 passt...

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, das hilft mir jetzt zwar nich weiter aber trotzdem danke...
 Kann sich vielleicht jemand noch die beiden initialisierungen anschauen 
die ich oben gepostet hab und mir sagen ob die richtig sind?

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs jetzt endlich hinbekommen, dass das display funktioniert. Es 
zeigt an was ich will, jedoch nur wenn ich es neu an die spannung 
anlege. Drück ich den reset knopf des entwicklungsboards, zeigts nur 
mist an. Kann es an den Wartezeiten liegen? Die Initialisierung muss ja 
stimmen, sonst würde es nie was anzeigen.

Autor: Thomas P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir jemand sagen warum das display nur funktioniert wenn ich es an 
den strom hänge und nicht wenn es schon dran hängt und ich den reset 
knopf drücke?

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da ist einiges im Argen:

1)
Init  bsf     STATUS, RP0  ; Bank 1
    movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
    movwf  TRISA    ; 
    movlw  B'00000000'  ; PortB alle outputs 
    movwf  TRISB

unschön, so eifach den Code bei 0x00 starten zu lassen.  Besser ist, 
sich anzugewöhnen, immer alle Interrupt-Vektoren zu definieren (auch 
wenn sie nicht verwendet werden):
      org   0x00
      goto  Start          ;Reset-Vektor

      org   0x04
      goto  P_ISR          ; Peripheral Interrupt Service Routine

Start:
Init  bsf     STATUS, RP0  ; Bank 1
      movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
      movwf  TRISA    ; 
      movlw  B'00000000'  ; PortB alle outputs 
      movwf  TRISB
      :


2)
      :
      call  InitLCD    ; Display initialisieren
      call  start

Wenn du 'call start' aufrrufst, musst Du auch mit 'return' wieder zurück 
springen!


3)
    call   Main

und hier kommt ein 'goto Main' hin, kein 'call Main'


Der entsprechende Codeausschnitt sollte dann so aussehen:
      :
      org   0x00
      goto  Start    ;Reset-Vektor

      org   0x04
      goto  P_ISR    ; Peripheral Interrupt Service Routine
  
;********************************************************
; Das Programm beginnt mit der Initialisierung

Start:
Init  bsf     STATUS, RP0  ; Bank 1
      movlw  B'11111000'  ; RA0 .. RA2 outputs, RA3, RA4 input 
      movwf  TRISA    ; 
      movlw  B'00000000'  ; PortB alle outputs 
      movwf  TRISB
      bcf     STATUS, RP0  ; Bank 0
      clrf  PORTA    
      clrf  PORTB      
      call  InitLCD    ; Display initialisieren
      call  start      ; "Hallo ausgeben" 
      goto  Main       ; <<<<<< HIER 'GOTO', NICHT 'CALL' !!!


P_ISR:                 ; Hier eventuell Interrupts handeln
      retfi            ; /

; am LCD "Hallo" ausgeben  
start
      movlw  'H'
      movwf  LcdDaten
      call  OutLcdDaten
      movlw  'a'
      movwf  LcdDaten
      call  OutLcdDaten
      movlw  'l'
      movwf  LcdDaten
      call  OutLcdDaten
      movlw  'l'
      movwf  LcdDaten
      call  OutLcdDaten
      movlw  'o'
      movwf  LcdDaten
      call  OutLcdDaten
      return          ; <<<<< HIER MIT 'RETURN' VERLASSEN     


Main  goto   Main     ; boah is dat langweilig

      :

Autor: Raoul R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute!

Habe selbiges Display und Problem wie Thomas P. Leider kann ich diesem 
Forum keine E-Mailadresse von Thomas etlocken ...
Gleich vorweg muß ich sagen, dass ich den ICD2 und pic18f2552 erst seit 
~zwei  Wochen besitze & mich seit dem intensiv damit beschäftige! Bin 
also daweil noch bissl "greenhorn". :D
Ich würde zu gerne wissen woran es bei Thomals gelegen hat und wie weit 
das Datenblatt korrekt ist. Mir scheint das Datenblatt ist Müll o. ä.! 
Bin mir nicht sicher, denke aber selber einen kleinen Fehler in der 
Angabe entdeckt zu haben. Weiters meinte ein Bekannter (den ich leider 
diesbezüglich nicht allzusehr ausquetchen kann), er hatte mit dem 
gleichen Display sehr gekämpft, vorallem weil die Timings aus dem 
Datenblatt nicht korrekt angegeben waren. Leider hat er den Code zu dem 
Display nicht mehr [...].

Mich würde interessieren, ob & wie man dieses Display rücksetzen kann 
(reset). So weit ich gemessen habe, sind die Daten- und Steuerleitungen 
(R/W, RS) des DEM16216 im Betrieb auf hi. Wenn ich nun den Pic 
konfiguriere (alle am LCD angeschlossenen Pins auf output, lo setze), 
und somit den Port des LCD auf lo ziehe, habe ich bereits eine fallende 
"enable" Flanke generiert und damit Daten gesendet (jain, denn die 
Portbits werden "ohne Delay" konfiguriert). Bitte korrigiert mich wenn 
ich nicht richtig liege!

Ich verwende den MCC18 Kompiler, somit habe ich keinen Assemblercode bei 
Hand, aber der Kern meiner Vorgehensweise zum Initialisieren, welche 
anscheinend nicht korrekt abläuft, ist in dieser:

 /*---BEGIN Code---*/

 resetPins(); //alle Pins (D4-D7, R/W, RS) output, lo
 
 //Delay > ~30ms
 //set function mode:
 enableE();   //enable -> hi (berücksichtigt data hold time
              //und min. Cycle time.
 LCD_D04 = 0; //nicht berücksichtigt
 LCD_D05 = 1; //nicht berücksichtigt
 LCD_D06 = 1; //5x10 pixel
 LCD_D07 = 1; //2-zeilen
 disableE();  //enable -> lo (berücksichtigt data hold time
              //und min. Cycle time.

 
 //delay > ~40µs
 //set display on/off, cursor mode:
 enableE();
 LCD_D04 = 1; //blinken an
 LCD_D05 = 1; //cursor an
 LCD_D06 = 1; //display an
 LCD_D07 = 1; //vorgabe aus datenblatt
 disableE();
 
 //delay > ~40µs
 //clear display:
 enableE(); 
 LCD_D04 = 1; //vorgabe aus datenblatt
 LCD_D05 = 0;
 LCD_D06 = 0;
 LCD_D07 = 0;
 disableE();

 //delay > ~1.60ms
 //set entry mode:
 enableE();
 LCD_D04 = 0; //alles shift aus
 LCD_D05 = 1; //increment modus
 LCD_D06 = 0; //ich vermute hier sollte eine 1 stehen, laut
              //datenblatt (für 4-bit modus) jedoch 0
 LCD_D07 = 0;
 disableE();

 /*--- END Code ---*/
 

Frank Zöllner hat von Zufallszahlen geredet, ich habs mal ausprobiert, 
doch entweder mache ich es komplett falsch oder mein Display ist ein 
Sturkopf lol. Es rührt sich nämlich garnichts!

Bei allem was ich bisher versucht habe, ist das Resultat immer das 
selbe. Am Display sind die Felder der ersten Zeile alle vollkommen 
schwarz ausgefüllt. Die der zweiten jedoch nicht!

Hätte noch ne Frage zum Delay. Angenommen ich verwende einen 2mHz 
Oszilator, so is eine Clock 0,5µs lang. Wenn ich nun ein Delay von 2µs 
plane, so muß ich zwei Nop(); abwarten? Muß ich von vier Clocks pro Nop 
ausgehen? Ich verwende die Delayfunktionen aus der Microchip Library, 
somit sollten meine Timings schlimmstenfalls 4x zu lang sein, obwohl ich 
sie sowieso seeehr großzügig eingestellt habe :D.


Ich bin für jeden Tipp dankbar!

lg, raoul

Autor: Frank Zöllner (frankovic)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zufallszahlen in dem Sinn dass wild an den Datenbits und auch an RS, E 
usw. rumgeklappert wird. Eigentlich kommt da bei jedem Display ganz 
schnell irgendwas. Dachte auch schon oft das LCD ist hinüber, dieser 
Test beweist ganz schnell das Gegenteil. Man kann ein mit obiger 
Grobmethode "initialisiertes" Display dann danach auch regulär 
ansprechen. Also rumklappern bis was kommt, dann versuchen ordnungsgemäß 
was draufzuschreiben. Wenn das hinhaut, ist nur im Init was faul. Wenn 
nicht, stimmt ganz grundsätzlich, vermutlich an der Beschaltung, was 
nicht.

Autor: Raoul R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke erstmal für die schnelle Antwort!
Bzgl. Zufallszahlen habe ich mir zuerst ausgedacht keine Zufallszahlen, 
sondern alle Möglichkeiten eines 6-bit Busses zu senden. Dabei ist mir 
die Datenübertragung eingefallen, welche in zwei Taktzyklen 
abgeschlossen wird. Somit bin ich auf die unten angeführte, 
wahrscheinlich zu komplizierte :D :D, Variante gekommen.
/**
 * @2MHz
 */
void bruteForcePins(void) {
  unsigned int data = 17;
  unsigned int data1 = 17;
  unsigned short int rw_rs = 5; 

  while (rw_rs > 0) {
    --rw_rs;
    LCD_RW  = (rw_rs & 1<<0) ? 1 : 0;
    LCD_RS  = (rw_rs & 1<<1) ? 1 : 0;

    while (data > 0) {
      --data;
      LCD_E = 1;
      LCD_D04 = (data & 1<<0) ? 1 : 0;
      LCD_D05 = (data & 1<<1) ? 1 : 0;
      LCD_D06 = (data & 1<<2) ? 1 : 0;
      LCD_D07 = (data & 1<<3) ? 1 : 0;
      Delay100TCYx(10);
      LCD_E = 0;
      Delay100TCYx(10);

      while (data1 > 0) {
        --data1;
        LCD_E = 1;
        LCD_D04 = (data1 & 1<<0) ? 1 : 0;
        LCD_D05 = (data1 & 1<<1) ? 1 : 0;
        LCD_D06 = (data1 & 1<<2) ? 1 : 0;
        LCD_D07 = (data1 & 1<<3) ? 1 : 0;
        Delay100TCYx(10);
        LCD_E = 0;
        Delay100TCYx(10);
      }
    }
  }
}

Müßte ich das Display nicht zwischendurch resetten, oder gelangt es 
durch diese "Attacke" nie in einem undefinierten Zustand?

lg, raoul

Autor: Raoul R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe es nun geschafft !!

Die Idee mit den Zufallszahlen ist eine sehr gute!! Ich habe die 
Funktion nochmals übderdacht und mit den Sequenzen am unteren Limit 
angefangen (von 0) und bis zum Oberen duchlaufen (bis, je nach 
Anschlusmodus, 2^6 oder 2^10). Dabei habe ich nur einen Duchrgang dür 
die Datenbits berücksichtigt (ich neige dazu zu kompliziert zu denken :) 
). Siehe da, es hat zumindest irgendwas angezeigt. Hurra!

Was ich verschlampt habe, war, dass ich V0 (LCD-Versorgung) an Masse 
gezogen habe. Damit war der Balken, also die erste Zeile, schwarz wie 
die Nacht. Man konnte daher nur von der Seite etwas erkennen. Bei 
Zimmertemperatur erziele ich zwischen 0.5V - 1.5V ein gutes Ergebnis.

Der Initialisierungscode hat sich nicht viel geändert, aber für all 
diejenigen die auch Troubles damit haben, schreibe ich es nochmals hin 
wie ich mein DEM16216 SYH-PY/zu etwas bewegen konnte:
 resetPins();
 wait500ms();

 LCD_E = 1;
 LCD_D04 = 0;  //function mode
 LCD_D05 = 1;
 LCD_D06 = 1;
 LCD_D07 = 1;
 wait12us();
 LCD_E = 0;
 wait50ms();


 LCD_E = 1;
 LCD_D04 = 1; //disp control
 LCD_D05 = 1;
 LCD_D06 = 1;
 LCD_D07 = 1;
 wait12us();
 LCD_E = 0;
 wait50ms();


 LCD_E = 1; //clear display
 LCD_D04 = 1;
 LCD_D05 = 0;
 LCD_D06 = 0;
 LCD_D07 = 0;
 wait12us();
 LCD_E = 0;
 wait50ms();

 LCD_E = 1; //entry mode
 LCD_D04 = 0;
 LCD_D05 = 1;
 LCD_D06 = 1;
 LCD_D07 = 0;
 wait12us();
 LCD_E = 0;
 wait50ms();

Vielen Dank an Frank, für den Hinweis mit den Zufallszahlen!

lg, raoul

Autor: Raoul R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo allerseits !!

Da es mich Zeit & Nerven gekostet hat, wirklich richtig zu 
initialisieren, hier noch ein kleiner Beitrag zur richtigen 
Initialisierung des KS0070B Kontrollers, dessen Beschreibung im 
Datenblatt nicht korrekt/vollständig ist. Die Initialisierung klappt 
nicht wenn das LCD nicht zuvor vom Strom genommen wurde (siehe: Thomas P 
am 20.07.2007 (10:52)). Die im Manual angeführte Initialsierungssequenz 
funktioniert NUR wenn das LCD vorher stromlos war. Wurde es bereits 
initialisiert, und sollte es nochmals initialisiert werden (z.B. Reset 
oder neuer Programmdurchlauf des PIC), so muß wie unter [2] 
initialisiert werden.

Begründung hier [1]


hth & lg, raoul

[1] 
http://www.myavr.de/myForum/viewtopic.php?p=3087&s...
[2] http://www.sprut.de/electronic/lcd/index.htm#init

Autor: margo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe auch Probleme beim Ansteuern des LCDs mit PIC18F4550, aber ich 
programmiere gerade in C kann mir jemand sagen wie ich vorgehen kann??

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

da hier auch das Display:

DEM 16216 SYH-LY

vorkommt,
mal eine Frage hierzu.
gibt es dieses auch in anderer Farbe ?
ich denke, dass LY für light yellow steht, daher nehme ich das an,
ich bin auf der Suche nach einem andersfarbigen, es muss aber 
schaltungsmäßig kompatibel sein (Bausatz!)

danke für Info,

Gruss A.

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.