Forum: Mikrocontroller und Digitale Elektronik LCD EA DIP203 Problem (unerklärbare Zeichen)


von Alex S. (Firma: MPI) (alex_mpi)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe folgendes Problem: Ich verwende ein Display (EA DIP203G-4NLED)
mit einem Atmega328, die Routine aus dem "AVR Hardware und 
C-Programmierung in der Praxis" Buch von Elektor und steuere das Display 
im 4-bit Modus ohne R/W an.
Die Anzeige funktioniert wunderbar aber in unregelmäßigen Zeitabständen 
tauchen an verschiedenen Stellen unerklärbare Zeichen auf (Manchmal nur 
1-2, manchmal im ganzen Bild).Diese verschwinden nach einem Reset oder 
das Bild regeneriert sich nach einigen Minuten von selbst.
Die Ursache konnte ich noch nicht feststellen, hatte schon das Ganze in 
ein Gehäuse mit Netzfilter und Linearnetzteil verbaut und das 
Display-Gehäuse von der Frontplatte isoliert, es hat aber wenig oder 
Nichts gebracht.

Hat vielleicht jemand einen ähnlichen Problem gehabt?

Ich würde mich über eure Tipps freuen.

Die LCD-Routine könnte ich auch hochladen falls jemand Interesse hat.

von 6A66 (Gast)


Lesenswert?

Alex Stein schrieb:
> Hallo,
> ich habe folgendes Problem: Ich verwende ein Display (EA DIP203G-4NLED)
> mit einem Atmega328, die Routine aus dem "AVR Hardware und
> C-Programmierung in der Praxis" Buch von Elektor und steuere das Display
> im 4-bit Modus ohne R/W an.
> Die Anzeige funktioniert wunderbar aber in unregelmäßigen Zeitabständen
> tauchen an verschiedenen Stellen unerklärbare Zeichen auf (Manchmal nur
> 1-2, manchmal im ganzen Bild).Diese verschwinden nach einem Reset oder
> das Bild regeneriert sich nach einigen Minuten von selbst.
> Die Ursache konnte ich noch nicht feststellen, hatte schon das Ganze in
> ein Gehäuse mit Netzfilter und Linearnetzteil verbaut und das
> Display-Gehäuse von der Frontplatte isoliert, es hat aber wenig oder
> Nichts gebracht.
>
> Hat vielleicht jemand einen ähnlichen Problem gehabt?
>
> Ich würde mich über eure Tipps freuen.
>
> Die LCD-Routine könnte ich auch hochladen falls jemand Interesse hat.

Jumper am Display offen?
Jumper am 245 offen?
Das mit SOD/SID und der Direction des 245 ist auch so'ne Sache.
Reset am Display abgeschlossen?

rgds

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Deine Routine wird wohl das vom Display benötigte Timing meistens, aber 
nicht immer korrekt umsetzen.

Übrigens sind 7 MByte Bilder schon beeindruckend. 
http://www.mikrocontroller.net/articles/Bildformate !

von 6A66 (Gast)


Lesenswert?

6A66 schrieb:
> Das mit SOD/SID und der Direction des 245 ist auch so'ne Sache.

Wenn Du den 245 auf B->A umschaltest ist der EN des Displays offen!

rgds

von Alex S. (Firma: MPI) (alex_mpi)


Lesenswert?

Die Die Richtung ist Festgelegt auf 5V und R/W auf GND, Habe mir die 
Möglichkeit für die Zukunft offen gelassen SPI zu benutzen, momentan 
wird nur über 4+2 Leiter geschrieben.

Reset ist laut Datenblatt mit 10K abgebunden habe es auch schon extern 
versucht... Resultat = 0.

Die Timing habe ich schon angeschaut, waren eigentlich alle sogar viel 
länger als im Datenblatt, aber danken ist ein guter Vorschlag... schau 
ich mal ob sich da was machen lässt.

Fasst vergessen: die Leitungen an X1 (die rechte Spalte) 2-16 sind alle 
mit 2K2 nachträglich abgebunden.

(bei den Bildern haben ich echt nicht auf die Größe geachtet, versuche 
momentan dies zu ändern)

: Bearbeitet durch User
von Alex S. (Firma: MPI) (alex_mpi)


