EA DOG-M Display (ST7046) und customchars. ARGH!

OP Persönliche Seite #340018
Lesenswert?

Hi Leute.

Ich benutze die Initialisation aus der Controllerbeschreibung.
1
  lcd_cmd4(3);    //3xFunc Set
2
  lcd_cmd4(3);
3
  lcd_cmd4(3);
4
  lcd_cmd4(2);    //Func Set 4Bit
5

6
  lcd_cmd8(0b00101001);  //Func Set
7
  lcd_cmd8(0b01111000);  //Contrast
8
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
9
  lcd_cmd8(0b01101010);  //Follower Control
10
  lcd_cmd8(0b00001100);  //Display ON/OFF
11
  lcd_cmd8(0b00000001);  //Clear Screen
12
  _delay_ms(2);  
13
[C]
14

15
Das funktioniert sowas von Astrein!
16

17
Nun will ich aber meine Customchars draufladen.
18
Also? Ich dachte folgendes:
19

20
[C]
21
  lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
22
  lcd_cmd8(0b01000000); //CGRAM Adresse 0
23

24
  lcd_cmd8(0b000111111);
25
  lcd_cmd8(0b000111111);
26
  lcd_cmd8(0b000111111);
27
  lcd_cmd8(0b000111111);
28
  lcd_cmd8(0b000111111);
29
  lcd_cmd8(0b000111111);  //Daten
30
  lcd_cmd8(0b000111111);
31
  lcd_cmd8(0b000111111);
32

33
  lcd_cmd8(0b100000000); //DDRAM Adresse 0

Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht, komischerweise...
das ist ohne die zweite Routine definitiv nicht so.

Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit Bus
an meinem Controller angeschlossen.
OP Persönliche Seite #340019
Lesenswert?

Och nö! hier nochmal ordentlich formatiert:


Hi Leute.

Ich benutze die Initialisation aus der Controllerbeschreibung.
1
      lcd_cmd4(3); //3xFunc Set
2
      lcd_cmd4(3);
3
      lcd_cmd4(3);
4
      lcd_cmd4(2); //Func Set 4Bit
5
       
6
      lcd_cmd8(0b00101001); //Func Set
7
      lcd_cmd8(0b01111000); //Contrast
8
      lcd_cmd8(0b01011110); //POWER/Icon/Contrast
9
      lcd_cmd8(0b01101010); //Follower Control
10
      lcd_cmd8(0b00001100); //Display ON/OFF
11
      lcd_cmd8(0b00000001); //Clear Screen
12
      _delay_ms(2);

      Das funktioniert sowas von Astrein!
      Nun will ich aber meine Customchars draufladen.
      Also? Ich dachte folgendes:
1
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
2
      lcd_cmd8(0b01000000); //CGRAM Adresse 0
3
       
4
      lcd_cmd8(0b000111111);
5
      lcd_cmd8(0b000111111);
6
      lcd_cmd8(0b000111111);
7
      lcd_cmd8(0b000111111);
8
      lcd_cmd8(0b000111111);
9
      lcd_cmd8(0b000111111); //Daten
10
      lcd_cmd8(0b000111111);
11
      lcd_cmd8(0b000111111);
12

13
      lcd_cmd8(0b100000000); //DDRAM Adresse 0

Das habe ich nach der Initialisierung eingefügt und es will verdammt
nochmal nicht klappen. Die Customchars werde zwar im Display
eingefügt,
sind aber vollkommen leer (wie Leertaste, Also kein Bildpunkt ist
gesetzt). Weiterhin zeigt das Display eine ganz komische Eigenschaft:
Wenn ich den Controller resette und die Routinen oben nochmal
ausgeführt werden, wird der Text am Display an den bestehenden
angefügt. Es wird also nicht der Bildschirm gelöscht,
komischerweise...
das ist ohne die zweite Routine definitiv nicht so.

Hat irgndjemand das schonmal gemacht? Das Display ist über den 4Bit
Bus
an meinem Controller angeschlossen.
Gast #340021
Lesenswert?

Hallo,

bei mir in C siehts so aus:

// Declare your global variables here
typedef unsigned char byte;

