Forum: Mikrocontroller und Digitale Elektronik Initialisierung eines ST7036 in einem EA DOGM 163S-A


von Patrick R. (pat711)


Lesenswert?

Guten Abend zusammen,

ich habe eine Frage wegen der Initialisierung eines DOGM163S-A - 
Displays. Bei der Initialisierung muss man den Function Set - Befehl 
mehrmals senden. Nirgendwo im Datenblatt habe ich einen Hinweis 
gefunden, wieso dies so ist.
Wird durch den späteren Befehl nicht der erste überschrieben?

MfG Pat711

von spess53 (Gast)


Lesenswert?

Hi

>Brauche dann wohl noch nen passenden Spannungswandler von 9V auf 5V

Ja. Aber, wenn ich mich richtig erinnere, wird damit zwischen den 
Befehlssätzen umgeschaltet.

MfG Spess

von Patrick R. (pat711)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Brauche dann wohl noch nen passenden Spannungswandler von 9V auf 5V
>
> Ja. Aber, wenn ich mich richtig erinnere, wird damit zwischen den
> Befehlssätzen umgeschaltet.
>
> MfG Spess

was ist das für ein Zitat? und welche befehlssätze?

MfG Pat711

von spess53 (Gast)


Lesenswert?

Hi

>was ist das für ein Zitat?

Bitte ignorieren.  War was Falsches in der Zwischenablage.

 und welche befehlssätze?

Mit den Bits 1 und 0 wird zwischen den Instruction Tables umgeschaltet.

MfG Spess

von Patrick R. (pat711)


Lesenswert?

Was kann ich denn mit den Instruction Tables machen?

MfG Pat711

von spess53 (Gast)


Lesenswert?

Hi

>Was kann ich denn mit den Instruction Tables machen?

Die Befehle, die darin stehen benutzen. Lies das Datenblatt vom ST7036. 
Wenn dann noch Fragen offen sind kannst du sie hier stellen.

MfG Spess

von Patrick R. (pat711)


Lesenswert?

OK ich hab mir das Datenblatt nochmal angesehen.
Das mit den Instruction Tables ist also so zu verstehen, dass ich alle 
Tables, deren befehle ich nutzen gedenke zu beginn Laden muss?
Also eigentlich die ersten 3, da das 4. zum testen reserviert ist.
Aber in dem function set - Befehl muss ja auch noch angegeben werden mit 
wie viel Bit das Display angesteuert werden soll und die anzahl der 
Spalten.

Irgendwie steh ich grad bischen auf der Leitung und die Gestaltung des 
Datenblattes sagt mir auch nicht gerade zu.

MfG Pat711

von spess53 (Gast)


Lesenswert?

Hi

Nein. Auf bestimmte Befehle, wie BIAS SET, CONTRAST SET, kannst du erst 
zugreifen, wenn du auf Instruction Table 1 umgeschaltet hast.

MfG Spess

von XMEGA (Gast)


Lesenswert?

Servus,

Patrick R. schrieb:
> Was kann ich denn mit den Instruction Tables machen?

z.B. instruction table 0 und 1


Function Set      0 0 0 0 1 1 1 0 0 0 $38 switch back to inst. table 0
Display ON/OFF    0 0 0 0 0 0 1 1 1 1 $0F disp. on, cursor on, cursor bl
Clear Display     0 0 0 0 0 0 0 0 0 1 $01 delete display, cursor at home

Function Set      0 0 0 0 1 1 1 0 0 1 $39 data length, 2 lines, table 1
Bias Set          0 0 0 0 0 1 0 1 0 1 $15 BS: 1/5, 3 line LCD
usw

Vermutlich werden die Daten nach den Functions Set's decodiert und 
einzeln abgearbeitet?

Gruß XMEGA

von Patrick R. (pat711)


Lesenswert?

Guten Tag zusammen,

ich habe nun noch einmal das Datenblatt angeschaut.
Im besonderen die Seite 41 auf welcher der unten stehende Aufbau zu 
sehen ist.

Zu diesem habe ich ein paar weietere Fragen:

Start
(Power on)

wait Time > 40ms after VDD stable

1) function Set 00    0011XXXX

wait time > 1,6ms

2) function set 00    0011XXXX

wait time > 26,3µs

3) function set 00    0011XXXX

wait Time > 26,3µs

4) function set 00    0010XXXX

wait Time > 26,3µs

5) function set 00    0010XXXX

wait Time > 26,3µs

6) internal OSC frequency
00 0001XXXX
00 BS|F2|F1|F0|XXXX

wait Time > 26,3µs

7) Contrast Set
00 0111XXXX
00 C3|C2|C1|C0|XXXX

wait Time > 26,3µs

8) Power/ICON/Contrast Control
00 0101XXXX
00 Ion|Bon|C5|C4|XXXX

wait Time > 26,3µs