Lesenswert?

Ich werde in den nächsten Tagen versuchen die LCD-Routine von 
mikrocontroller.net ausprobieren und schauen, ob der Fehler weg ist.

rgds.

: Bearbeitet durch User
von 6A66 (Gast)


Lesenswert?

Alex S. schrieb:
> Die Timing habe ich schon angeschaut, waren eigentlich alle sogar viel
> länger als im Datenblatt, aber danken ist ein guter Vorschlag... schau
> ich mal ob sich da was machen lässt.

Dann hilft nur, sich D0...4 und RS auf das Scope zu legen, auf EN zu 
triggern und das System einfach mal ein paar Stunden laufen lassen. Am 
besten Persistence/Nachlecuhtdauer auf unendlich stellen und mal 
ansehen. Entweder Du findest da was (Glitch Setup/Hold Verletzung, ...) 
oder du musst woandest suchen.

rgds

von J. S. (smij)


Lesenswert?

Hallo
ich hab die gleichen probleme mit einem EA DIP203-6 und einem ATmega64.
Ich benütze die LCD-Routine von mikrocontroller.net im 4-bit mode aber 
die Fehler kommen immer noch vor. Falls eine Lösung des Problems 
gefunden wird wäre ich froh wenn sie hier gepostet wird.
MFG smij

: Bearbeitet durch User
von Harry (Gast)


Lesenswert?

Ich/wir haben mit dem neuen DIP203-4 (3.3V-Nachfolger des 204) auch 
schon experimentiert und nach 2 Wochen entnervt aufgegeben. Steuer das 
Teil per SPI an und alles ist gut.

Gruss
Harry

von J. S. (smij)


Lesenswert?

Hi Harry
Vielen Dank für deine Antwort. Könntest du vlt. die beschaltung und den 
C code dafür posten falls du es gerade irgendwie zur hand hast? Weil mit 
SPI habe ich bis jetzt noch keine erfahrungen gemacht... und dass 
projekt ist sehr dringend deshalb glaube ich dass die zeit nicht reicht 
um mich selber ins SPI einzuarbeiten...
MFG smij

von Georg G. (df2au)


Lesenswert?

Es fällt auf, dass bestimmte ungewollte Zeichen gehäuft auftreten. Ich 
würde den Code für eines dieser Zeichen (vertikale Striche, Pos 2-3-4 
deines Bildes) aus dem Datenblatt heraussuchen und dann den 
Logikanalysator auf dieses Muster triggern lassen. Dann kann man in Ruhe 
analysieren, was da passiert ist.

Die Displays brauchen teilweise sehr lange für die Ausführung eines 
Befehls. Andererseits reagieren sie aber auch auf extrem kurze Glitches 
sehr unschön. Der Rekordhalter wollte eine Flankensteilheit von <25ns, 
sonst machte er Müll. Das stand etwas versteckt auch so im Datenblatt.

Notfalls einfach mal den Hersteller wechseln (wenn die Zeit oder die 
Messtechnik nicht für eine gute Fehleranalyse reichen).

von Harry (Gast)


Lesenswert?

Hi smij,
1
Procedure Start;                                 // Initialisierung LCD 
2
  Begin 
3
    LCDCTRL($34);                                // 8 Bit, Extension Bit RE=1 
4
    mDelay(2); 
5
    LCDCTRL($09);                                // 4 Zeilen-Modus 
6
    mDelay(2); 
7
    LCDCTRL($30);                                // 8 Bit, Extension Bit RE=0 
8
    mDelay(2); 
9
    LCDCTRL($0C);                                // Display ein, Cursor off, Blinken off 
10
    mDelay(2); 
11
    LCDCTRL($01);                                // Display clear, Cursor 0,0 
12
    mDelay(2); 
13
    LCDCTRL($06);                                // Cursor Auto-Increment
14
    mDelay(2); 
15
  End Start;

leider programmiere ich nicht in C ..... ich bevorzuge Pascal (AVRCo).
Die Beschaltung findest du im Datenblatt, Brücke auf der Rückseite des 
Displays schliessen. Es gibt sicher C-Bibliotheken bei denen du dich mit 
SPI nicht befassen mußt ;)

Gruss
Harry

von J. S. (smij)


Lesenswert?

