Forum: Mikrocontroller und Digitale Elektronik 4x20 Zeichen mit KS0066 funktioniert nicht (4-Bit)


von Roli (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab nun schon einige Zeit in den Foren verbracht und dies und das 
probiert aber alles schlägt fehl.

Ich versuche das LCD mit einem Atmega8535 anzusteuern. Der müsste das 
doch könnnen oder?

Wie ihr unten sehen könnt, habe ich zuerst versucht das Display mit den 
nun unten auskommentierten Befehlen anzusprechen. Danach habe ich 
versucht das Display nur mit den letzten Zeilen der einzelnen 
Initialisierungsschritte anzusteuern. Die Zeiten habe ich auch ma hoch 
und runter gesetzt. Die defines sind nur um zu sehen was wo 
angeschlossen ist. Vielleicht ist das ja auch schon mein Fehler? Am 
falschen Port?
Kann ich das Display so überhaupt ansteuern? Dass es einfacher geht habe 
ich schon etlichen anderen routinen entnommen aber alle gehen net :(

Über etwas Hilfe würde ich mich freuen.


Hier habe ich mal den gesamten Quelltext:

#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

/*
#define LCD_PORT         PORTC        *< port for the LCD lines
#define LCD_DATA0_PIN    3            *< pin for 4bit data bit 0
#define LCD_DATA1_PIN    4            *< pin for 4bit data bit 1
#define LCD_DATA2_PIN    5            *< pin for 4bit data bit 2
#define LCD_DATA3_PIN    6            *< pin for 4bit data bit 3
#define LCD_E_PIN        0            *< pin  for Enable line
#define LCD_RS_PIN       1            *< pin  for RS line
#define LCD_RW_PIN       2            *< pin  for RW line
*/

  DDRC = 0b11111111;  //Pins auf Ausgang
  PORTC = 0x00;


  _delay_ms(150);    //Bootzeit für das Display

/*// 1. Zeile Function Set

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00010001;  //Function set Zeile 1 oberes Nibble
  _delay_us(20);

  PORTC = 0b00010000;  //Enable AUS
  _delay_us(20);

  PORTC = 0b00010001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Function set Zeile 1 unteres Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_ms(10);

//2. Zeile Function Set

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00010001;  //Function set Zeile 1 oberes Nibble
  _delay_us(20);

  PORTC = 0b00010000;  //Enable AUS
  _delay_us(20);

  PORTC = 0b00010001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Function set Zeile 1 unteres Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_ms(10);
*/
//3. Zeile Function Set

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b01100001;  //Function set Zeile 1 oberes Nibble
  _delay_us(40);

  PORTC = 0b01100000;  //Enable AUS
  _delay_us(40);

  PORTC = 0b01100001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00100001;  //Function set Zeile 1 unteres Nibble
  _delay_us(40);

  PORTC = 0b00100000;  //Enable AUS
  _delay_ms(45);    //Zeit nach Function Set


/*//1.Zeile Display on/off control

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Display on/off control Zeile 1 oberes Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(20);

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Display on/off control Zeile 1 unteres Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_ms(10);
*/
//2.Zeile Display on/off control

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b01111001;  //Display on/off control Zeile 1 oberes Nibble
  _delay_us(40);

  PORTC = 0b01111000;  //Enable AUS
  _delay_us(40);

  PORTC = 0b01111001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00000001;  //Display on/off control Zeile 1 unteres Nibble
  _delay_us(40);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(45);

/*//1.Zeile Display clear

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Display clear Zeile 1 oberes Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(20);

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Display clear Zeile 1 unteres Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(45);
*/
//2.Zeile Display clear

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00001001;  //Display clear Zeile 1 oberes Nibble
  _delay_us(40);

  PORTC = 0b00001000;  //Enable AUS
  _delay_us(40);

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00000001;  //Display clear Zeile 1 unteres Nibble
  _delay_us(40);

  PORTC = 0b00000000;  //Enable AUS
  _delay_ms(2);

/*//1.Zeile Entry Mode

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Entry Mode Zeile 1 oberes Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(20);

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(20);

  PORTC = 0b00000001;  //Entry Mode Zeile 1 unteres Nibble
  _delay_us(20);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(45);
*/
//2.Zeile Entry Mode

  PORTC = 0b00000001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00111001;  //Entry Mode Zeile 1 oberes Nibble
  _delay_us(40);

  PORTC = 0b00111000;  //Enable AUS
  _delay_us(40);

  PORTC = 0b00111001;  //Enable EIN
  _delay_us(40);

  PORTC = 0b00000001;  //Entry Mode Zeile 1 unteres Nibble
  _delay_us(40);

  PORTC = 0b00000000;  //Enable AUS
  _delay_us(45);


return (0);
}

von derKoch (Gast)


Lesenswert?

hallo,
so wie das aussieht legst du erst enable auf high und änderst dann die 
daten - das müsste glaub ich eher andersrum sein. also erst data anlegen 
und dann einen clocktakt senden.
du hast den gesamten portC auf ausgang... da ist vorsicht geboten bei 
ansteuerung des RW-eingangs, es sei denn du willst wissen wer von den 
beiden stärker ist.
ich hab mal gehört das der 4bit-modus am sichersten erreicht wird wenn 
das FunctionSet 3x gesendet wird. Das ist laut deinem Anhang 0b1100xxxx 
und nicht (so wie du es sendest) 0b0110xxxx. dabei brauchst du aber das 
2. (untere) nibble nicht mit übertragen. Man übertragt quasi 3 halbe 
nibble mit 0b1100.
und du musst beachten das die leitungen an db7-db4 am display 
angeschlossen werden.

viel erfolg

von derKoch (Gast)


Lesenswert?

ach vergiss was ich vorhin geschrieben habe - es ist schon spät...
4bit modus ist 0b0010 xxxx und 2-zeilig+on mit 0b1100 1100

von Roland B. (Firma: Privat) (roli)


Angehängte Dateien:

Lesenswert?

Schon ma vielen dank für die schnelle hilfe!!

derKoch schrieb:
> so wie das aussieht legst du erst enable auf high und änderst dann die
> daten - das müsste glaub ich eher andersrum sein. also erst data anlegen
> und dann einen clocktakt senden.

In dem Datenblatt ist das auch so dargestellt in dem Zeitdiagramm.


derKoch schrieb:
>ich hab mal gehört das der 4bit-modus am sichersten erreicht wird wenn
>das FunctionSet 3x gesendet wird. Das ist laut deinem Anhang 0b1100xxxx
>und nicht (so wie du es sendest) 0b0110xxxx. dabei brauchst du aber das
>2. (untere) nibble nicht mit übertragen. Man übertragt quasi 3 halbe
>nibble mit 0b1100

das mit dem 3x senden probier ich mal. woher weiss aber dann der µC, ob 
das die oberen oder unteren 4 nibble sind?
ich muss doch zuerst die oberen und dann die unteren senden.. oder lass 
ich die unteren dann auf 0?

du musst beachten, dass ich den datenbus an portC3 - C6 angeschlossen 
habe.

das heisst dann also den port wo der RW angeschlossen ist auf eingang 
setzen?

Gruß Roli

von derKoch (Gast)


Lesenswert?

hmm. tatsache! da liest das display wohl bei der fallenden flanke von 
enable.
bei der initialisierung auf 4bit-breite sind die unteren 4bit egal, oben 
durch 'X' dargestellt. die kannst du sozusagen unverändert lassen und 
nur enable takten.
du hast recht mit dem 3x senden, da tuste 4x enable takten und hast 
somit 2x 8bit übertragen-> die 1. und 2. Zeile für FunctionSet. das mit 
dem 3x senden ging wohl nur darum, das display aus jedem modus heraus 
sicher auf 4bit umzuschalten egal ob es selbst grad auf 4bit steht (und 
zum beispiel zwischen oberen und unteren nibble).
ich meinte mit dem datenbusanschluss die displayseite - db7-db4. also 
die obere hälfte ;-)
den rw-'ausgang' am prozessor musst du so einstellen dass das display 
daten liest. denn wenn du auf daten senden stellst (z.B. busyflag 
auslesen), dann treibt das display selber die datenleitungen ... und das 
ist nicht so gut für alle beteiligten.

