Forum: Mikrocontroller und Digitale Elektronik EADOGM162W-A-Anzeige mit XMEGA


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.
von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich versuche, meine Hardware mit ATxmega128A1 zu programmieren. Ich 
benutze ein Display EADOM162W-A, 3.V, 4bit, parallel, ohne 
LED-Hintergrundbeleuchtung. Wenn ich den Code hochlade, sehe ich nur 
schwarze Kästchen, außerdem sehe ich in meinem Code Spannung am RS-Pin 
immer hoch, E-Pin immer niedrig und D4-D7 auch niedrig. Die Spannungen 
an diesen Pins schalten nur um, wenn ich sie explizit in 'int main' zum 
Umschalten programmiere. Mein Code ist unten angehängt, ich würde mich 
über jeden Vorschlag freuen. Ich danke Ihnen.


#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>

// Define LCD pins
#define LCD_E      PIN0_bm // Enable (PC0)
#define LCD_RS     PIN1_bm // Register Select (PC1)
#define LCD_D4     PIN3_bm // Data Bit 4 (PC3)
#define LCD_D5     PIN2_bm // Data Bit 5 (PC2)
#define LCD_D6     PIN5_bm // Data Bit 6 (PC5)
#define LCD_D7     PIN4_bm // Data Bit 7 (PC4)

// Helper macros
#define LCD_E_HIGH() (PORTC.OUTSET = LCD_E)
#define LCD_E_LOW()  (PORTC.OUTCLR = LCD_E)
#define LCD_RS_HIGH() (PORTC.OUTSET = LCD_RS)
#define LCD_RS_LOW()  (PORTC.OUTCLR = LCD_RS)

// Function Prototypes
void lcd_init();
void lcd_send_command(uint8_t cmd);
void lcd_send_data(uint8_t data);
void lcd_send_nibble(uint8_t nibble);
void lcd_print(const char *str);
void lcd_clear();
void lcd_set_cursor(uint8_t row, uint8_t col);

// Initialize the LCD
void lcd_init() {
    // Configure LCD pins as outputs
    PORTC.DIRSET = LCD_E | LCD_RS | LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7;

    _delay_ms(50); // Wait for power stabilization

    // Send initialization commands
    lcd_send_command(0x39); // Function set: 2-line, extended 
instruction set
    _delay_ms(5);
    lcd_send_command(0x14); // Bias set
    _delay_ms(5);
    lcd_send_command(0x55); // Power control: Booster ON, Contrast C5, 
C4
    _delay_ms(5);
    lcd_send_command(0x6D); // Follower control: Voltage follower and 
gain
    _delay_ms(200);         // Allow voltage follower to stabilize
    lcd_send_command(0x74); // Contrast set (low bits)
    _delay_ms(5);
    lcd_send_command(0x38); // Function set: Normal instruction set
    _delay_ms(5);
    lcd_send_command(0x0C); // Display ON: Display ON, cursor OFF, blink 
OFF
    _delay_ms(5);
    lcd_send_command(0x01); // Clear display
    _delay_ms(10);           // Wait for clear command to execute
    lcd_send_command(0x06); // Entry mode set: Increment cursor, no 
shift
    _delay_ms(5);
}

// Send a command to the LCD
void lcd_send_command(uint8_t cmd) {
    LCD_RS_LOW(); // Command mode
    lcd_send_nibble(cmd >> 4); // Send high nibble
    lcd_send_nibble(cmd & 0x0F); // Send low nibble
    _delay_us(100); // Wait for the command to execute
}

// Send data to the LCD
void lcd_send_data(uint8_t data) {
    LCD_RS_HIGH(); // Data mode
    lcd_send_nibble(data >> 4); // Send high nibble
    lcd_send_nibble(data & 0x0F); // Send low nibble
    _delay_us(100); // Wait for the data to execute
}

// Send a nibble (4 bits) to the LCD
void lcd_send_nibble(uint8_t nibble) {
    PORTC.OUTCLR = LCD_D4 | LCD_D5 | LCD_D6 | LCD_D7; // Clear data 
lines

    // Set data lines based on nibble
    if (nibble & 0x01) PORTC.OUTSET = LCD_D4;
    if (nibble & 0x02) PORTC.OUTSET = LCD_D5;
    if (nibble & 0x04) PORTC.OUTSET = LCD_D6;
    if (nibble & 0x08) PORTC.OUTSET = LCD_D7;

    LCD_E_HIGH(); // Pulse E pin
    _delay_us(2); // Increased pulse width
    LCD_E_LOW();
    _delay_us(200); // Increased latch time
}

// Print a string to the LCD
void lcd_print(const char *str) {
    while (*str) {
        lcd_send_data(*str++); // Send characters in data mode
        _delay_ms(2); // Added delay between characters
    }
}

// Clear the LCD display
void lcd_clear() {
    lcd_send_command(0x01); // Clear display command
    _delay_ms(10); // Wait for clear command to execute
}

// Set the cursor to a specific position
void lcd_set_cursor(uint8_t row, uint8_t col) {
    uint8_t address = (row == 0) ? col : (0x40 + col);
    lcd_send_command(0x80 | address); // Set DDRAM address
    _delay_ms(2); // Added delay for cursor set
}

// Main program
int main() {
    lcd_init(); // Initialize the LCD

    lcd_clear(); // Clear the display

    // Write "Hello" to the top row
    lcd_set_cursor(0, 0);
    lcd_print("Hello");

    // Write "World!" to the bottom row
    lcd_set_cursor(1, 0);
    lcd_print("World!");

    while (1) {
        // Main loop
    }

    return 0;
}