Hi Harry
trozdem vielen Dank du hast mir sehr geholfen :)
MFG smij

von Ralph (Gast)


Lesenswert?

Hi Alex !

In einem Post vom 31.3. schreibst du, dass du den Direction-Pin auf 5V 
gelegt hast. Betreibst du das Display auch mit 5V oder mit 3,3V? Das 
neue EA DIP203 läuft nämlich offiziell nur noch mit 3,3V

Noch eine Idee: auf welchem Pegel liegt der Enable bei dir im 
Ruhezustand ?
Laut Datenblatt soll er low sein und erst wenn die Daten- und 
Steuerleitungen korrekt angelegt sind, soll der Enable kurz auf high 
gehen.
Dies wurde auch in einigen Libraries falsch gemacht.

Viel Erfolg !

Ralph

von Ralph (Gast)


Lesenswert?

Noch eine Idee:

Kann es sein, dass dein Controller zwischendrin einen Reset macht 
(Brown-out etc) und das Display nicht ? Dann startet nämlich dein 
Ciontroller mit einer 8-Bit Initialisierung und der Displaykopntroller 
ist noch auf 4-Bit initialisiert.

Ralph.

von Alex S. (Firma: MPI) (alex_mpi)


Lesenswert?

Das Display wird auch mit 3.3V betrieben und der DIR Pin gehört zum 
Pegelwandler und liegt auf 5V. (Siehe Schaltplan)

von Alex S. (Firma: MPI) (alex_mpi)


Lesenswert?

Die Enable Leitung habe ich auch gemessen, geht kurz von low auf high 
wenn etwas gesendet wird.

Wenn ich dich mit dem Reset richtig verstanden haben, beudetet es ja 
aber ,dass das Display vom Controller neu initialisiert und gelöscht 
wird.

Mit einem "Brown-out" rechne ich auch nicht, da die Schaltung schon mit 
verschiedensten Netzteilen betriebn wurde und der Port vom AVR wird auch 
für nichts anderes benutzt.

von John (Gast)


Angehängte Dateien:

Lesenswert?

Ich hab mal eine kurze Sequenz der falschen Anzeige nach der 
Zeichentabelle im Datenblatt decodiert:

1. 0011 0011
2. 0001 0010
3. 1111 0011
4. 0011 0010
5. 1111 0011
6. 0001 0011
7. 0100 0010

Wenn man jetzt das low-Nibble eine Bytes mit dem high-Nibble des 
nächsten Bytes kombiniert kommt das raus:
1/3/14

Entweder ist ein Enable verloren gegangen, oder durch eine Störung wurde 
ein zusätzliches Enable erkannt.

von John (Gast)


Lesenswert?

Sind Abblockkondensatoren an allen ICs vorhanden? In dem 
Schaltbildauszug sind keine zu sehen.

von Alex S. (Firma: MPI) (alex_mpi)


Lesenswert?

Ja, auf der kleinen Platine ist ein 3.3V Regler, welcher nur für das 
Display (+Pegelwadler) verwendet wird und der hat 6,8µF Elko und 100nF 
Keramik am Ausgang. Wenn ich jetzt so sehe, könnten die natürlich etwas 
näher am Display sein.

Kann das mit dem Enable leider nicht mehr überprüfen, habe die Tage 
meine Kontroller und Display Platine auf SPI "um verdrahtet". Da es wohl 
in diesem Fall, wie einige Leute schrieben keine Probleme gibt und der 
Hauptgrund ist die ich bereit SPI verwende spare ich 6(5) Port-Pins.

Habe das Programm Gestern zum laufen bekommen. Bis jetzt konnte ich 
keine Zeichen-Fehler feststellen. Der Code ist auch nicht viel 
komplizierter, das einzige ist das Umschalten der SPI-Modis, da das 
Display im Mod 3 läuft, anders als alles was ich bis jetzt verwendet 
habe(ADC, DAC, Keypad).

von Maxim B. (max182)


Lesenswert?

Thema ist schon alt. Aber ich kämpfe z.Z. auch mit EA DIP203G...
Hat wirklich niemand in 5 Jahren eine andere Lösung gefunden, als LCD 
nur per SPI anzusteuern?

