mikrocontroller.net

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


Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was kann ich denn mit den Instruction Tables machen?

MfG Pat711

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: XMEGA (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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.
#define LCD_PORT  PORTB      //datapins are PB0 to PB4 (DB4 to DB7 on the DOG)
#define PIN_ENABLE   PB5
#define PIN_RS     PB4

#define CHARACTER_BUFFER_BASE_ADDRESS    0b10000000
#define CHARACTERS_PER_ROW               16  

//instructions (see the ST7036 instruction set for further information)
#define INSTRUCTION_CLEAR_DISPLAY        0b00000001
#define INSTRUCTION_FUNCTION_SET_INIT_0    0b00110011
#define INSTRUCTION_FUNCTION_SET_INIT_1    0b00110010
#define INSTRUCTION_FUNCTION_SET_INIT_2    0b00101001
#define INSTRUCTION_INSTRUCTION_SET_0      0b00101000
#define INSTRUCTION_INSTRUCTION_SET_1     0b00101001
#define INSTRUCTION_BIAS_SET        0b00011100
#define INSTRUCTION_POWER_CONTROL       0b01010101
#define INSTRUCTION_FOLLOWER_CONTROL    0b01101110
#define INSTRUCTION_CONTRAST_SET      0b01110010
#define INSTRUCTION_DISPLAY_ON        0b00001111
#define INSTRUCTION_ENTRY_MODE         0b00000110

#include <avr/io.h>
#include <util/delay.h>

//writes 8 bit to the ST7036 in 2 nibbles (2 x 4bit)
void write(char data)
{
  char port_buffer = LCD_PORT;
  
  //write the high nibble first...
  char nibble = (data & 0xF0) >> 4;
  LCD_PORT |= nibble;
  LCD_PORT |= (1 << PIN_ENABLE);
  _delay_ms(1);
  
  LCD_PORT = port_buffer;
  _delay_ms(1);
  
  //...then the low nibble
  nibble = data & 0x0F;
  LCD_PORT |= nibble;
  LCD_PORT |= (1 << PIN_ENABLE);
  _delay_ms(1);
  
  LCD_PORT = port_buffer;
}

void write_instruction(char instruction)
{
  //RS low = instruction
  LCD_PORT &= ~(1 << PIN_RS);
  write(instruction);
}

void write_data(char data)
{
  //RS high = data
  LCD_PORT |= (1 << PIN_RS);
  write(data);
}

void set_cursor(char row, char column)
{
  write_instruction(CHARACTER_BUFFER_BASE_ADDRESS + row * CHARACTERS_PER_ROW + column);
}

void write_string(char* string)
{
  while (*string)
  {
    write_data(*string);
    *string++;
    }
}

void initialize_display(void)
{
  //wait for a short period, maybe the voltage needs to stabilize first
  _delay_ms(50);
  
  //initialize 4 bit mode
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_0);
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_1);
  write_instruction(INSTRUCTION_FUNCTION_SET_INIT_2);
  
  //initialize everything else
  //NOTE: In case you need an other initialization-routine (blinking cursor, 
  //double line height etc.) choose the appropriate instructions from 
  //the ST7036 datasheet and adjust the C-defines at the top of this file
  write_instruction(INSTRUCTION_BIAS_SET);
  write_instruction(INSTRUCTION_POWER_CONTROL);
  write_instruction(INSTRUCTION_FOLLOWER_CONTROL);
  write_instruction(INSTRUCTION_CONTRAST_SET);
  write_instruction(INSTRUCTION_INSTRUCTION_SET_0);
  write_instruction(INSTRUCTION_DISPLAY_ON);
  write_instruction(INSTRUCTION_CLEAR_DISPLAY);
  write_instruction(INSTRUCTION_ENTRY_MODE);
}

int main(void)
{
  //set LCD_PORT to OUTPUT and then ...
  DDRB = 0xFF;  

  //.. do fancy stuff with the lcd
  initialize_display();
    
  set_cursor(0, 0);
  write_string("Hello World!");
  
  set_cursor(1,0);
  write_string("Test");
  
  set_cursor(2,0);
  write_string("Test");
    
  while(1)
  {
    asm volatile ("nop");  //do nothing (in a very explicit way)
  }

  return 0;
}

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:
while (*string)
{
    write_data(*string);
    *string++;
}

übersieht der Compiler hier die Klammer?

Mfg Pat711

Autor: Patrick R. (pat711)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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 ^^

Autor: Patrick R. (pat711)
Datum:

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

Autor: Patrick R. (pat711)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: GE (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.