von Crazy Harry (crazy_h)


Lesenswert?

Dreh mal den Kontrast runter
1
Procedure DOGM_Init;
2
  Begin
3
    LCDCtrl_M(LCD_m1,$39);               // 8 Bit, 2 Zeilen, InstructionSet 01
4
    LCDCtrl_M(LCD_m1,$1C);               // BIAS 1/4, 2 Zeilen
5
    LCDCtrl_M(LCD_m1,$52);               // Booster aus, Contrast C5 & C4
6
    LCDCtrl_M(LCD_m1,$69);               // Follower-Control
7
    LCDCtrl_M(LCD_m1,$70);               // Contrast C3, C2, C1 & C0
8
    LCDCtrl_M(LCD_m1,$0C);               // Display On, Cursor & Cursor Position Off
9
    LCDCtrl_M(LCD_m1,$38);               // 8 Bit, 2 Zeilen, InstructionSet 00
10
    LCDCtrl_M(LCD_m1,$01);               // Clear Display
11
    LCDCtrl_M(LCD_m1,$06);               // Cursor AutoIncrement
12
  End DOGM_Init;
13
  
14
  
15
Procedure DOGM_Contrast(Contrast:Byte);  // Contrast-Werte 0-63
16
  Var HC, LC :Byte;
17
  Begin
18
    HC:=(Contrast and %00110000) Div 16; // Contrast C5 & C4
19
    LC:=Contrast and %00001111;          // Contrast C3, C2, C1 & C0
20
    LCDCtrl_M(LCD_m1,$39);               // 8 Bit, 2 Zeilen, InstructionSet 01
21
    LCDCtrl_M(LCD_m1,$70 or LC);         // Booster aus, Contrast C5 & C4
22
    LCDCtrl_M(LCD_m1,$50 or HC);         // Contrast C3, C2, C1 & C0
23
    LCDCtrl_M(LCD_m1,$38);               // 8 Bit, 2 Zeilen, InstructionSet 00
24
  End DOGM_Contrast;

Achtung für 5V

: Bearbeitet durch User
von Arnab (arnab)


Lesenswert?

Danke. Aber die schwarzen Kästen erscheinen immer noch. Auch die 
Spannungen schalten nicht um. RS ist immer hoch, E ist immer niedrig, D4 
hoch, D5-D7 niedrig.

Ich habe den folgenden Code verwendet:

#define F_CPU 16000000UL // Define the CPU frequency as 16 MHz
#include <avr/io.h>
#include <util/delay.h>

// Define pin connections
#define RS 1   // PC1
#define E  0   // PC0
#define D4 3   // PC3
#define D5 2   // PC2
#define D6 5   // PC5
#define D7 4   // PC4

// Function Prototypes
void LCD_Init(void);
void LCD_Command(unsigned char cmd);
void LCD_Data(unsigned char data);
void LCD_SetContrast(uint8_t contrast);
void LCD_EnablePulse(void);
void SendNibble(unsigned char nibble);

int main(void) {
  // Set RS, E, D4-D7 as outputs
  PORTC.DIR |= (1 << RS) | (1 << E) | (1 << D4) | (1 << D5) | (1 << D6) 
| (1 << D7);

  // Initialize the LCD
  LCD_Init();

  // Set contrast to a middle value (e.g., 32 out of 63)
  LCD_SetContrast(32);

  // Display a test message
  LCD_Command(0x80);       // Set cursor to the first position
  LCD_Data('H');
  LCD_Data('E');
  LCD_Data('L');
  LCD_Data('L');
  LCD_Data('O');

  while (1) {
    // Infinite loop (do nothing)
  }
}

void LCD_Init(void) {
  _delay_ms(20);  // Wait for LCD to power up

  // DOGM162 initialization sequence
  LCD_Command(0x39);  // Function Set: 8-bit, 2-line, instruction set 01
  LCD_Command(0x1C);  // Bias 1/4, 2-line display
  LCD_Command(0x52);  // Booster off, contrast C5 & C4
  LCD_Command(0x69);  // Follower Control
  LCD_Command(0x70);  // Contrast C3, C2, C1, & C0
  LCD_Command(0x0C);  // Display ON, Cursor OFF
  LCD_Command(0x38);  // Function Set: 8-bit, 2-line, instruction set 00
  LCD_Command(0x01);  // Clear Display
  _delay_ms(2);       // Clear display requires longer delay
  LCD_Command(0x06);  // Cursor AutoIncrement
  _delay_ms(2);
}

void LCD_SetContrast(uint8_t contrast) {
  uint8_t HC, LC;

  // Extract high and low contrast bits
  HC = (contrast & 0x30) >> 4;  // Contrast C5 & C4
  LC = (contrast & 0x0F);       // Contrast C3, C2, C1 & C0

  // Send commands to adjust contrast
  LCD_Command(0x39);          // Function Set: 8-bit, 2-line, 
instruction set 01
  LCD_Command(0x70 | LC);     // Set lower contrast bits (C3-C0)
  LCD_Command(0x50 | HC);     // Set higher contrast bits (C5-C4)
  LCD_Command(0x38);          // Function Set: 8-bit, 2-line, 
instruction set 00
}