Leider ist Dokumentation für SSD1803 lückenhaft: oft wird Bit RE 
erwähnt, aber nirgendwo steht genau, wie man das setzt oder löscht.

DIP203G verhält sich so, als ob drin etwas gibt, was zufällige Zustand 
nach dem Einschalten nimmt: manchmal arbeitet LCD wie erwartet, manchmal 
aber ganz daneben. Das ist bei üblichen für HD44780 Init so und auch 
wenn ich nach (3x 0x30 + 0x20) zusätzlich 0x2c und 0x09 schreibe, um zu 
versuchen, Bit RE zu setzen und zu löschen...

Ich denke, wenn in Datenblatt steht "(NAHEZU 100% HD44780 KOMPATIBEL", 
sollte das doch bedeuten, daß Code von HD44780 direkt verwendbar sei und 
nur noch zusätzliche Extras vorhanden sind?

: Bearbeitet durch User
von Antworter Gast (Gast)


Lesenswert?

Hallo Maxim
kenne das auch von einigen Displays von EA. Nach meiner Erfahrung kommt 
es auf die Zeit nach löschen an. Das Display braucht ein paar 
Millisekunden. Das steht aber auch etwas versteckt in dem Datenblatt 
drin.
Ansonsten funktionieren alle Displays von EA auch ohne Problem mit dem 
I2C Bus.

von Maxim B. (max182)


Lesenswert?

Auf meiner Platte steht DIP203G-4 über 74VHC595, da IC mit Eingangpegel 
über Vcc arbeiten kann und somit wird auch von 5V zu 3V3 konvertiert... 
Aber das ist nicht prinzipiell: Algorythmus bleibt gleich: zuerst D4-D7 
mit RS, dann D4-D7 mit RS und mit EN, dann wieder ohne EN. danach noch 
einmal für D0-D3.

Ich habe wenig Lust, auf Seriell zu wechseln: ich muß dann 74VHC595 
entfernen und als Pegelwandler 74VHC573 oder 74LCV14A einsetzen, alles 
mit Draht, unschön...

von Teo D. (teoderix)


Lesenswert?

Maxim B. schrieb:
> DIP203G verhält sich so, als ob drin etwas gibt, was zufällige Zustand
> nach dem Einschalten nimmt: manchmal arbeitet LCD wie erwartet, manchmal
> aber ganz daneben.

Das kommt beim echten HD77480 vor, wenn das nicht richtig 
initialisiert wird.
Das Instructions-Set vom DIP203G weicht deutlich vom HD77480 ab. Bei der 
Init dürfte also so einigen nicht kompatibel sein.

von Teo D. (teoderix)


Lesenswert?

Hier gibst Infos u. SW zum Vorgänger:
Beitrag "LCD EA DIP204-4 Initialisieren"

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Danke!
Ich weiß zwar nicht, ob das paßt: doer steht KS0073 und bei DIP203 ist 
das SSD1803

Schade: geht leider nichts. Die Befehlsfolge aus dem Beitrag arbeitet 
leider nicht.

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Hi,
welche Taktfrequenz benutzt Du?
Bei 4MHz klappen bei mir (fast) alle Inits.
Die Waitschleifen sind taktfrequenzabhängig.
Dann sind die Schleifen selbst oft fehlerhaft, wenn sie dieselben
arithmetischen Temporärregister verwenden, die vorher nicht auf Stapel 
gepusht wurden.
Den Fehler hatte ich dann auch.
Je nachdem was gerade berechnet wurde, wurde von "temps" überschrieben, 
die ich für LCD Routinen brauchte.
Dann beim Auslesen wenn möglich, Interrupts sperren.
Wenn ISRs zu lang werden, kollidiert das sonst leicht mit "langsamer" 
LCD-Ausgaberoutine.
Wo es sonst noch Probs. gibt, wäre Bitzuordnung beim Swappen.
Das kommt dann auf die konkret verwendete Portbitzuordnung an.
Dann die tatsächliche Minimalimpulsdauer des Enable-Impulses. Das ist 
wiederum bei den meisten Routinen taktfrequenzabhängig. Ein paar "nops" 
mehr spendiert, löst dieses Prob.


ciao
gustav

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Karl B. schrieb:
> welche Taktfrequenz benutzt Du?
> Bei 4MHz klappen bei mir (fast) alle Inits.
> Die Waitschleifen sind taktfrequenzabhängig.