9) Follower Control
00 0110XXXX
00 Fon|Rab2|Rab1|Rab0|XXXX

wait Time > 26,3µs

10) Display On/Off control
00 0000XXXX
00 1|d|C|B|XXXX

wait Time > 26,3µs

Initialization end


Zu Punkt
1) Bit4 = 1 = "high" = 8Bit???
    Wenn dieses bit 1 ist bedeutet das doch dass der 8 Bit Modus gewält 
wird. Oder?

   Wo ist der redt des Functin set - Befehls abgeblieben? die letzten 4 
Bit?

   Wieso wiederholt sich dieses halbe function Set 5 mal? Bräuchte man 
nicht nur das letzte?

4) Erst hier 4 Bit Modus gewählt? (Bit4 = 0 = "low" = 4Bit)

6) diesen Befehl habe ich nicht im Datenblatt gefunden

7/8) Befehle aus Instruction Table 1 -> der letze function set müsste 
also die se wählen

Es werden immer nur die ersten 4 Bit verwendet, da es ja der 4-Bit Modus 
ist. Das high-Byte kommt kurz danach, Daher immer die X.

MfG Pat711

von spess53 (Gast)


Lesenswert?

Hi

>1) Bit4 = 1 = "high" = 8Bit???

Das ist nicht nur bei diesem Controller so. Es werden 3x Function Set 
mit '8Bit-Mode-Bit gesendet.

>Wo ist der redt des Functin set - Befehls abgeblieben? die letzten 4 Bit?

Die sind nicht relevant.

>4) Erst hier 4 Bit Modus gewählt? (Bit4 = 0 = "low" = 4Bit)

Richtig. Aber auch hier sind nur die oberen 4 Bit relevant.

Ab dem nächsten Function Set wird eine andere Ausgaberoutine verwendet, 
die beide Nibble berücksichtigt. Also ab 5. gibt es kein XXXX mehr.

>6) diesen Befehl habe ich nicht im Datenblatt gefunden
Bias Set

>Es werden immer nur die ersten 4 Bit verwendet, da es ja der 4-Bit Modus
>ist. Das high-Byte kommt kurz danach, Daher immer die X.

Nein. Siehe oben

MfG Spess

von Patrick R. (pat711)


Lesenswert?

Diesen Code habe ich aus einem anderen Thread. Ich wollte ihn auf meine 
Bedürfnisse anpassen. Bisher ist mir das aber noch nicht gelungen.
1
#define LCD_PORT  PORTB      //datapins are PB0 to PB4 (DB4 to DB7 on the DOG)
2
#define PIN_ENABLE   PB5
3
#define PIN_RS     PB4
4
5
#define CHARACTER_BUFFER_BASE_ADDRESS    0b10000000
6
#define CHARACTERS_PER_ROW               16  
7
8
//instructions (see the ST7036 instruction set for further information)
9
#define INSTRUCTION_CLEAR_DISPLAY        0b00000001
10
#define INSTRUCTION_FUNCTION_SET_INIT_0    0b00110011
11
#define INSTRUCTION_FUNCTION_SET_INIT_1    0b00110010
12
#define INSTRUCTION_FUNCTION_SET_INIT_2    0b00101001
13
#define INSTRUCTION_INSTRUCTION_SET_0      0b00101000
14
#define INSTRUCTION_INSTRUCTION_SET_1     0b00101001
15
#define INSTRUCTION_BIAS_SET        0b00011100
16
#define INSTRUCTION_POWER_CONTROL       0b01010101
17
#define INSTRUCTION_FOLLOWER_CONTROL    0b01101110
18
#define INSTRUCTION_CONTRAST_SET      0b01110010
19
#define INSTRUCTION_DISPLAY_ON        0b00001111
20
#define INSTRUCTION_ENTRY_MODE         0b00000110
21
22
#include <avr/io.h>
23
#include <util/delay.h>
24
25
//writes 8 bit to the ST7036 in 2 nibbles (2 x 4bit)
26
void write(char data)
27
{
28
  char port_buffer = LCD_PORT;
29
  
30
  //write the high nibble first...
31
  char nibble = (data & 0xF0) >> 4;
32
  LCD_PORT |= nibble;
33
  LCD_PORT |= (1 << PIN_ENABLE);
34
  _delay_ms(1);
35
  
36
  LCD_PORT = port_buffer;
37
  _delay_ms(1);
38
  
39
  //...then the low nibble
40
  nibble = data & 0x0F;
41
  LCD_PORT |= nibble;
42
  LCD_PORT |= (1 << PIN_ENABLE);
43
  _delay_ms(1);
44
  
45
  LCD_PORT = port_buffer;
46
}
47
48
void write_instruction(char instruction)
49
{
50
  //RS low = instruction
51
  LCD_PORT &= ~(1 << PIN_RS);
52
  write(instruction);
53
}
54
55
void write_data(char data)
56
{
57
  //RS high = data
58
  LCD_PORT |= (1 << PIN_RS);
59
  write(data);
60
}
61
62
void set_cursor(char row, char column)
63
{
64
  write_instruction(CHARACTER_BUFFER_BASE_ADDRESS + row * CHARACTERS_PER_ROW + column);
65
}
66
67
void write_string(char* string)
68
{
69
  while (*string)
70
  {
71
    write_data(*string);
72
    *string++;
73
    }
74
}
75
76
void initialize_display(void)
77
{
78
  //wait for a short period, maybe the voltage needs to stabilize first
79
  _delay_ms(50);
80
  
81
  //initialize 4 bit mode
82
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_0);
83
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_1);
84
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_2);
85
  