von Jobst M. (jobstens-de)


Lesenswert?

Du musst es erst mal sicher in den 8-Bit-Mode versetzen.
Dann musst Du es vom 8-Bit-Mode in den 4-Bit-Mode versetzen. Das ist 
(noch) ein Byte, denn den Befehl bekommt es ja 8-bittig.
Danach Kommunizierst Du in Nibbles mit dem LCD. Die höherwertigen Bits 
zuerst.

Das sieht bei mir in ASM so aus:
1
LCD_init:  CALL  WAIT_15ms
2
           CALL  WAIT_15ms
3
4
           LDI   temp, 0x30        ; jeweils immer mit pause im 8-Bit modus auf 8-Bit setzen
5
           CALL  LCD_command_8     ; LCD-Kommando in 8-Bit
6
           CALL  WAIT_15ms
7
8
           LDI   temp, 0x30
9
           CALL  LCD_command_8
10
           CALL  WAIT_15ms
11
12
           LDI   temp, 0x30
13
           CALL  LCD_command_8
14
           CALL  WAIT_15ms
15
       
16
; Hier nun ganz ganz sicher im 8-Bit-Modus
17
18
           LDI   temp, 0x20        ; von 8 auf 4 Bit umschalten
19
           CALL  LCD_command_8
20
           CALL  WAIT_15ms