Ich habe verschiedenes versucht. Bei 8 und 4 MHz, Mode 0 und Mode 3...
Ich habe noch gedacht: irgendwelche Störungen. Deshalb habe ich nun 
zwischen Ausgängen von 74VHC595 und Gnd noch Widerstände 2k4 gelötet. 
Aber es ist nur schlechter geworden.
Ich habe dann auch Reset-Eingang von ~Reset-Systen getrennt und auch an 
74VHC595 gehängt, somit kann ich längere Reset machen als in System. 
Hilft auch nicht...

Hier ist 4bit-Funktion. Aber ich denke, Problem liegt nicht hier. 
Trotzdem:
1
void sendnibble(u8 data){
2
  spi_master_transmit(data);
3
  spi_intern_start();
4
  asm volatile("lpm");
5
  asm volatile("lpm");
6
  spi_intern_stop();
7
}
8
// Sendet eine 4-bit Ausgabeoperation an das LCD 
9
// rs = 1: data, rs = 0: command
10
void lcd_intern_out( u8 data, lcdmode_t rs ) 
11
{ 
12
  u8 a;
13
  lcd_adrmode();
14
15
  a = ((data & 0xf0) | (1<<BIT_RESET));
16
  if(rs == LCD_DATA) a |= (1<<BIT_RS);
17
  sendnibble(a);
18
  sendnibble(a | (1<<BIT_E));
19
  sendnibble(a);
20
}

Grafische LCD ist auch über SPI und alles funktioniert einwandfrei. Aber 
diese... Oszilloskop zeigt: alle Singale wie gewollt.
Es sollte also etwas mit Init nicht stimmen...

Karl B. schrieb:
> Wenn ISRs zu lang werden, kollidiert das sonst leicht mit "langsamer"
> LCD-Ausgaberoutine.

Ich mache keine solche Sachen direkt aus ISR. Entweder in ISR Bits 
gesetzt (z.B. in GPIOR0, am schnellsten erreichbar) und in Hauptschleife 
geprüft, oder mit Planer. So kann man ISR sehr schnell machen, sogar 
ohne push-pop (ISR_NAKED), da alles sich nur auf "sbi GPIOR0, bit" 
beschränkt.

: Bearbeitet durch User
von Maxim B. (max182)


Lesenswert?

Ich habe auch nach SPI-Mode gewechselt! Trotz meiner Befürchtung reichte 
es mit Spannungsteiler zu machen, 3k3 und 1k8. Wie auch in Datenblatt 
versprochen, funktioniert das mit 2 MHz.
Gut zu wissen: EA DIP-203 paßt für SPI Mode am besten.

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Hi,
wenn es bei HD44780-Ansteuerung Probleme gibt, hätte ich noch einen 
Harware-Lösungsansatz dazu.
Bei einem Display mit dem HD44780 kompatiblen Controller fehlte ein 
SMD-Bauteil. Ein Bauteil, das offensichtlich für die eigene 
Prozessortakterzeugung des Displays wichtig ist.
So betrug die laut Spec. angegebene Taktfrequenz nicht ca. 230 kHz 
sondern nur etwa die Hälfte. Und somit verlängerte sich auch die 
Befehlsverarbeitungszeit des Display-Controllers entsprechend. Und die 
vom µP kommenden Routinen mussten "verlangsamt" werden.
Oder das fehlende Bauteil reinlöten.

ciao
gustav

von Maxim B. (max182)


Lesenswert?

SPI-Mode ist gerade für EA DIP203 am besten.
Am Anfang fürchtete ich Problem, da LSB zuerst und langsam, aber das 
löst sich am Ende einfacher, als störungsfreie Arbeit in Parallel-4bit 
zu schaffen.
Bei diesem LCD darf man über HD44780-Kompatibilität nicht reden: ein 
Befehl aus typischer Init-Routine für HD44780 wird dank 
Befehlserweiterung ganz anders interpretiert, dadurch geht ganze Init 
woanders. Auch Unterschiede zwischen 2-Zeilien- und 4-Zeilen-Modi sind 
zu beachten. Code für HD44780 wird mit EA DIP203 erst nach Anpassung 
tauglich.
Das ist ein LCD mit etwas anderem Befehlssatz, man sollte das offen in 
Datenblatt schreiben. EA schreibt aber "NAHEZU 100% HD44780 KOMPATIBEL" 
:)

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Maxim B. schrieb:
> Init-Routine für HD44780 wird dank
> Befehlserweiterung ganz anders interpretiert, dadurch geht ganze Init
> woanders. Auch Unterschiede zwischen 2-Zeilien- und 4-Zeilen-Modi sind
> zu beachten. Code für HD44780 wird mit EA DIP203 erst nach Anpassung
> tauglich.