void LCD_Command(unsigned char cmd) {
  PORTC.OUT &= ~(1 << RS);  // RS = 0 for command

  // Send upper nibble
  SendNibble(cmd >> 4);
  LCD_EnablePulse();

  // Send lower nibble
  SendNibble(cmd & 0x0F);
  LCD_EnablePulse();

  _delay_us(50);  // Short delay for command processing
}

void LCD_Data(unsigned char data) {
  PORTC.OUT |= (1 << RS);  // RS = 1 for data

  // Send upper nibble
  SendNibble(data >> 4);
  LCD_EnablePulse();

  // Send lower nibble
  SendNibble(data & 0x0F);
  LCD_EnablePulse();

  _delay_us(50);  // Short delay for data processing
}

void SendNibble(unsigned char nibble) {
  PORTC.OUT &= ~((1 << D4) | (1 << D5) | (1 << D6) | (1 << D7));  // 
Clear data pins
  if (nibble & 0x01) PORTC.OUT |= (1 << D4);  // Set D4
  if (nibble & 0x02) PORTC.OUT |= (1 << D5);  // Set D5
  if (nibble & 0x04) PORTC.OUT |= (1 << D6);  // Set D6
  if (nibble & 0x08) PORTC.OUT |= (1 << D7);  // Set D7
}

void LCD_EnablePulse(void) {
  PORTC.OUT |= (1 << E);    // Set E HIGH
  _delay_us(1);             // Pulse width
  PORTC.OUT &= ~(1 << E);   // Set E LOW
  _delay_us(100);           // Command processing delay
}

von Hmmm (hmmm)


Lesenswert?

Arnab schrieb:
> 4bit, parallel

Sieht aber nicht danach aus, dass Du es dafür passend initialisierst.

von Rainer W. (rawi)


Lesenswert?

Arnab schrieb:
> Ich habe den folgenden Code verwendet:

Dann markiere ihn doch auch als Code.

Wichtige Regeln - erst lesen, dann posten!
Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
und Formatierung für C-Code

von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

Entschuldigung, ich habe es jetzt angehängt. Danke für den Hinweis.

von Andreas S. (bastelmax)


Angehängte Dateien:

Lesenswert?

Vieleicht hilft dass Dir auch weiter :
https://github.com/wayoda/DogLcd

: Bearbeitet durch User
von Arnab (arnab)


Lesenswert?

Danke!

: Bearbeitet durch User
von Andreas S. (bastelmax)


Lesenswert?

Andreas S. schrieb:
> Vieleicht hilft dass Dir auch weiter :

Hab noch was vergessen : das Display ist auf SPI "verdrahtet"
Den Code von Github würde ich als Basis nehmen und den Code
von Dir entsprechend überprüfen / anpassen.

: Bearbeitet durch User
von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

Guten Tag,

leider hat das Display immer noch nicht wie erwartet funktioniert. Es 
werden immer noch schwarze Kästchen angezeigt, es wurden verschiedene 
Verträge getestet.

Wäre jemand so freundlich, meinen Code zu überprüfen?

Vielen Dank :)

von Frank O. (frank_o)


Lesenswert?

Guck mal bei Olli Kraus! Der hat bestimmt eine funktionierende Library.
https://github.com/olikraus/dogm128/blob/master/libraries/Dogm/utility/dogm128.h

von Hmmm (hmmm)


Lesenswert?

Arnab schrieb:
> Wäre jemand so freundlich, meinen Code zu überprüfen?

Bei der Initialisierung sollte man eigentlich erstmal alle Port-Pins 
sinnvoll konfigurieren. EN und RS setzt Du z.B. nicht explizit auf 
Low-Pegel.

von S. L. (sldt)


Lesenswert?

> Wäre jemand so freundlich, meinen Code zu überprüfen?

Nachdem sich niemand meldet, versuche ich es mal, allerdings ohne allzu 
große Hoffnung, denn: ich habe hier nur ein Uralt-LCD, 2*16 stellig (ist 
wohl ein HD44780).
  Damit funktioniert das vorgestellte Programm, wenn ich die 10 Zeilen 
nach 'Initialization sequence as per datasheet' ersetze durch
1
lcd_send_byte(0x28, 1);
2
lcd_send_byte(0x06, 1);
3
lcd_send_byte(0x0C, 1);

Dass ich mit einem ATmega4809 arbeite, sollte keine Rolle spielen.

von Crazy Harry (crazy_h)


Angehängte Dateien:

Lesenswert?

Fangen wir mal von vorne an: Deine Beschaltung entspricht nicht der des 
DB für 3.3V 4Bit parallel

Beitrag #7807034 wurde vom Autor gelöscht.
von S. L. (sldt)


Lesenswert?

Sind Sie sicher, dass es statt
1
lcd_send_byte(0x38, 1); // Function Set: switch back to normal mode
nicht '0x28' (für 4 bit-Modus) heißen muss?

von Hugo H. (hugo_hu)


Lesenswert?


von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

Hallo zusammen, vielen Dank für die vielen Anregungen. Ich habe in der 
Lage gewesen, die Zeichen auf dem Display zu sehen, aber es geht zurück 
zu schwarzen Boxen Gewinn nach ein paar Millisekunden. Ich habe die 
Initialisierung gemäß der Seite 41 von 
https://www.lcd-module.com/eng/pdf/zubehoer/st7036.pdf durchgeführt.

Könnte es möglicherweise irgendwelche anderen Probleme im Code geben? 
Vielen Dank für Ihre Erkenntnisse.