21
22
; Nun im 4-Bit-Modus
23
24
; Weitere Konfiguration in 4-Bit-Mode
25
26
  ; Function Set
27
           ; Interface ist 8 Bit, 2 Zeilen (1x16=2x8), 5x7 Pix
28
           ; 20 = code
29
           ; 10 = 8Bit - /4Bit
30
           ;  8 = 2 Zeilen - /1 Zeile   (16x1 = 8x2 !)
31
           ;  4 = 5x10 - /5x7
32
           LDI   temp, 0x28
33
           CALL  LCD_command       ; LCD-Kommando in 4-Bit
34
           CALL  WAIT_15ms
35
    
36
  ; Display AN
37
          ;  8 = code
38
          ;  4 = Display ein - /aus
39
          ;  2 = cursor aus - /ein
40
          ;  1 = cursor blink - /still
41
          LDI   temp, 0x0C
42
          CALL  LCD_command
43
          CALL  WAIT_15ms
44
45
  ; Display loeschen
46
          CALL  LCD_clr
47
48
  ; Entry Mode set
49
          ; Nicht schieben (egal welche Richtung :)
50
          ;  4 = code
51
          ;  2 = increment - /decrement
52
          ;  1 = shift display
53
          LDI   temp, 0x06
54
          CALL  LCD_command
55
          CALL  WAIT_15ms
56
57
    RET


Gruß

Jobst

von Roli (Gast)


Lesenswert?

Ich hab nun mal noch ein biisl rumgesucht un festgestellt, dass es noch 
ein weiteres Datenblatt zu dem Display gibt und da ist nun ein ST7066 
controller drauf. es ist schon super wenn der händler das falsche 
datenblatt dazugibt.
nur funktioniert das Display immer noch nicht.

von Jobst M. (jobstens-de)


Lesenswert?

Roli schrieb:
> da ist nun ein ST7066
> controller drauf.

Hab's mir gerade angesehen.
Ist kompatibel - sollte also genau so laufen.


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Ich habe mir eben im übrigen nochmal das Flussdiagramm oben angesehen.
Das kannst Du knicken ...


Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Angehängte Dateien:

Lesenswert?

so hab nun den code:
das display schaltet aber die 2. und 4. zeile net schwarz so wie beim 
einschalten die 1. und 3. zeile (also alle balken schwarz)




#include <avr/io.h>
#include <util/delay.h>