86
  //initialize everything else
87
  //NOTE: In case you need an other initialization-routine (blinking cursor, 
88
  //double line height etc.) choose the appropriate instructions from 
89
  //the ST7036 datasheet and adjust the C-defines at the top of this file
90
  write_instruction(INSTRUCTION_BIAS_SET);
91
  write_instruction(INSTRUCTION_POWER_CONTROL);
92
  write_instruction(INSTRUCTION_FOLLOWER_CONTROL);
93
  write_instruction(INSTRUCTION_CONTRAST_SET);
94
  write_instruction(INSTRUCTION_INSTRUCTION_SET_0);
95
  write_instruction(INSTRUCTION_DISPLAY_ON);
96
  write_instruction(INSTRUCTION_CLEAR_DISPLAY);
97
  write_instruction(INSTRUCTION_ENTRY_MODE);
98
}
99
100
int main(void)
101
{
102
  //set LCD_PORT to OUTPUT and then ...
103
  DDRB = 0xFF;  
104
105
  //.. do fancy stuff with the lcd
106
  initialize_display();
107
    
108
  set_cursor(0, 0);
109
  write_string("Hello World!");
110
  
111
  set_cursor(1,0);
112
  write_string("Test");
113
  
114
  set_cursor(2,0);
115
  write_string("Test");
116
    
117
  while(1)
118
  {
119
    asm volatile ("nop");  //do nothing (in a very explicit way)
120
  }
121
122
  return 0;
123
}

Controller ist ein ATmega88 an 3,3V.
Aufgebaut ist das Ganze auf einem STK500.

Außerdem kommt ein Warning:
main.c:72: warning: value computed is not used
das ist diese Zeile:
1
while (*string)
2
{
3
    write_data(*string);
4
    *string++;
5
}

übersieht der Compiler hier die Klammer?

Mfg Pat711

von Patrick R. (pat711)


Angehängte Dateien:

Lesenswert?

Guten Abend zusammen,

ich habe nun den oben stehenden Code noch einmal genauer angesehen. 
allerdings konnte ich immer noch keine fehler ausmachen. Im anhang 
dehalb der Code mit makefile und sonstigen Dateien.
Die Beschaltung ist im Bild festgehalten.
Kann mir bitte jemand helfen? ich bin so langsam wirklich am 
verzweifeln. Ich vermute, dass ich in der Initialisierung etwas falsch 
gemacht habe. Ich werde diese morgen auch selbst noch einmal durchsehen.
Aufbau:
STK 500 mit ATmega 88
externe Platine mit im Bild ersichtlicher Beschaltung
12MHz Takt
3,3V-Versorgung durch das Board

MfG Pat711

von Patrick R. (pat711)


Lesenswert?

Ich vermute ich habe meinen Fehler endlich gefunden. An VIN sind keine 
3,3V angeschlossen Kopf gegen Wand und ich hatte es auf die Software 
geschoben. Oh mann. ich werde das ändern und dann melde ich mich hier 
vll nochmal ^^

von Patrick R. (pat711)


Lesenswert?

Ich habe die nötige Verbindung nun eingelötet, allerdings regt sich 
immer noch nichts.
MfG Pat711

von Patrick R. (pat711)


Lesenswert?

Abend zusammen,

ich habe nun noch einen weiteren Hardwarefehler behoben, und zwar waren 
die Datenleitungen auch falsch herum. Keine Ahnung wa ich da gemacht hab 
als ich den chaltplan gezeichnet hab.
Nun geht das LCD allerdings immer noch nicht. Nun habe ich mir mal die 
Library-version, die Tobias Tetzlaff aus der LCD-routine von Ulrich 
Radig gemacht hat genauer angesehen. Diese sieht mir vielversprechender 
aus, vor allem weil da auch das Busy-Flag abgerufen wird. Daher baue ich 
nun noch einmal ein neues Board mit der Hoffnung dass die sache dann 
läuft. :)

MfG Pat711

von GE (Gast)


Lesenswert?

Hat überhaupt jmd. das DOGM163S-A mit 3V zum Laufen gebracht?

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.