Beitrag #7807322 wurde vom Autor gelöscht.
von Arnab (arnab)


Lesenswert?

Crazy Harry schrieb:
> Fangen wir mal von vorne an: Deine Beschaltung entspricht nicht der des
> DB für 3.3V 4Bit parallel

Meinen Sie, dass die Pins D0-D3 nicht mit 3,3 V verbunden sind? 
Ansonsten stimmt der Anschluss mit dem Datenblatt überein.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Arnab schrieb:

> Könnte es möglicherweise irgendwelche anderen Probleme im Code geben?
> Vielen Dank für Ihre Erkenntnisse.

Du solltest bei der Initialisierung des I/O-Ports zuerst das 
Datenregister initialisieren und dann erst die Bits im 
Direction-Register setzen. Ansonsten gibt es kurze Impulse, falls im 
Datenrigister Bits gesetzt waren.

Grüßle,
Volker

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Arnab schrieb:
> Ich habe in der
> Lage gewesen, die Zeichen auf dem Display zu sehen, aber es geht zurück
> zu schwarzen Boxen Gewinn nach ein paar Millisekunden.

So ganz verstehe ich Deine Aussage nicht. Wenn die Zeichen zuerst lesbar 
waren und dann verschwinden, würde ich auf eine falsche Einstellung des 
Kontrastst tippen.

Respekt, dass Deine Augen "ein paar Millisekunden" auflösen. Bei mir 
liegt's in der Größenordnung von hundert Millisekunden. :-)

Grüßle,
Volker

von Arnab (arnab)


Lesenswert?

Volker B. schrieb:

> So ganz verstehe ich Deine Aussage nicht. Wenn die Zeichen zuerst lesbar
> waren und dann verschwinden, würde ich auf eine falsche Einstellung des
> Kontrastst tippen.
>
> Respekt, dass Deine Augen "ein paar Millisekunden" auflösen. Bei mir
> liegt's in der Größenordnung von hundert Millisekunden. :-)
>
> Grüßle,
> Volker

Ich meine, dass es nach der Anzeige der Zeichen wieder zu schwarzen 
Kästchen wird, sobald ich den Code flashe. Der Unterschied zwischen den 
Vout und Vin Pins des Displays ist 2.584 Volt. Könnte dies ein Problem 
sein? Ich habe es mit verschiedenen Kontrastwerten im Code versucht, 
aber es wird immer noch das Gleiche angezeigt.

Vielen Dank für Ihre Anregungen!

: Bearbeitet durch User
von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Arnab schrieb:

> Ich meine, dass es nach der Anzeige der Zeichen wieder zu schwarzen
> Kästchen wird, sobald ich den Code flashe.

Sorry, aber das verstehe ich nicht. Wieso werden Zeichen angezeigt bevor 
Dein Code überhaupt ausgeführt wird?

> Der Unterschied zwischen den
> Vout und Vin Pins des Displays ist 2.584 Volt. Könnte dies ein Problem
> sein?

Ich kenne das verwendete LCD leider nicht. Meine Erfahrungen beziehen 
sich auf den 44780 und für diesen scheint mir Deine Initialisierung zu 
funktionieren. Der Begriff "Voltage Booster" aus dem Datenblatt deutet 
darauf hin, dass es wohl einen Spannungsunterschied geben wird. Ist Vout 
höher als Vin?

> Ich habe es mit verschiedenen Kontrastwerten im Code versucht,
> aber es wird immer noch das Gleiche angezeigt.

Ich würde die Werte nicht fest in den Code schreiben sondern in einem 
Vorversuch, z.B. über die serielle Schnittstelle, eingeben und dann 
schrittweise den gesamten Wertebreich "durchspielen", inkl. "booster on"
und "booster off".

Grüße,
Volker

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Arnab schrieb:
> Initialisierung gemäß der Seite 41 von
> https://www.lcd-module.com/eng/pdf/zubehoer/st7036.pdf durchgeführt.

Dort ist angegeben lcd_send_byte(0x30); du machst daraus 
cd_send_nibble(0x03);
Das ist sicher nicht das Gleiche.
Wenn du schon Send_nibble() verwenden willst dann so:
1
  lcd_send_nibble(0x03);
2
  lcd_send_nibble(0x00);
3
  ....

Mach einfach was im DB steht dann geht das.

von Hmmm (hmmm)


Lesenswert?

Thomas Z. schrieb:
> du machst daraus cd_send_nibble(0x03);
> Das ist sicher nicht das Gleiche.

Das ist schon korrekt. Bei der Initialisierung wird das LCD immer erst 
im 8-Bit-Modus angesprochen, deshalb ohne lcd_send_byte(), was daraus 
jeweils zwei Nibbles machen würde.

Das passiert dreimal, um es ggf. auch erstmal sauber aus dem 4-Bit-Modus 
zurückzuholen zu können, erst danach wird es dann auf 4-Bit umgeschaltet 
und dann nibbleweise angesprochen.

von Thomas Z. (usbman)


Lesenswert?

Hmmm schrieb:
> Das ist schon korrekt. Bei der Initialisierung wird das LCD immer erst
> im 8-Bit-Modus angesprochen, deshalb ohne lcd_send_byte(), was daraus
> jeweils zwei Nibbles machen würde.

nö ist eben nicht ok. Im Datenblatt steht ja eindeutig wie das Display 
zu initialisieren ist. Da steht nix davon dass man am Anfang nur Nibbles 
senden darf.
Wenn also mit lcd_send_nipple() dann etwa so:
1
  //3 times functionset