/* table for the user defined character*/
// Accu voll
flash byte char1[8]={
0b0000110,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b 
0000000};
// Accu ok
flash byte char2[8]={
0b0000110,0b0001001,0b0001001,0b0001111,0b0001111,0b0001111,0b0001111,0b 
0000000};
// Accu leer
flash byte char3[8]={
0b0000110,0b0001001,0b0001001,0b0001001,0b0001001,0b0001001,0b0001111,0b 
0000000};
// Glühkerze defekt
flash byte char4[8]={
0b0000100,0b0000100,0b0001110,0b0011111,0b0011111,0b0001010,0b0001110,0b 
0000000};
// Temperatursensor defekt
flash byte char5[8]={
0b0000100,0b0001010,0b0001010,0b0001110,0b0011111,0b0011111,0b0001110,0b 
0000000};
// Pumpe läuft / Pumpenspannung
flash byte char6[8]={
0b0011100,0b0010100,0b0011100,0b0010000,0b0010101,0b0000101,0b0000111,0b 
0000010};
// Schalterbetrieb
flash byte char7[8]={
0b0010000,0b0010000,0b0011001,0b0000010,0b0000100,0b0001000,0b0010000,0b 
0010000};

/* function used to define user characters */
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}

Aufrufen der Funktion :

// LCD module initialization
    lcd_init(16);
    lcd_clear();
    // Setze LCD Kontrast Zurück zur Tabelle 0:1
    lcd_contrast(contrast);

        // User define Charachters
        define_char(char1,1);
        define_char(char2,2);
        define_char(char3,3);
        define_char(char4,4);
        define_char(char5,5);
        define_char(char6,6);
        define_char(char7,7);

Und anzeigen der Zeichen:

// switch to writing in Display RAM
        lcd_clear();
        lcd_gotoxy(0,0);
        lcd_putsf("Akku:");

        // display used defined char 0
        lcd_putchar(1);
        lcd_putchar(2);
        lcd_putchar(3);

        // switch to writing in Display RAM
        lcd_gotoxy(0,1);
        lcd_putsf("Glow:   Temp:");

        // display used defined char 0
        lcd_gotoxy(6,1);
        lcd_putchar(4);
        lcd_gotoxy(14,1);
        lcd_putchar(5);

        // switch to writing in Display RAM
        lcd_gotoxy(0,2);
        lcd_putsf("Pump:   Swit:");

        // display used defined char 0
        lcd_gotoxy(6,2);
        lcd_putchar(6);
        lcd_gotoxy(14,2);
        lcd_putchar(7);

        delay_ms( 250 );

Leider ohne Komentar, aber vielleicht hilft es ja.

Gruß Toby
Gast #340023
Lesenswert?

Hallo,

ich habe die Lib vom Codevision etwas geändert, um das DOGM damit
nutzen zu können.

Der Contrast Befefl ist von mir.
Bei der Inti lade ich einen bestimmten Contrastwert, den ich dann,
falls nötig, ändern kann.
War nur so ein Test.

Den CGRAM beschreibe ich nach der Init.
Dabei muß das Display auf Tabelle 0:1 stehen.

Anliegend ist mal meine LIB, die H und ein kleines Prog.

Gruß Toby
Angehängte Dateien:
OP Persönliche Seite #340025
Lesenswert?

Ich benutze kein Codevision AVR..

Wieso schreibst du denn ins CGRAM, bloß wenn du die Tabelle auf 0,1
stellst? Also wenn ich da was schreibe, schreibe ich ins DDRAM und das
wird auf dem Display angezeigt.

Normalerweise muss man ja, bevor man ins CGRAM schreibt, erst die CGRAM
Adresse setzen. Dann weiß der Controller bescheid. Und wenn man wieder
aufs Display schreiben möchte, muss man die DDRAM Adresse setzen. Aber
das machst du ja garnicht.

Diese Doku von dem DOG-M ist so unverständlich... hmpf!
Gast #340027
Lesenswert?

Mit der Unverständlichkeit habe ich auch gekämpft.

Großes Prob war alleine schon die Init.

Ich habe erst die vom Datenblatt versucht.
Später die vom Controller.
Damit ging es dann auch.

Wegen der Tabellen schaue ich eben noch mal nach.

Aufjeden Fall geht es so, wie ich es habe.

Gruß Toby
Gast #340031
Lesenswert?

Hallo,

hier das Init :

// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns)
{
#asm
    cbi   __lcd_port,__lcd_enable ;EN=0
    cbi   __lcd_port,__lcd_rs     ;RS=0
#endasm
_lcd_maxx=lcd_columns;
_base_y[2]=lcd_columns+0x90;
_base_y[3]=lcd_columns+0xA0;
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x30);
_long_delay();
_lcd_init_write(0x20);
_long_delay();

_lcd_ready(); // RS=0
_lcd_write_data(0x29);