int main(void)
{

/*
#define LCD_PORT         PORTC        *< port for the LCD lines
#define LCD_DATA0_PORT   LCD_PORT     *< port for 4bit data bit 0
#define LCD_DATA1_PORT   LCD_PORT     *< port for 4bit data bit 1
#define LCD_DATA2_PORT   LCD_PORT     *< port for 4bit data bit 2
#define LCD_DATA3_PORT   LCD_PORT     *< port for 4bit data bit 3
#define LCD_DATA0_PIN    3            *< pin for 4bit data bit 0
#define LCD_DATA1_PIN    4            *< pin for 4bit data bit 1
#define LCD_DATA2_PIN    5            *< pin for 4bit data bit 2
#define LCD_DATA3_PIN    6            *< pin for 4bit data bit 3
#define LCD_E_PORT       LCD_PORT     *< port for Enable line
#define LCD_E_PIN        0            *< pin  for Enable line
#define LCD_RS_PORT      LCD_PORT     *< port for RS line
#define LCD_RS_PIN       1            *< pin  for RS line
#define LCD_RW_PORT      LCD_PORT     *< port for RW line
#define LCD_RW_PIN       2            *< pin  for RW line
*/

  DDRC = 0b11111111;            //Pins auf Ausgang
  PORTC = 0x00;


  _delay_ms(30);              //Bootzeit für das Display
  _delay_ms(30);
  _delay_ms(30);
  _delay_ms(30);

// 8 Bit Modus aktivieren Nr 1

  PORTC = 0b00000001;            //Enable EIN
  _delay_us(45);

  PORTC = 0b00011001;            //Function set Zeile 1 oberes Nibble
  _delay_us(45);

  PORTC = 0b00011000;            //Enable AUS
  _delay_ms(9);



// 8 Bit Modus aktivieren  Nr 1

  PORTC = 0b00000001;            //Enable EIN
  _delay_us(45);

  PORTC = 0b00011001;            //Function set Zeile 1 oberes Nibble
  _delay_us(45);

  PORTC = 0b00011000;            //Enable AUS
  _delay_us(200);


// 8 Bit Modus aktivieren Nr 3 ohne delay

  PORTC = 0b00000001;            //Enable EIN
  _delay_us(45);

  PORTC = 0b00011001;            //Function set Zeile 1 oberes Nibble
  _delay_us(45);

  PORTC = 0b00011000;            //Enable AUS
  _delay_us(45);




// 1. Zeile Function Set 4 Bit Modus

  PORTC = 0b00000001;            //Enable EIN
  _delay_us(45);

  PORTC = 0b00010001;            //Function set Zeile 1 oberes Nibble
  _delay_us(45);

  PORTC = 0b00010000;            //Enable AUS
  _delay_ms(2);



// Function Set 4-Bit + 2 Zeilen

  PORTC = 0b00000001;            //Enable EIN
  _delay_ms(2);

  PORTC = 0b00010001;            //Function set Zeile 1 oberes Nibble
  _delay_ms(2);

  PORTC = 0b00010000;            //Enable AUS
  _delay_ms(2);

  PORTC = 0b00000001;            //Enable EIN
  _delay_ms(2);

  PORTC = 0b00011001;            //Function set Zeile 1 unteres Nibble
  _delay_ms(2);

  PORTC = 0b00011000;            //Enable AUS
  _delay_ms(2);




return (0);
}

von Roland B. (Firma: Privat) (roli)


Lesenswert?

Jobst M. schrieb:
> Ich habe mir eben im übrigen nochmal das Flussdiagramm oben angesehen.
> Das kannst Du knicken ...

Warum kann ich das knicken?


ist das vom code her überhaupt so machbar oder schieße ich da am tor 
vorbei?
muss ich vllt andere Ports verwenden?

von Jobst M. (jobstens-de)


Lesenswert?

Meine Güte - was für ein Chaoscode ... :-)

Versuchs mal so:


  PORTC = 0b00000001;            //Enable EIN
  _delay_ms(2);

  PORTC = 0b01000001;            //Function set Zeile 1 unteres Nibble
  _delay_ms(2);

  PORTC = 0b00011000;            //Enable AUS
  _delay_ms(2);



Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Roland Baader schrieb:
> Jobst M. schrieb:
>> Ich habe mir eben im übrigen nochmal das Flussdiagramm oben angesehen.
>> Das kannst Du knicken ...
>
> Warum kann ich das knicken?
>
>
> ist das vom code her überhaupt so machbar oder schieße ich da am tor
> vorbei?
> muss ich vllt andere Ports verwenden?


Naja, Du hast es ja auch nicht so gemacht, wie im Flussdiagram ... ;-)

Schreib Dir mal eine Funktion, mit der Du die Werte in das Display 
schreibst. Oder möchtest Du die Ausgabetexte in der Form auf das Display 
bringen?
Naja - geht ja auch erst mal darum, um zu verstehen, wie das Ding läuft.


Gruß

Jobst

von Jobst M. (jobstens-de)


Lesenswert?

