Josef H. schrieb:> Jedoch wenn ich das Display> initialisieren sowie etwas anzeigen möchte, geht das nicht.
Weil du das Display erst initialisieren musst.
Codebeispiele gibt es mehr als genug.
Regelcop schrieb:> Josef H. schrieb:>> Code gibts oben>> *.txt Dateien wird kein Compiler übersetzen ....>> Unmöglich eine *.txt Datei in eine *.c-Datei "umzuwandeln"?
Habe nur das Wichtigste auskopiert und in die txt Datei gespeichert.
Regelcop schrieb:> Weil du das Display erst initialisieren musst.
Aber mit meinem Abschnitt "Initialisiere Display" sollte das Display
doch initialisiert werden?
Wie gesagt, die Abschnitte wurden in die txt Datei eingefügt.
Regelcop schrieb:> Weil du das Display erst initialisieren musst.
ooops hab ich doch glatt was übersehen, ist ja doch eine Init da.
... aber diesen Wust von HAL_GPIO_WritePin Aufrufen tu ich mir
nicht an ....
Ja hàtte können schon, aber da ich zeitlich begrenzte Zeit habe nahm ich
txt..
spielt ja eigentlich auch keine Rolle..
Zuerst werden RS, RW und Enable auf LOW gezogen.
Danach werden die Datenpins aktiviert bzw. deaktiviert(je nach
befehlssatz)
Anschliessend wird Enable kurz aktiviert, damit bei der fallenden Flanke
die Daten gesendet werden.
Dietrich L. schrieb:> Josef H. schrieb:>> spielt ja eigentlich auch keine Rolle.>> Doch. Wenn Du es .c nennst bekommt die Textanzeige eine Farbgebung> passend zur Sprache C.
Oke entschuldigung.. kann mir nun jemand auf meine Frage antworten?
Josef H. schrieb:> kann mir nun jemand auf meine Frage antworten?
Schreib dir die Initialisierung von einem bekannten Beispiel
ab. So wie du macht man das nicht und es ist sehr unüber-
sichtlich und Fehleranfällig.
Genau deswegen mag ich dieses Forum nicht..
Alle wollen etwas dazu beitragen, jedoch nicht auf die positive Art..
Niemand von euch hier will helfen.. Nur blöd kommentieren..
Sorry aber hab langsam keine nerven mehr für diese Forum.......
Mal abgesehen von Pin Quiz (Ardu Folgeerscheinung?) nimmt die HAL_Delay
nur uint32. Alle deine Delays sind also keine.
Bitte schreibe erst eine Funktion mit sinnvollem Namen die ebenfalls
sinnvoll bezeichnete Bytes übergibt.
Einen gewissen Grundstil sollte man schon von der Allgemeinheit
übernehmen wenn man Antworten erwartet.
Oder schmoll weiter.
pegel schrieb:> Mal abgesehen von Pin Quiz (Ardu Folgeerscheinung?) nimmt die HAL_Delay> nur uint32. Alle deine Delays sind also keine
Habe nie mit Arduino gearbeitet..
Also HAL_Delay akzeptiert nur werte mit uint_t32 integer?
> Einen gewissen Grundstil sollte man schon von der Allgemeinheit> übernehmen wenn man Antworten erwartet.
Würde sehr gerne einen wunderschönen, kommentierten Code zeigen. Jedoch
habe ich dafür echt keine Zeit mehr..
> Oder schmoll weiter.
Muss ich wohl, wenn hier nichts kluges mehr kommt.
Als erstes gib mal den Pinnummern vernünftige Namen.
Und dann kapsele die Hardwarezugriffe in möglichst wenige Funktionen.
Und das Init ruft dann nur noch diese Funktionen mit den nötigen
Parametern auf.
Deinen Spaghetticode aus riesenlangen HAL-schlag-mich-tot Ketten kann
jedenfalls keiner verstehen.
Hier mal ein Beispiel für AVR, das man auch lesen kann:
http://www.avrfreaks.net/forum/tutc-lcd-tutorial-1001?skey=lcd%201001
Und daher auch einfach an andere MCs anpassen kann.
Peter D. schrieb:> Kryptischer Monstercode kostet Dich viel viel mehr Zeit, als lesbarer> modularer Code.
Er hat ja auch keine Zeit seine Source-Schnipsel in eine *.c
Datei statt in eine *.txt Datei zu schreiben. Der Mehraufwand
ist verständlicherweise einfach zu gross:
Josef H. schrieb:> Ja hàtte können schon, aber da ich zeitlich begrenzte Zeit habe nahm ich> txt..
Dein Code ist so falsch, unvollständig und schlecht lesbar, dass es gar
keinen Sinn macht, hier konkrete Korrekturen vorzuschlagen.
Ich wäre viel zu faul, so viel wiederholten Text hinzuschreiben.
Zuerst braucht dein Code Struktur, das heisst konkret Funktionen oder
Makros die so oder so ähnlich heissen:
lcd_set_rs_high();
lcd_set_rs_low();
lcd_set_en_high();
lcd_set_en_low();
lcd_write_nibble(value);
Darauf bauen dann die Hauptfunktionen auf:
lcd_init();
lcd_write_command(byte);
lcd_write_data(byte);
Darauf aufbauen solltest du die ganzen Steuerbefehle des Displays
abstrahieren, zum Beispiel:
lcd_clear();
lcd_shift_left();
lcd_shift_right();
lcd_set_cursor(row, column);
lcd_cursor_mode(off/on/blink,block/line);
usw.
Oder du verwendest einen universellen Befehl für Kommandos und
definierst Konstanten mit sprechenden Namen für alle möglichen Werte.
Mach das erst mal soweit fertig, und dann reden wir nochmal über deinje
Initialisierungssequenz. Da fehlt nämlich eine ganze Menge.
Ich zeige Dir hier mal ein Beispiel, wie ich das auf AVR Mikrocontroller
mache. Dieser Code ist ein Auszug auf dem Fringsbuch
(http://stefanfrings.de/mikrocontroller_buch/index.html), wo das Ganze
ausführlich erklärt ist.
Header Datei:
1
// The HD44780 Display is connected to Port D.
2
#define LCD_PORT_INIT { DDRD |= 0b11111100; }
3
#define LCD_RS_HIGH { PORTD |= (1<<PD2); }
4
#define LCD_RS_LOW { PORTD &= ~(1<<PD2); }
5
#define LCD_E_HIGH { PORTD |= (1<<PD3); }
6
#define LCD_E_LOW { PORTD &= ~(1<<PD3); }
7
8
#define LCD_DATA_LOW_NIBBLE(b) { \
9
PORTD = (PORTD & 0x0F) | (b << 4); \
10
}
11
12
#define LCD_DATA_HIGH_NIBBLE(b) { \
13
PORTD = (PORTD & 0x0F) | (b & 0xF0); \
14
}
15
16
// Initialize the display controller.
17
voidLCD_init(uint8_toptions);
18
19
// Send a command.
20
voidLCD_command(uint8_tcmd);
21
22
// Commands and options (add options to the command):
23
#define LCD_FUNCTION_SET 0b00100000
24
#define LCD_1_LINE 0b0000
25
#define LCD_2_LINES 0b1000
26
#define LCD_5x8_FONT 0b0000
27
#define LCD_5x10_FONT 0b0100
28
29
// Clear display and set cursor to home position.
30
#define LCD_CLEAR_DISPLAY 0b00000001
31
32
// Set cursor to the home position and reset
33
// the shift position.
34
// The DDRAM content remains unchanged.
35
// Note that this command takes much more time
36
// than the clear display command.
37
#define LCD_RETURN_HOME 0b00000010
38
39
// Set entry mode
40
// = what happens after writing a character to the DDRAM.
41
#define LCD_ENTRY_MODE_SET 0b00000100
42
#define LCD_DECREMENT 0b00
43
#define LCD_INCREMENT 0b10
44
#define LCD_SHIFT 0b01
45
46
// Control which features are on:
47
#define LCD_ON_OFF_CONTROL 0b00001000
48
#define LCD_OFF 0b000
49
#define LCD_DISPLAY 0b100
50
#define LCD_CURSOR 0b010
51
#define LCD_BLINKING 0b001
52
53
// Shift the cursor
54
#define LCD_SHIFT_CURSOR_LEFT 0b00010000
55
#define LCD_SHIFT_CURSOR_RIGHT 0b00010100
56
57
// Shift the display
58
#define LCD_SHIFT_DISPLAY_LEFT 0b00011000
59
#define LCD_SHIFT_DISPLAY_RIGHT 0b00011100
60
61
// Set address of character generator RAM,
62
// the following data are written to the CGRAM.
63
// Add the 6bit address value to the command.
64
#define LCD_SET_CGRAM_ADDRESS 0b01000000
65
66
// Set the address of display data RAM,
67
// the following data are written to the DDRAM.
68
// Add the 7bit address value to the command.
69
// Note that the second line ususally begins
70
// at address 0x40.
71
#define LCD_SET_DDRAM_ADDRESS 0b10000000
72
73
// Write one byte to the data register (CGRAM or DDRAM).
74
voidLCD_data(uint8_tdata);
75
76
// Write a string to the data register (CGRAM or DDRAM).
Stefan U. schrieb:> Ich zeige Dir hier mal ein Beispiel
Wichtige Regeln - erst lesen, dann posten!
Groß- und Kleinschreibung verwenden
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
Ich finde es immer wieder erstaunlich, wenn anonyme Zaungäste
hilfbereite Menschen, die sich Mühe geben anpöbeln.
Das meine Rechtschreibung suboptimal ist, weiß ich selbst. Aber darum
geht es hier nicht, wir sind nicht im Deutschunterricht.
Für Dein Verhalten solltest du dich in die Ecke neben der Tafel stellen
und Dich schämen!
Josef H. schrieb:> ich habe ein LCD mit dem Mikrocontroller STM32F303 verbunden.
(...)
> Display ->> http://www.conrad.ch/ce/de/product/181705/?insert=62&insertNoDeeplink&productname=LC-Display-Schwarz-Gelb-Gruen-B-x-H-x-T-40-x-20-x-108-mm-EADIPS082-HNLED
Ob das wirklich intelligent ist, ein LCD, dessen Betriebsspannung mit 5V
angegeben ist, an einem Controller zu betreiben, der max. 3,6V
verkraftet?
Im besten Fall benötigst Du eine negative Kontrastspannung.
Deshalb wäre es auch sehr hilfreich, wenn Du statt "geht das nicht" eine
etwas eindeutigere Fehlerbeschreibung liefern würdest. Wenn Du schwarze
Rechtecke auf dem Display siehst, liegt der Fehler in der
Initialisierung, wenn das Display nichts darstellt, ist in jedem Fall
die Kontrastspannung zu gering.
Grüßle,
Volker.
Volker B. schrieb:> Deshalb wäre es auch sehr hilfreich, wenn Du statt "geht das nicht" eine> etwas eindeutigere Fehlerbeschreibung liefern würdest. Wenn Du schwarze> Rechtecke auf dem Display siehst, liegt der Fehler in der> Initialisierung, wenn das Display nichts darstellt, ist in jedem Fall> die Kontrastspannung zu gering.
wie kannst Du nur ... da sagt der Josef doch glatt:
Josef H. schrieb:> Genau deswegen mag ich dieses Forum nicht..>> Alle wollen etwas dazu beitragen, jedoch nicht auf die positive Art..>> Niemand von euch hier will helfen.. Nur blöd kommentieren..>> Sorry aber hab langsam keine nerven mehr für diese Forum.......
Hi
Habe den Code nur überflogen.
Wie es aussieht, wird beim Init nur 1x das Display initialisiert.
Korrekt(er) wäre die Methode 'nach Sprut':
http://sprut.de/electronic/lcd/index.htm#init
Spätestens, wenn Dein µC eine Reset macht, Dein Display aber nicht,
versteht das Display nur noch 'Bahnhof' :)
(im Endeffekt wird 3x auf 8bit gestellt, bevor weiter initialisiert wird
bzw. dazwischen auf 4bit umgeschaltet wird, da man auch so schon 7 Pins
braucht)
Die Umstrukturierung lege auch ich Dir ans Herz.
Weiter wären Kommentare, was welches Bitmuster bezwecken soll, für den
gemeinen Leser nützlich.
Was auch schon gefragt wurde:
Bekommst Du beim Einschalten des Display (Spannung an) eine Reihe
Rechtecke angezeigt?
Steht aber auch bei Sprut, dort auch wesentlich besser beschrieben, als
ich Das hier aufsagen könnte.
MfG
PS: Von den Displays habe ich auch noch zwei hier :)
> Spätestens, wenn Dein µC eine Reset macht, Dein Display aber nicht,> versteht das Display nur noch 'Bahnhof' :)
Bei meinem Code-Beispiel tritt das problem nicht auf, obwohl dort das
Display nut einmal initialisiert wird. Ich habe mich einfach 1:1 an das
Datenblatt des HD44780 gehalten.
Hi
Ich bezog mich auf den .txt-Code im Ausgangspost - hätte Das vll.
erwähnen sollen.
In Deinem Code sendest Du ja mehrfach '8bit' ans Display (ungeprüft,
würde mich aber wundern, wenn Das was Anderes ist)
Stefan U. schrieb:> LCD_DATA_HIGH_NIBBLE(0b00110000);> _delay_us(0.250);> LCD_E_LOW;> _delay_ms(5);> LCD_E_HIGH;> _delay_us(0.250);> LCD_E_LOW;> _delay_us(150);> LCD_E_HIGH;> _delay_us(0.250);> LCD_E_LOW;
MfG
EDIT
Ah - glaube, Dich jetzt zu verstehen:
Sofern der µC immer komplette Befehle ans Display geschickt bekommt, das
Display also nicht 'aus dem Tritt' kommt, ist auch Alles wunderbar.
Seltsam wird Es, wenn das Display was Anderes erwartet, als der µC
denkt, zu senden.
Denke, wir schwätzen in die gleiche Richtung
Du hast das falsch verstanden. Die Initialisierungssequenz, die ich
gemäß Datenblatt umgesetzte habe, sorgt für eine Synchronisation der
Kommunikation. Es spielt leine Rolle, ob das Display vorher im 4Bit
Modus war oder ein halbes Byte empfangen hatte.
Ich halte es nicht für nötig, diesen weit über 10 Jahre alten Kram
plötzlich zu hintertfragen, da er bisher noch nie versagt hat. Ich
htatte genau diese Sequenz schon auf zahlreichen Computern und
Mikrocontrollern angewendet.