2
  lcd_send_nibble(0x03); lcd_send_nibble(0x00);
3
  lcd_send_nibble(0x03); lcd_send_nibble(0x00);
4
  lcd_send_nibble(0x03); lcd_send_nibble(0x00);
5
  ...

übrigens ist ein delay() bei lcd_send_nipple() vollkommen überflüssig. 
Die delays sind immer nach einem vollständigen cmd notwendig.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Thomas Z. schrieb:

> Im Datenblatt steht ja eindeutig wie das Display
> zu initialisieren ist. Da steht nix davon dass man am Anfang nur Nibbles
> senden darf.

Komisch, der Hitachi 44780 ist mit 4 Nibbles zufrieden, um ihn in den 
4-Bit-Modus zu bringen. Es wäre auch unlogisch, 8-Bit-Daten zu fordern, 
wenn das LCD nur mit 4 Datenleitungen an die MCU gekoppelt ist.

Da die unteren 4 Datenleitungen nicht beschaltet sind, "sieht" das LCD 
bei Ausgabe des 0x03 Nibbles das Byte 0x30. Aber an diesem Punkt würde 
mir zu denken geben, dass der Hersteller des hier verwendeten LCD 
explizit fordert, die unbeschalteten Datenleitungen auf Vdd zu legen.

> Wenn also mit lcd_send_nipple() dann etwa so:
>
1
>   //3 times functionset
2
>   lcd_send_nibble(0x03); lcd_send_nibble(0x00);
3
>   lcd_send_nibble(0x03); lcd_send_nibble(0x00);
4
>   lcd_send_nibble(0x03); lcd_send_nibble(0x00);
5
>   ...
6
>
...mit etwas Glück ignoriert der Controller die unötigen Null-Nibbles.

Grüßle,
Volker

: Bearbeitet durch User
von Thomas Z. (usbman)


Lesenswert?

Volker B. schrieb:
> Komisch, der Hitachi 44780 ist mit 4 Nibbles zufrieden,

auch beim Hitachi ist es nicht anders. Ich benutzte seit 30 Jahren 3 
Functionsets um in den 4 Bit Mode zu kommen. Das war so auch im alten 
Hitachi DB beschrieben. Erst die neueren DBs von Hitachi sind da anders.
Nicht umsonst ist das Low nibble dont care. Die haben sich das damals 
ganz geschickt ausgedacht.
Beim 3. FunktionSet kann man dann 1 bzw 2 Zeilen einstellen.

von Crazy Harry (crazy_h)


Lesenswert?

Arnab schrieb:
> Meinen Sie, dass die Pins D0-D3 nicht mit 3,3 V verbunden sind?
> Ansonsten stimmt der Anschluss mit dem Datenblatt überein.

Ja das meine ich. Der Herausgeber des DB hat sich sicher was dabei 
gedacht, als es das so gezeichnet hat.

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Thomas Z. schrieb:

> Nicht umsonst ist das Low nibble dont care. Die haben sich das damals
> ganz geschickt ausgedacht.

Der Aussage stimme ich zu, nur Deine Folgerung, dass dann im 4-Bit-Modus 
explizit Null-Nibbles anzulegen seien, kann ich nicht nachvollziehen.

Aber, was soll's ich bin glücklich mit meinem Code und Du mit Deinem.:-)

Grüßle,
Volker

von Hmmm (hmmm)


Lesenswert?

Thomas Z. schrieb:
> Im Datenblatt steht ja eindeutig wie das Display zu initialisieren ist.
> Da steht nix davon dass man am Anfang nur Nibbles senden darf.

Ob Du die Funktion lcd_send_nibble() oder 
lcd_send_without_chopping_bytes_into_nibbles() nennst, ist völlig egal.

Es geht darum, was im Endeffekt passiert, nämlich Ansteuerung im 
8-Bit-Modus. Erst wenn das LCD sicher im 4-Bit-Modus ist, sendet man 
jeweils 2 Nibbles.

von Thomas Z. (usbman)


Lesenswert?

Hmmm schrieb:
> ist völlig egal.

stimmt es ist völlig egal wie man das nennt.

von S. L. (sldt)


Lesenswert?

Halten wir fest: das zuletzt gezeigte Programm läuft mit HD44780.
  Es muss folglich an den Zusatzfunktionen des ST7036 liegen (im 
Programm: 0x70, 0x5E, 0x6C) oder an der Hardware(-verdrahtung).

von Arnab (arnab)


Lesenswert?

Vielen Dank an alle für die Vorschläge. Nur ein kurzes Update, ich 
verband die D0-D3-Pins an die VDD, aber jetzt das Display nicht 
einschalten mit dem Code, den ich vor beigefügt. Auch die 
Vout-Pin-Spannung ist jetzt weniger als 3,3 V, die um 5,5 V war, während 
D0-D3 unverbunden gelassen wurden.

Außerdem zeigte D0-D3 3,28V an, wenn es nicht an VDD angeschlossen war.

von S. L. (sldt)


Lesenswert?

Welche Spannung wird an R/W (Pin 37) gemessen?

von Arnab (arnab)


Lesenswert?

S. L. schrieb:
> Welche Spannung wird an R/W (Pin 37) gemessen?

Es ist 0 Volt. Auch RS(39) und E(36) zeigen 0 Volt an.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> Auch RS(39) und E(36) zeigen 0 Volt an.