Jobst M. schrieb:
> Meine Güte - was für ein Chaoscode ... :-)
>
> Versuchs mal so:
>
>
>   PORTC = 0b00000001;            //Enable EIN
>   _delay_ms(2);
>
>   PORTC = 0b01000001;            //Function set Zeile 1 unteres Nibble
>   _delay_ms(2);
>
>   PORTC = 0b00011000;            //Enable AUS
>   _delay_ms(2);
>
>
>
> Gruß
>
> Jobst

Das ist natürlich Quark ...

   PORTC = 0b01000001;            //Function set Zeile 1 OBERES Nibble

und dann auch

   PORTC = 0b01000000;            //Enable AUS
so ....

Im übrigen wirst Du früher oder später feststellen, daß man mit R/W 
direkt an GND einen Portpin sparen kann ...



Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Lesenswert?

Jobst M. schrieb:
> Das ist natürlich Quark ...
>
>    PORTC = 0b01000001;            //Function set Zeile 1 OBERES Nibble
>
> und dann auch
>
>    PORTC = 0b01000000;            //Enable AUS
> so ....

Kapier ich net...
ich muss doch das datenbit d5 high setzen...
du sagst ich soll das d7 auf high setzen

Gruß roli

von Jobst M. (jobstens-de)


Lesenswert?

Roland Baader schrieb:
> Kapier ich net...
> ich muss doch das datenbit d5 high setzen...
> du sagst ich soll das d7 auf high setzen
>
> Gruß roli


War das vorher doch richtig?

Das liegt an diesem unüberschaubaren Code.

Du sollst das Kommando 0x28 absetzen. Dann sollte Dein Display so 
funktionieren, wie Du es haben möchtest ...


Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Lesenswert?

Wie gehe ich eigentlich mit dem X in der initialisierung um?
ob ich die signale binär oder hexadezimal hinschreibe habe ich doch 
immer die nullen und einsen anstehen oder nicht?

also ist es doch egal ob ich 0x28 oder 0b 0010 1000 schreibe...?

gruß roli

von Jobst M. (jobstens-de)


Lesenswert?

Naja, 0x28 ist der Wert, den das Display abbekommen soll.

Da Du aber Steuerleitungen nebst Datenleitungen an dem Port hängen hast, 
musst Du die 0x28 schon so aufteilen, daß dies beim Display auch so 
ankommt.

Was Du verschickst, ist in Deinem Code erst mal nicht ersichtlich.


Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Lesenswert?

Jobst M. schrieb:
> Was Du verschickst, ist in Deinem Code erst mal nicht ersichtlich.


für mich schon...
ich aktiviere enable-> dann PORTC = 0b00011001; (für 8 bit modus) un 
dann nur noch enable aus.

bei der negativen flanke von enable liest das display die daten.

die pins C3-C6 sind mit DB4-DB7 mit dem Display verbunden.
weiterhin ist Enable, RW und RS verbunden. (spannungsversorgung auch)

un spätestens wenn ich das display in den 4 bit modus geschaltet und 2 
lines aktiviert habe sollten alle balken schwarz werden.