Hi,
und wo kann man nun die korrekte Initialisierungsroutine im Netz finden?

ciao
gustav

von Maxim B. (max182)


Lesenswert?

Bei mir läuft so gut:
1
//lcd_intern.h
2
// EA DIP203
3
#define LCD_DDADR_LINE1         0x00
4
#define LCD_DDADR_LINE2         0x20
5
#define LCD_DDADR_LINE3         0x40
6
#define LCD_DDADR_LINE4         0x60
7
8
static inline void lcd_adrmode(void){
9
  spi_master_setmode(DIV_16,MOD_3,LSB_FIRST);
10
  spi_intern_outadr(LCD_ADR);
11
}
12
13
#define LCD_BOOTUP_MS           10
14
#define LCD_WRITEDATA_US        43
15
#define LCD_COMMAND_US          39
16
 
17
#define LCD_CLEAR_DISPLAY_MS    2
18
#define LCD_CURSOR_HOME_MS      2
19
20
// Clear Display -------------- 0b00000001
21
#define LCD_CLEAR_DISPLAY       0x01
22
 
23
// Cursor Home ---------------- 0b0000001x
24
#define LCD_CURSOR_HOME         0x02
25
 
26
// Set Entry Mode ------------- 0b000001xx
27
#define LCD_SET_ENTRY           0x04
28
 
29
#define LCD_ENTRY_DECREASE      0x00
30
#define LCD_ENTRY_INCREASE      0x02
31
#define LCD_ENTRY_NOSHIFT       0x00
32
#define LCD_ENTRY_SHIFT         0x01
33
 
34
// Set Display ---------------- 0b00001xxx
35
#define LCD_SET_DISPLAY         0x08
36
 
37
#define LCD_DISPLAY_OFF         0x00
38
#define LCD_DISPLAY_ON          0x04
39
#define LCD_CURSOR_OFF          0x00
40
#define LCD_CURSOR_ON           0x02
41
#define LCD_BLINKING_OFF        0x00
42
#define LCD_BLINKING_ON         0x01
43
 
44
// Set Shift ------------------ 0b0001xxxx
45
#define LCD_SET_SHIFT           0x10
46
 
47
#define LCD_CURSOR_MOVE         0x00
48
#define LCD_DISPLAY_SHIFT       0x08
49
#define LCD_SHIFT_LEFT          0x00
50
#define LCD_SHIFT_RIGHT         0x04
51
 
52
// Set Function --------------- 0b001xxxxx
53
#define LCD_SET_FUNCTION        0x20
54
 
55
#define LCD_FUNCTION_4BIT       0x00
56
#define LCD_FUNCTION_8BIT       0x10
57
#define LCD_FUNCTION_1LINE      0x00
58
#define LCD_FUNCTION_2LINE      0x08
59
//#define LCD_FUNCTION_5X7        0x00
60
//#define LCD_FUNCTION_5X10       0x04
61
#define LCD_FUNCTION_RE      0x04  // Extra von SSD1803
62
#define LCD_FUNCTION_NORE    0x00
63
#define LCD_FUNCTION_BE      0x02  // mit RE=1  
64
 
65
//#define LCD_SOFT_RESET          0x30
66
67
//***** Befehle mit RE=1 (nach dem LCD_SET_FUNCTION | LCD_FUNCTION_RE) */
68
// Power Down Mode
69
#define LCD_POWERDOWN      0x02
70
#define LCD_FUNCTION_PDEN    0x01
71
#define LCD_FUNCTION_PDDIS    0x00
72
73
// Entry Mode Set
74
#define LCD_EXTLCD_SET        0x06
75
#define LCD_FUNCTION_RUECKWAERTS  0x01
76
77
// extended Function Set
78
#define LCD_EXTSET        0x08
79
#define LCD_FUNCTION_INVCUR    0x02
80
#define LCD_FUNCTION_4LINE    0x01
81
/*** usw */
1
// lcd_intern.c
2
// EA DIP203
3
#include <avr/io.h>  // Muss immer sein
4
#include <inttypes.h>     // Fuer Datentyp
5
#include <avr/pgmspace.h>   // Fuer Flash 
6
#include <util/delay.h>    // Fuer Verzoegerungen 
7
8
#include "lcd_intern.h"
9
10
void lcd_intern_init(void){
11
12
  _delay_ms(LCD_BOOTUP_MS);
13
14
    // Function Set
15
  lcd_intern_command(LCD_SET_FUNCTION | LCD_FUNCTION_8BIT | LCD_FUNCTION_RE);
16
    // Extended Function Set
17
  lcd_intern_command(LCD_EXTSET | LCD_FUNCTION_4LINE);
18
    // Function Set
19
  lcd_intern_command(LCD_SET_FUNCTION | LCD_FUNCTION_8BIT);
20
    // Set Display
21
  lcd_intern_command(LCD_SET_DISPLAY | LCD_DISPLAY_ON);
22
23
  lcd_intern_clear();  // Clear Display
24
25
  lcd_intern_command(LCD_SET_ENTRY | LCD_ENTRY_INCREASE);  // Entry Mode Set
26
27
}
28
29
// Ausgabe eines Kommandos an das LCD. Ohne Verzoegerung
30
void lcd_intern_command_k( uint8_t data ){
31
32
  SPI_NEHMEN;
33
  lcd_adrmode();
34
  spi_intern_start();
35
36
  spi_master_transmit(0x1f);
37
  spi_master_transmit(data & 0x0f);
38
  spi_master_transmit(data >> 4);
39
40
  spi_intern_stop();
41
  SPI_FREIGEBEN;
42
}
43
44
// Ausgabe eines Kommandos an das LCD.
45
void lcd_intern_command( uint8_t data ){
46
  lcd_intern_command_k(data);
47
  _delay_us(LCD_COMMAND_US );
48
}
49
50
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
51
// ohne Verzoegerung
52
void lcd_intern_data_k( uint8_t data ){
53
  
54
  SPI_NEHMEN;
55
  lcd_adrmode();
56
  spi_intern_start();
57
58
  spi_master_transmit(0x5f);
59
  spi_master_transmit(data & 0x0f);
60
  spi_master_transmit(data >> 4);
61
62
  spi_intern_stop();
63
  SPI_FREIGEBEN;
64
}
65
66
// Ausgabe eines einzelnen Zeichens an der aktuellen Cursorposition 
67
void lcd_intern_data( uint8_t data ){
68
  lcd_intern_data_k(data);
69
  _delay_us( LCD_WRITEDATA_US );
70
}
71
72
// LCD loeschen
73
void lcd_intern_clear( void ){
74
  lcd_intern_command( LCD_CLEAR_DISPLAY );
75
    _delay_ms( LCD_CLEAR_DISPLAY_MS );
76
}
77
78
// Cursor in die 1. Zeile, 0-te Spalte
79
void lcd_intern_home( void ){
80
  lcd_intern_command( LCD_CURSOR_HOME );
81
    _delay_ms( LCD_CURSOR_HOME_MS );
82
}

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Mille grazie!

ciao
gustav

von Walter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Maxim,

ich habe ein Projekt MIT Dem Dip 203G-4 und ich verwende den STM32F103:
ich habe mir dein Code eingeschaut und im Vrgleich zu meienem gibt es 
nicht viel Unterschied. Aber ich bekomme nichts am Display. Überhaupt 
nicht.

Eine Frage zu der Beschaltung:

muss man was spezielles bei der beschaltung vom Display mit dem 
microcontroller? im Anhang findest du meine Beschaltung.

Hast du den reset pin vom Display benutzt? ich habe nur Vdd, Gnd, CS; 
SID UND SCLK Pins  benutzt.

Und ich habe keinen Pegelwandler benuzt da ich am Microcontroller ein
3V3 Pin habe.

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.