Merkwürdig: RS ist mit PC1 des uCs verbunden, und zeigt bei mir nach 
Programmende High-Pegel, es erfolgt ja zum Schluss eine Textausgabe, 
also Daten, und RS wird nicht mehr explizit zurückgesetzt.

von Arnab (arnab)


Lesenswert?

S. L. schrieb:
>> Auch RS(39) und E(36) zeigen 0 Volt an.
>
> Merkwürdig: RS ist mit PC1 des uCs verbunden, und zeigt bei mir nach
> Programmende High-Pegel, es erfolgt ja zum Schluss eine Textausgabe,
> also Daten, und RS wird nicht mehr explizit zurückgesetzt.

Für den Moment kehre ich zum vorherigen Aufbau zurück, wobei D0-D3 nicht 
angeschlossen sind. Das Display ist wieder eingeschaltet, die Zeichen 
blinken kurz auf und werden dann zu Kästchen. Auffallend ist, dass die 
Zeichenkästen blau sind, der Rest ist schwarz.

Die Spannungen am Rs-Pin zeigen 3,287 V, am E-Pin 0 V. D0-D3 
(unverbundene Pins) zeigen 3,244 V

von S. L. (sldt)


Lesenswert?

Ein allerletzter Versuch von meiner Seite: was passiert denn, wenn Sie 
die ST7036-spezifischen Kommandos weglassen bzw. auskommentieren 
('Contrast Control Commands', diese 0x70, 0x5E, 0x6C), d.h. für den 
Anfang auf die Reset-Werte des ST7036 vertrauen?

von Hugo H. (hugo_hu)


Angehängte Dateien:

Lesenswert?

Arnab schrieb:
> Ich habe die
> Initialisierung gemäß der Seite 41 von
> https://www.lcd-module.com/eng/pdf/zubehoer/st7036.pdf durchgeführt.

Und wo ist der Schritt (s. Anlage) ?

Die 3,3V an den unbenutzten Pins sollten schon angelegt werden - steht 
ja nicht umsonst im Datenblatt.

Kann es an Deiner Platine / Lötstellen liegen? Sieht ja nicht unbedingt 
"Fabrikfrisch" aus :-)

Hast Du das auch wirklich so ("ungewöhnlich") verschaltet?

#define LCD_D4     PIN3_bm // Data Bit 4 (PC3)
#define LCD_D5     PIN2_bm // Data Bit 5 (PC2)
#define LCD_D6     PIN5_bm // Data Bit 6 (PC5)
#define LCD_D7     PIN4_bm // Data Bit 7 (PC4)

: Bearbeitet durch User
von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

Leider hat es bis jetzt nicht funktioniert. Ich habe meinen neuesten 
Code beigefügt. Ich würde mich über jede Anregung freuen.

Vielen Dank !:)

von Hugo H. (hugo_hu)


Lesenswert?

Schön wäre es, wenn Du auch Fragen beantworten würdest.

Verwendets Du wirklich einen

Arnab schrieb:
> ATxmega128A1

?

Falls ja, wo stellst Du denn den Takt für den X-mega ein? Und woher soll 
der kommen? Intern oder extern?
Im Standard läuft der nicht mit 16 MHz.

: Bearbeitet durch User
Beitrag #7807637 wurde vom Autor gelöscht.
von Arnab (arnab)


Lesenswert?

Hugo H. schrieb:
> Schön wäre es, wenn Du auch Fragen beantworten würdest.
>
> Verwendets Du wirklich einen
>
> Arnab schrieb:
>> ATxmega128A1
>
> ?
>
> Falls ja, wo stellst Du denn den Takt für den X-mega ein? Und woher soll
> der kommen? Intern oder extern?
> Im Standard läuft der nicht mit 16 MHz.


Ja, ich verwende ATxmega128A1, der externe Takt von 16MHz ist in die 
Xmega-Hardware integriert.

von Hugo H. (hugo_hu)


Lesenswert?

Arnab schrieb:
> der externe Takt von 16MHz ist in die
> Xmega-Hardware integriert

Das wäre mir neu - wo steht das? Nach meiner Kenntnis müssen dazu Bits 
in Control-Registern eingestellt werden - in der "Startup-Sequenz".

Hier kannst Du Dich schlau machen:
https://www.kampis-elektroecke.de/mikrocontroller/xmega-clock/

: Bearbeitet durch User
von Arnab (arnab)


Lesenswert?

Hugo H. schrieb:
> Arnab schrieb:
>> der externe Takt von 16MHz ist in die
>> Xmega-Hardware integriert
>
> Das wäre mir neu - wo steht das? Nach meiner Kenntnis müssen dazu Bits
> in Control-Registern eingestellt werden - in der "Startup-Sequenz".
>
> Hier kannst Du Dich schlau machen:
> https://www.kampis-elektroecke.de/mikrocontroller/xmega-clock/

Der Takt ist hier nicht das Problem. Ein externer 16MHz-Takt wurde an 
die MCU angeschlossen. Tut mir leid, wenn Sie mich falsch verstehen. 
Trotzdem vielen Dank für die Anregung :)

von Hugo H. (hugo_hu)


Lesenswert?

Na dann - viel Spass noch ...

von Frank O. (frank_o)


Lesenswert?

Ist das so schwer?
Ich muss mal schauen, kann sein, dass ich auch noch so ein Dogmdings 
habe.
Dann muss ich das doch auch mal ausprobieren.

von Arnab (arnab)