aber es sind immer nur munter die 1. und die 3. zeile schwarz :(

gruß roli

von derKoch (Gast)


Lesenswert?

ich glaube ich habs:

die functionset-commandos sind alles 8bit-befehle. das lcd erkennt an 
der 'führenden 1' welche einstellung geändert werden soll.

 z.B. 0b00001DCB = display on/off control
      0b000001xx = entrymode set
      0b00000001 = lcd clear, usw...

die in dem o.a. initialisierungsbeispiel jeweils 2 zeilen sind lediglich 
eine folge der 4-bit bandbreite. bei display on/off z.B. musst du 0b0000 
und danach 0b1DCB übertragen. aus dem quelltext ersehe ich aber eine 
übertragung von 0b0000, 0b0000, 0b1DCB, 0b0000. (die ersten 2 nibble 
sollten nichts weiter bewirken, aber die letzten beiden kommen 
'verdreht' am lcd an).
wahrscheinlich kannst du dir auch die 0-bytes zum lcd sparen...

Gruss, derKoch

von Jobst M. (jobstens-de)


Lesenswert?

Guten Morgen!

derKoch schrieb:
> ich glaube ich habs:
>
> die functionset-commandos sind alles 8bit-befehle. das lcd erkennt an
> der 'führenden 1' welche einstellung geändert werden soll.
>
>  z.B. 0b00001DCB = display on/off control
>       0b000001xx = entrymode set
>       0b00000001 = lcd clear, usw...
>
> die in dem o.a. initialisierungsbeispiel jeweils 2 zeilen sind lediglich
> eine folge der 4-bit bandbreite. bei display on/off z.B. musst du 0b0000
> und danach 0b1DCB übertragen.

Bingo!

> aus dem quelltext ersehe ich aber eine
> übertragung von 0b0000, 0b0000, 0b1DCB, 0b0000. (die ersten 2 nibble
> sollten nichts weiter bewirken, aber die letzten beiden kommen
> 'verdreht' am lcd an).
> wahrscheinlich kannst du dir auch die 0-bytes zum lcd sparen...

Ich weiß zwar nicht, welchen Quelltext Du jetzt meinst, aber so ist es.


 *Edit:*

Du meinst das hier?
1
/*//1.Zeile Display clear
2
3
  PORTC = 0b00000001;  //Enable EIN
4
  _delay_us(20);
5
6
  PORTC = 0b00000001;  //Display clear Zeile 1 oberes Nibble
7
  _delay_us(20);
8
9
  PORTC = 0b00000000;  //Enable AUS
10
  _delay_us(20);
11
12
  PORTC = 0b00000001;  //Enable EIN
13
  _delay_us(20);
14
15
  PORTC = 0b00000001;  //Display clear Zeile 1 unteres Nibble
16
  _delay_us(20);
17
18
  PORTC = 0b00000000;  //Enable AUS
19
  _delay_us(45);
20
*/
21
//2.Zeile Display clear

Ja, das ist Nonsense ...
Genau so wie das, was dahinter kommt.
Vielleicht siehst Du nun ein, daß Dein Code unübersichtlich ist ... ;-)


Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Angehängte Dateien:

Lesenswert?

Hi leute!