_lcd_ready(); // RS=0
_lcd_write_data(0x14);

_lcd_ready(); // RS=0
_lcd_write_data(0x7A);

_lcd_ready(); // RS=0
_lcd_write_data(0x51);

_lcd_ready(); // RS=0
_lcd_write_data(0x6A);

_lcd_ready(); // RS=0
_lcd_write_data(0x0C);

_lcd_ready(); // RS=0
_lcd_write_data(0x01);

_lcd_ready(); // RS=0
_lcd_write_data(0x06);


Es steht in der Dog_LCD.lib

Zurück in die Tabelle 0:1 geht man durch clear_lcd.
Setze ich einen anderen Contrast oder eine Doppelte Zeilenhöhe,
gehe ich vorher in eine andere Tabelle:

void lcd_high (char high)
{
switch (high) {
    case 1:
        //3 Zeienbetrieb
        _lcd_ready(); // RS=0
        _lcd_write_data(0X28);
    break;
    case 2:
        //unteren beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x10);  //UD auf 1
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    case 3:
         //oberen beiden Zeilen Zusammen
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2E);  //Table2
        _lcd_ready(); // RS=0
        _lcd_write_data(0x18);  //UD auf 0
        _lcd_ready(); // RS=0
        _lcd_write_data(0x2C);  //DH auf 1
    break;
    };

}

Das ist genau die Init und Beschreibung, die im Datenblatt des
Controllers steht, und sie funktioniert.

Bitte hänge doch mal dein Programm incl. der Init des LCD an,
ich seh es mir mal an.

Gruß Toby
Gruß Toby
OP Persönliche Seite #340032
Lesenswert?

Meine Init schaut so:
1
  lcd_cmd4(3);    //3xFunc Set
2
  lcd_cmd4(3);
3
  lcd_cmd4(3);
4
  lcd_cmd4(2);    //Func Set 4Bit
5

6
  lcd_cmd8(0b00101001);  //Func Set
7
  lcd_cmd8(0b01111000);  //Contrast
8
  lcd_cmd8(0b01011110);  //POWER/Icon/Contrast
9
  lcd_cmd8(0b01101010);  //Follower Control
10
  lcd_cmd8(0b00001100);  //Display ON/OFF
11
  lcd_cmd8(0b00000001);  //Clear Screen
12
  _delay_ms(2);

Und die Routine, womit ich versucht habe CCs in das Display zu laden
ist folgende:
1
      lcd_cmd8(0b00101000); //Auf Instruction Table 0,0 umstellen
2
      lcd_cmd8(0b01000000); //CGRAM Adresse 0
3

4
      lcd_cmd8(0b000111111);
5
      lcd_cmd8(0b000111111);
6
      lcd_cmd8(0b000111111);
7
      lcd_cmd8(0b000111111);
8
      lcd_cmd8(0b000111111);
9
      lcd_cmd8(0b000111111); //Daten
10
      lcd_cmd8(0b000111111);
11
      lcd_cmd8(0b000111111);
12
       
13
      lcd_cmd8(0b100000000); //DDRAM Adresse 0

Und was ist daran jetzt anders als bei dir? Ich schalte auf die Table 0
um an die CGRAM Adressbefehle zu kommen und schreibe eine CGRAM
Adresse.. Danach 8x Daten und anschließend wieder die DDRAM Adresse 0
um wieder ASCII Daten übertragen zu können.
OP Persönliche Seite #340033
Lesenswert?

Verdammt, ich raffe es nicht. Dieses Display ist so schlecht
dokumentiert, oder ich habe wirklich einen Fehler in meinem Code.

ich hab mal die gesamte lcd.c angehangen. Überhalb von der Funktion
lcd_init sind die nicht-gepufferten Befehle und unterhalb sind die
gepufferten. lcd_init steht irgndwo in der mitte.

da siehst du, wie ich kläglich versuche den CustomChar 0 zu
beschreiben.

Es klappt aber nicht. Das Display verhält sich total komisch und tut
so, als würde es die 8 Zeichen auf mein Display ausgeben. Aber da sind
nur leere Felder.

Das CustomChar gebe ich mit lcd_putc(0); aus.
Gast #340036
Lesenswert?

Hallo,

immer noch dabei?

Nun ja, mit welchem Compiler machst Du das ganze?

Ich würde gerne mal dein Prog bei mir ausprobieren.