Lesenswert?

Leider hat es bisher nicht funktioniert. Das Zeichen erscheint nur kurz 
und verwandelt sich dann in Kästchen. Ich kann die Zeichen sehen, wenn 
ich das Display aus einem bestimmten Winkel betrachte.

Ich habe die Pins D0-D3 wieder an VDD angeschlossen. Die Lötung ist in 
Ordnung und ein 16MHz externer Quarz (HC6035/4-16MHz) ist an die MCU 
angeschlossen. Die am E-Pin beobachtete Spannung war niedrig und lag in 
allen Testfällen bei 3,286 V.

von Hmmm (hmmm)


Lesenswert?

Arnab schrieb:
> Ich kann die Zeichen sehen, wenn ich das Display aus einem bestimmten
> Winkel betrachte.

Klingt nach falsch eingestelltem Kontrast.

von S. L. (sldt)


Lesenswert?

> Klingt nach falsch eingestelltem Kontrast.

Das sehe ich ähnlich, aber meine Frage von gestern nachmittag war keiner 
Antwort wert ...

von Arnab (arnab)


Lesenswert?

S. L. schrieb:
>> Klingt nach falsch eingestelltem Kontrast.
>
> Das sehe ich ähnlich, aber meine Frage von gestern nachmittag war keiner
> Antwort wert ...

Es hat nicht geklappt..

Ich habe auch bemerkt, dass der E-Pin in allen Testfällen immer 0 Volt 
und der Rs-Pin immer hoch war.

von S. L. (sldt)


Lesenswert?

> Es hat nicht geklappt..

Da hätte ich gerne das dazugehörige Programm gesehen.
  Die von Ihnen zuletzt gezeigte Version mit den wahllos eingestreuten 
0x00-Befehlen sieht nicht durchdacht aus.

von Hugo H. (hugo_hu)


Lesenswert?

Ich wollte eigentlich nichts mehr schreiben, aber das kann nicht 
funktionieren:
1
// Step 2: 8-bit Mode Initialization (3 times Function Set 0x30)
2
  lcd_send_nibble(0x03); lcd_send_nibble(0x00); // First function set
3
  _delay_ms(5);                                  // Longer delay after the first command
4
  lcd_send_nibble(0x03); lcd_send_nibble(0x00); // Second function set
5
  _delay_us(200);                                // Shorter delay for subsequent commands
6
  lcd_send_nibble(0x03); lcd_send_nibble(0x00); // Third function set
7
  _delay_us(200);
8
  // Step 3: Force 4-bit Mode (0x20)
9
  lcd_send_nibble(0x02); lcd_send_nibble(0x00); // Force 4-bit mode
10
  _delay_us(200);

Das jeweils 2. "lcd_send_nibble(0x00)" gehört da nicht hin - es wird ein 
zusätzlicher Enable-Impuls erzeugt, der (mit Wert 0) nicht in die 
Initialisierungs-Sequenz gehört.

Erst nach Einstellung auf 4-Bit-Modus werden jeweils 2 Nibble mit 2 
Enable-Impulsen erwartet.

: Bearbeitet durch User
von Arnab (arnab)


Angehängte Dateien:

Lesenswert?

S. L. schrieb:
>> Es hat nicht geklappt..
>
> Da hätte ich gerne das dazugehörige Programm gesehen.
>   Die von Ihnen zuletzt gezeigte Version mit den wahllos eingestreuten
> 0x00-Befehlen sieht nicht durchdacht aus.

Der Code ist beigefügt :)

von S. L. (sldt)


Lesenswert?

> Der Code ist beigefügt :)

Ich schrieb "die ST7036-spezifischen Kommandos weglassen ... ('Contrast 
Control Commands')", aber das steht nach wie vor drin: step 4..6.

von Arnab (arnab)


Lesenswert?

S. L. schrieb:
>> Der Code ist beigefügt :)
>
> Ich schrieb "die ST7036-spezifischen Kommandos weglassen ... ('Contrast
> Control Commands')", aber das steht nach wie vor drin: step 4..6.

Leider ist es immer noch so.

Ich möchte mich noch einmal bei allen bedanken, die hier kommentieren, 
das hilft wirklich :)

von Hugo H. (hugo_hu)


Lesenswert?

Arnab schrieb:
> Ich habe auch bemerkt, dass der E-Pin in allen Testfällen immer 0 Volt
> und der Rs-Pin immer hoch war.

Woher kommen denn wohl die Spannungen an diesen PINs?

Schau Dir mal S. 45 im DB an (und in Deinem Code nach).

von S. L. (sldt)


Lesenswert?

> Leider ist es immer noch so.

Diese Version zeigen, d.h. anhängen.

von Hmmm (hmmm)


Lesenswert?

Arnab schrieb:
> Leider ist es immer noch so.

Hast Du denn mal versucht, den Kontrast zu variieren?

Ich habe immer mehr das Gefühl, dass Du gar nicht verstehst, was Du 
tust, sondern nur mit Copy&Paste und unseren Anmerkungen ziellos etwas 
zusammenwurstelst.

Was soll z.B. das manuelle Zerlegen der 4-Bit-Kommunikation in Nibbles, 
wenn Du genau dafür lcd_send_byte() hast?

von S. L. (sldt)


Angehängte Dateien:

Lesenswert?

Drehen wir es um: das angehängte Programm läuft hier auf einem HD44780, 
probieren Sie es bei sich aus - vielleicht haben Sie ja Glück.