hab nun ma den code ausm tutorial genommen und ihn umgestrikt. die hex 
befehle habe ich auch angepasst.
aber gehen tut das immer noch net :(
was mache ich nun noch falsch? weiss das jemand?

hier is ma die angepasste init. zu der vorlage die ich direkt vom 
hersteller bekommen habe.
1
// Initialisierung: muss ganz am Anfang des Programms aufgerufen werden.
2
void lcd_init( void )
3
{
4
    // verwendete Pins auf Ausgang schalten
5
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
6
                   (1<<LCD_RS) |                // R/S Leitung
7
                   (1<<LCD_EN);                 // Enable Leitung
8
    LCD_DDR |= pins;
9
 
10
    // initial alle Ausgänge auf Null
11
    LCD_PORT &= ~pins;
12
 
13
    // warten auf die Bereitschaft des LCD
14
    _delay_ms( LCD_BOOTUP_MS );
15
16
    
17
    // Soft-Reset muss 3mal hintereinander gesendet werden zur Initialisierung 
18
(DAS STEHT AUCH SO AUF EINEM DATENBLATT DER HP DES HERST. 
19
MACH ICH DAS NET GEHTS AUCH NET!!)
20
21
22
23
    lcd_out( LCD_SOFT_RESET );
24
    _delay_ms( LCD_SOFT_RESET_MS1 );
25
26
    lcd_out( LCD_SOFT_RESET );
27
    _delay_ms( LCD_SOFT_RESET_MS2 );
28
    
29
    lcd_out( LCD_SOFT_RESET );
30
    _delay_ms( LCD_SOFT_RESET_MS3 ); 
31
32
            
33
                 
34
    // 4-bit Modus / 2 Zeilen / 5x7
35
    lcd_command( LCD_SET_FUNCTION |
36
                 LCD_FUNCTION_4BIT |
37
                 LCD_FUNCTION_2LINE |
38
                 LCD_FUNCTION_5X7);
39
40
    // 4-bit Modus / 2 Zeilen / 5x7
41
    lcd_command( LCD_SET_FUNCTION |
42
                 LCD_FUNCTION_4BIT |
43
                 LCD_FUNCTION_2LINE |
44
                 LCD_FUNCTION_5X7);                                
45
 
46
    // Display ein / Cursor aus / Blinken aus
47
    lcd_command( LCD_SET_DISPLAY |
48
                 LCD_DISPLAY_ON |
49
                 LCD_CURSOR_ON |
50
                 LCD_BLINKING_ON); 
51
   
52
    lcd_clear();
53
54
    // Cursor inkrement / kein Scrollen
55
    lcd_command( LCD_SET_ENTRY |
56
                 LCD_ENTRY_INCREASE |
57
                 LCD_ENTRY_NOSHIFT );
58
}

von Karl H. (kbuchegg)


Lesenswert?

Roland Baader schrieb:
> Hi leute!
>
> hab nun ma den code ausm tutorial genommen und ihn umgestrikt.

Was genau hast du angepasst?

Solange die 4 Datenbits allesamt an einem Port liegen, musst du am Code 
höchst wahrscheinlich gar nichts oder nicht viel anpassen.
Die Hauptarbeit der Konfiguration geschieht in der #define Section im 
Header File

> die hex
> befehle habe ich auch angepasst.

Wie bitte?
An denen musst du normalerweise überhaupt nichts anpassen

> aber gehen tut das immer noch net :(
> was mache ich nun noch falsch? weiss das jemand?

Da du ein KS_wasweißich hast

Hol dir die LCD Routinen vom Peter Fleury, trag im Header File deine 
Konfiguration ein und hör auf da selber was umzustricken. Soweit bist du 
offensichtlich noch nicht,, dass du dir da nicht mehr Fehler reinhaust 
also du gut machst.

von Timmo H. (masterfx)


Lesenswert?

Hast du mal die Lib versucht? Läuft bei mir wunderbar: 
http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip

von Roli (Gast)


Lesenswert?

SORRY HABE VERGESSEN DAZUZUSCHREIBEN DASS DAS EIN ST7066U IST.
WEGEN DES GROßEN ERFOLGS HABE ICH IM NETZ NACH LÖSUNGEN GESUCHT UND EINE 
WEITERE DOKU ZUM DISPLAY GEFUNDEN.... UND DANN HAB ICH DEN HERSTELLER 
GEFRAGT WAS ICH FÜR EINE BRAUCH UND DER HAT MIT DANN NOCH NE ANDERE 
GESCHICKT!!!

EINGEFÜGT HAB ICH DIE DOKU BEI MEINEM LETZTEN BEITRAG.

DIE GRÖßTE FRAGE IST, OB DER ABLAUF MEINES PROGRAMMTEILS ZUR 
INITIALISIERUNG SO PASST???

DASS ICH KEIN PROFI BIN WEISS ICH AUCH. ICH DACHTE HALT ES GIBT FOREN UM 
FRAGEN AN ANDERE ZU STELLEN.

DANKE AUCH AN DIE DIE SCHON GESCHRIEBEN HABEN. AUCH WENN SE MICH FÜR 
DOOF HALTEN :)

GRUß Roli

von Klaus W. (mfgkw)


Lesenswert?

Ruf doch nochmal beim Hersteller und frage, ob er eine funktionierende 
Tastatur für dich hat.

von Klaus W. (mfgkw)


Lesenswert?

Roli schrieb:
> DASS ICH KEIN PROFI BIN WEISS ICH AUCH. ICH DACHTE HALT ES GIBT FOREN UM
> FRAGEN AN ANDERE ZU STELLEN.

Im Prinzip ja.

Aber ein Forum kann nicht jedem, der ein LCD betreiben will, wieder von 
vorne Byte für Byte alles vorkauen.

Nimm doch eine funktionierende Lösung, davon gibt es genug.

Dann kannst du (falls es dich interessiert, warum deine nicht geht),
Stück für Stück vergleichen.
Das kannst du selbst, und brauchst nicht für jedes Stückchen jemanden
anders.

Und wenn du etwas nicht verstehst, obwohl du dich selbst darum bemühst,
kannst du sicher gerne fragen.
Dann aber bitte verständlich, mit lesbaren Quelltexten und einer
vernünftigen Beschreibung (was habe ich geändert? warum?
was funktioniert nicht? wie ist das alles angeschlossen?
was gefällt mir an der funktionierenden Standardlösung nicht?)

von Roland B. (Firma: Privat) (roli)


Lesenswert?

Roli schrieb:
> DIE GRÖßTE FRAGE IST, OB DER ABLAUF MEINES PROGRAMMTEILS ZUR
> INITIALISIERUNG SO PASST???

Für mich wäre diese frage ausreichend.

Wenn ich programmieren könnt und dann könnt ich jemandem sagen ob das so 
ok ist. Davon geh ich mal aus. Ich bin nun ma keiner der was verwendet 
bzw. damit experimentiert un net weiss wie das geht. Es ging in diesem 
Fall auch nur noch um den programmteil. Ich werde nun ma versuchen ohne 
veränderung an dem programm das ganze zu testen. (das von Timmo H.)

Vielleicht klappts ja. Das is ja ma mein ziel!! :)

Gruß Roli

von Spess53 (Gast)


Lesenswert?

Hi

Was ich noch nie so richtig verstanden habe, ist, das jeder Anfänger 
sich die Hörner erst mal am (für Anfänger) komplizierteren 4-Bit-Mode 
abstossen will. Im 8-Bit-Mode geht das wesentlich entspannter.

MfG Spess

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Das verstehe ich auch nicht.


Viel unverständlicher finde ich allerdings die Methode, mit wilden 
Bit-Geschichten gleichzeitig die 4 Datenbits und die Steuerleitungen mit 
einem Bytezugriff auf den Port zu handeln. ... und dabei durcheinander 
zu kommen ...

Was machen die Leute, wenn sie das Display mal nicht komplett an einen 
Port hängen können?

Wie sieht bei diesen Leuten Textausgabe aus?

Und wie die Ausgabe von dynamischem Text?


Warum wird vorhandener Code erst mal verändert, bevor man ihn zum laufen 
gebracht oder ihn verstanden hat?


Fragen über Fragen ...


@Roli
Wenn Dein Display wie folgt angeschlossen ist, sollte das HEX-file etwas 
ausgeben. Sollte dem nicht so sein, ist was in Deiner Hardware faul.


Port - LCD
C6 = D7
C5 = D5
C4 = D5
C3 = D4
C1 = RS
C0 = E




Gruß

Jobst

von Roland B. (Firma: Privat) (roli)


Lesenswert?

> Warum wird vorhandener Code erst mal verändert, bevor man ihn zum laufen
> gebracht oder ihn verstanden hat?

> Port - LCD
> C6 = D7
> C5 = D5
> C4 = D5
> C3 = D4
> C1 = RS
> C0 = E


ich hab das tut gelesen, hab sprut.de gelesen un hab kapiert was ich 
machen muss (welches signal wann ankommen muss) mein problem ist nur das 
mit der doku. da stehen oftmals die dinge anders drin (vom ablauf her) 
wie das in den routinen ist. un wenns net klappt sucht man un sucht un 
sucht. und bevor ich da halt eben was umbaue was ich nicht programmiert 
habe (vllt den sinn auch net ganz verstanden habe wie der jenige auf die 
lösung kam) hab ich selbst den signalablauf ao programmiert als würd ich 
LED´s ansteuern. ich versteh net ganz was daran falsch ist. ich bin halt 
net jemand der gleich abkupfert auch wenns einfacher wäre. schließlich 
soll doch meine lösung ma die beste werden :)

wenn ich was bastel dann will ich wissen warum das so funzt. un net ja 
der herr xy hat das auch so gemacht. is halt ansichtssache. un wenn 
jemand keine lust hat darauf zu antworten dann tut ers halt net. aber 
ihr helft mir un motzt mich an :(

männer... ich wills verstehen!!! :)




BESTEN DANK AN JOBST M.

also hab nun das test hex file geladen un das tut nichts. was wäre denn, 
wenn der controller auf dem display was hätte? ich habe nach wie vor die 
1. und 3. zeile schwarz.
meines wissens nach kann ich doch net z.b. am falschen port hängen. dass 
z.b. PORTC6 niemals an ein display hängen darf. oder?

Grüße Roli

von Roland B. (Firma: Privat) (roli)


Lesenswert?

ja geht lala

löten müsst man können!!!!!!!!!!!!!!!!
sehr schlecht mein papa sein sohn :(

verdammte axt.

ne "kalte" lötstelle und so viel wind um nix.
ich denk dabei hab ich was gelernt.

Vielen dank an alle. vor allem frohe weihnachten un en gute rutsch wenn 
ich net grad morgen wieder schreib :)

Merci Jobst M.

Viele Grüße Roli

von Jobst M. (jobstens-de)


Lesenswert?

Roland Baader schrieb:
> geht lala

;-)


Gruß

Jobst

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.