Kannst es mir ja mal per Mail schicken.
Aber bitte hab Verständniss dafür, das ich nicht alles schreiben will,
damit es bei mir läuft.
Außerdem könnte es etwas dauern, da ich von einem Jahr mein DOGM zum
laufen gebracht hab, und hatte es bis heute so gelassen.

Gruß Toby
Gast #340037
Lesenswert?

Hallo nochmal,

ich habe auch mal die Peter Flurry Lib fürs DOGM umgeschrieben.

Anliegend zeigt mein DOGM 163 ein Copyright Zeichen an.

Vielleicht hilft dir das???

Bei mir läuft es auf jeden Fall!

Gruß Toby
Angehängte Dateien:
Gast #340039
Lesenswert?

Hey Simon,

ich habe nun was rausgefunden!

Schau Dir nochmal angehängten Code an.

Die Lib ist in dem Zipfile von voher.

Setzt man die Double High auf 1 also 3 Zeilen Betrieb,
wird kein (c) Zeichen angezeigt.
Auf lcd_lines(2) oder (3) gehts.

Da ich immer mein Display beim Startup Bildschirm auf (3) oberen zeilen
zusammen gesetzt habe, ist mir das Problem nie aufgefallen.

Danach habe ich es wieder auf (1) gesetzt, und dann irgendwann mal den
GCRAM beschrieben.

Also, was macht die Funktion lcd_lines(3) anderes, als die
lcd_lines(1)???

Gruß Toby
Angehängte Dateien:
Gast #340041
Lesenswert?

Hi nochmal, es lässt mir keine Ruhe!

Also, erst auf Tabelle 0:0 (0x28) stellen, stimmt so.
geht jetzt bei mir auch.

Dann kommts :

Der RS Pin steht zum Init auf 0, richtig.

void lcd_cmd8(unsigned char cmd)
{

  LCD_PORT = (cmd & 0xF0) >> 4;

  LCD_PORT &= ~(1<<LCD_RS);

...
...

Aber beim CGRAM Beschreiben muß er auf 1 stehen.

So stehts in meiner Lib.

/* rs==0 -> write instruction to LCD_IO_FUNCTION */
/* rs==1 -> write data to LCD_IO_DATA */

Steht auch so im Datenblatt auf Seite 26.

Wenns klappt, sag kurz bescheid.

Gruß Toby
Angehängte Dateien:
OP Persönliche Seite #340042
Lesenswert?

Ja, das war der Fehler im ersten Code den ich angehangen habe. Guck mal
in den zweiten (Datum: 06.06.2006 19:51).

Da habe ich das verbessert. Klappt trotzdem noch nicht.
Nett dass du dir meinen Code ansiehst, aber ich glaube ehrlichgesagt,
dass das keinen Sinn mehr hat.. Irgndwo wird da der Wurm sein, aber
mein Programm läuft ohne die Funktion ja einwandfrei.. Gibts halt
keinen Bargraphen auf dem Display ;)
Gast #340043
Lesenswert?

Hi nochmal. Ich habe da noch eine Differenz zwischen unserern Codes
sehen können.

Vielleicht ist das die Lösung:
Du schreibst vor jedem Byte, dass in den CGRAM geladen wird die CGRAM
Adresse neu. Vielleicht sollte ich das auch mal versuchen, wobei das
Datenblatt das ja eigentlich nicht explizit vorschreibt.

(Da stand doch irgndwas davon, dass der Ram Counter inkrementiert wird,
wenn ein Byte geschrieben wird. Und das Ziel des Schreibens wird durch
ein vorhergehendes Adresssetzen gesetzt..)

Naja ein Versuch ist es allemal wert.
Gast #528533
Lesenswert?

Hallo!

Hier mein Code:
1
// LCD-Modul an PortC
2
#asm
3
    .equ __lcd_port=0x15
4
#endasm
5
// LCD-Functions
6
#include <dog_lcd.h>
7