PS:
Ein-/Ausschalten zwischendurch nicht vergessen.

: Bearbeitet durch User
von Joachim B. (jar)


Lesenswert?

Hmmm schrieb:
> Klingt nach falsch eingestelltem Kontrast.

immer noch und sogar als wenn die Kontrastspannung wegdriftet!
Falsch angeschlossen Lötbrücke irgendwohin?

Arnab schrieb:
> Das Zeichen erscheint nur kurz
> und verwandelt sich dann in Kästchen.

da muß was faul sein an der Kontrastspannung und das kann man messen!

von Spess53 .. (hardygroeger)


Lesenswert?

Hi

>immer noch und sogar als wenn die Kontrastspannung wegdriftet!

Warum sollte die 'wegdriften'?

Ich halte es für eher wahrscheinlich, das durch nachfolgende Befehle die 
Kontrastspannung negativ beeinflusst wird.

MfG Spess

von Joachim B. (jar)


Lesenswert?

Spess53 .. schrieb:
> Warum sollte die 'wegdriften'?

so ist die Beschreibung

Spess53 .. schrieb:
> Ich halte es für eher wahrscheinlich, das durch nachfolgende Befehle die
> Kontrastspannung negativ beeinflusst wird.

auch möglich, da hilft nach dem ersten Print wo noch alles lesbar ist 
ein
1
while(1);

von Hugo H. (hugo_hu)


Lesenswert?

Aus meiner Sich gibt es 2 Möglichkeiten:

1.)
Hmmm schrieb:
> Ich habe immer mehr das Gefühl, dass Du gar nicht verstehst, was Du
> tust, sondern nur mit Copy&Paste und unseren Anmerkungen ziellos etwas
> zusammenwurstelst.

Dazu kann es Fehler in der Schaltung / auf dem PCB geben, die wir nicht 
kennen.

Ferner vermute ich, dass permanent ein Programmer (ggf. aktiv) über ISP 
an Port C hängt (parallel zum Display) und dort für "interessante 
Effekte" sorgt.

2.)
Troll

von Volker B. (Firma: L-E-A) (vobs)


Lesenswert?

Hugo H. schrieb:

> Ferner vermute ich, dass permanent ein Programmer (ggf. aktiv) über ISP
> an Port C hängt (parallel zum Display) und dort für "interessante
> Effekte" sorgt.

Oh, eine KI, die halluziniert? Xmegas werden üblicherweise über zwei 
dedizierte Pins programmiert, die nicht mit I/O-Ports geteilt werden. 
Der  ATxmega128A1(U) besitzt auch noch ein JTAG-Interface, welches aber 
an PortB hängt.

Nachtrag: Aber eine Kollision mit der Peripherie an Port C wäre möglich:
TWIC, SPIC, USARTC0 und -C1 sowie TCC0 und -1. Aber der TO wird diesen 
Hinweis sicherlich ebenfalls ignorieren. :-(

Grüßle,
Volker

: Bearbeitet durch User
von Hugo H. (hugo_hu)


Lesenswert?

Volker B. schrieb:
> Oh, eine KI, die halluziniert? Xmegas werden üblicherweise über zwei
> dedizierte Pins programmiert,

Nö, natürliche Dummheit - ja, Du meinst sicher PDI und hast damit Recht.

von Hugo H. (hugo_hu)


Lesenswert?

Das hat mir keine Ruhe gelassen.
Ich kann es zwar selbst nicht glauben, aber probiere mal diese Sequenz 
für die Initialisierung:
1
lcd_send_byte(0x30);
2
lcd_send_byte(0x33);
3
lcd_send_byte(0x32);
4
lcd_send_byte(0x21); (2. Halbbyte 1 oder ggf. 9 bei 2-zeilig - ausprobieren)

Dann mit "Clear" und "Display on" und irgendwelchen Ausgaben weiter.

Auf einem 163er Display (habe ich hier und jetzt ausprobiert) 
funktioniert das - muss man nicht verstehen ...

Und ja, stammt von hier:
1
// (C) 2020 by Oliver Kuhlemann                        //
2
// Bei Verwendung freue ich mich ueber Namensnennung,  //
3
// Quellenangabe und Verlinkung                        //
4
// Quelle: http://cool-web.de/arduino/                 //

: Bearbeitet durch User
Beitrag #7813538 wurde vom Autor gelöscht.
von Hugo H. (hugo_hu)


Angehängte Dateien:

Lesenswert?

Na, da war ja wieder mal ein Minus-Kasper unterwegs :-)

Falls irgendwann jemand nochmal danach sucht nachstehend 2 Hinweise:

Den habe ich gefunden, indem ich eigentlich diesen Thread gesucht habe

Beitrag "gewünschter Code für EADOGM Display"

Und als Anlage habe ich ein kleines Arduino-Beispiel nach "meinem Gusto"
zusammengestellt (bevor ich vorstehenden Link gefunden hatte). Im ST7306
Datenblatt von SILABS wird "empfohlen", das Busy-Flag abzufragen. Dort
gibt es auch Assembler-Beispiele, an die ich mich angelehnt habe. Ich
verwende _delay_us() statt NOP, damit ist die Wartezeit zwar etwas zu
lang, aber immer dem CPU-Takt (der hoffentlich richtig eingestellt ist)
angepasst.
Das Beispiel ist für ein 3-zeiliges EADOGM163.. ausgelegt.

: Bearbeitet durch User
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.