8
typedef unsigned char byte;
9
// Test Pfeil aus Hilfe   
10
flash byte char0[8]={
11
0b0000000,0b0001111,0b0000011,0b0000101,0b0001001,0b0010000,0b0100000,0b1000000};
12
// Accu voll
13
flash byte char1[8]={
14
0b0000110,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
15
// Accu ok
16
flash byte char2[8]={
17
0b0000110,0b0001001,0b0001001,0b0001111,0b0001111,0b0001111,0b0001111,0b0000000};
18
// Accu leer
19
flash byte char3[8]={
20
0b0000110,0b0001001,0b0001001,0b0001001,0b0001001,0b0001001,0b0001111,0b0000000};
21
// Glühkerze defekt
22
flash byte char4[8]={
23
0b0000100,0b0000100,0b0001110,0b0011111,0b0011111,0b0001010,0b0001110,0b0000000};
24
// Temperatursensor defekt
25
flash byte char5[8]={
26
0b0000100,0b0001010,0b0001010,0b0001110,0b0011111,0b0011111,0b0001110,0b0000000};
27
// Pumpe läuft / Pumpenspannung
28
flash byte char6[8]={
29
0b0011100,0b0010100,0b0011100,0b0010000,0b0010101,0b0000101,0b0000111,0b0000010};
30
// Schalterbetrieb
31
flash byte char7[8]={
32
0b0010000,0b0010000,0b0011001,0b0000010,0b0000100,0b0001000,0b0010000,0b0010000};
33

34
/* function used to define user characters */
35
void define_char(byte flash *pc,byte char_code)
36
{
37
byte i,a;
38
a=(char_code<<3) | 0x40;
39
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
40
}

Und dieser Codeteil dann im Main:
1
// LCD module initialization (16 Zeichen pro Zeile)
2
lcd_init(16);
3
lcd_clear();
4
lcd_contrast(10);
5
define_char(char0,0);
6
define_char(char1,1);
7
define_char(char2,2);
8
define_char(char3,3);
9
define_char(char4,4);
10
define_char(char5,5);
11
define_char(char6,6);
12
define_char(char7,7);
13
lcd_clear();
14

15
lcd_putchar(0x00);
16
lcd_putchar(0x01);
17
lcd_putchar(0x02);
18
lcd_putchar(0x03);
19
lcd_putchar(0x04);
20
lcd_putchar(0x05);
21
lcd_putchar(0x06);
22
lcd_putchar(0x07);

Die Library ist im Anhang!
Damit funzt es prima.
Angehängte Dateien:
#1113113
Lesenswert?

I am new to this forum.  Please excuse me I do not understand german.
I am trying create a character with the ST7036 lcd driver.  I am looking 
at the aboce example, but I do not know Atmel assembly.  I do know ATmel 
C.

Are there any more examples out there on how to create speacial 
characters in C?

Thank you!
#2110899
Lesenswert?

Hallo,

da ich auch rumprobiert habe und das ganze ohne die lib von ea...

hier mal meine Lösung für nachfolgende Suchanfragen:
1
void Vertikale_Balken(void) 
2
{
3
  for(uint8_t i=0;i<8;i++) {
4
    if(i>6)
5
      SPDR = 0b00011111;
6
    else
7
      SPDR = 0b00000000;
8
    _delay_ms(0.03);
9
    CONTROLPORT &= ~_BV(CTRL_RS);
10
    CONTROLPORT |= _BV(CTRL_RS);
11
  }
12

13
  //hier
14
        //noch
15
        //balken...
16

17
  for(uint8_t i=0;i<8;i++) {
18
    SPDR = 0b00011111;
19
    _delay_ms(0.03);
20
    CONTROLPORT &= ~_BV(CTRL_RS);
21
    CONTROLPORT |= _BV(CTRL_RS);
22
  }
23
}
24
//bedingung ist, dass instruction tabel 0 0 aktiviert ist
25
void define_char(void)
26
{ 
27

28
    CONTROLPORT &= ~_BV(CTRL_RS);
29
                //auf erstes freies Zeichen zeigen
30
    SPDR = 0b01000000;
31
    _delay_ms(0.1);
32
    CONTROLPORT |= _BV(CTRL_RS);
33
          CONTROLPORT &= ~_BV(CTRL_RS);  
34
    CONTROLPORT |= _BV(CTRL_RS);
35
    _delay_ms(0.1);
36

37
    //Aussehen
38
    Vertikale_Balken();
39

40
                //wieder in Displayspeicher zeigen
41
    CONTROLPORT &= ~_BV(CTRL_RS);
42
    SPDR = 0b10000000;
43
    _delay_ms(0.1);
44
    
45
}

noch irgendwo define_char() aufrufen und zeichen sind geschrieben...

grüße

Basti
#2111046
Lesenswert?

ich habe auch ewig mit der doku des display gehadert und schließlich 
eine umfassende lib für den spi mode geschrieben. da klappt alles. für 
den 4/8bit mode muss halt nur die Funktion dazugeschrieben werden. 
vielleicht werdet ihr daraus ja schlau. ist im anhang. würde mich über 
feedback freuen.

tino
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren