Powered By Blogger

Sonntag, 1. Juli 2012

EA DOG-M163

Anschluß eines EA DOG-M Displays an einen µC

Das Display: EA DOG-M081x-A /  DOG-M162x-A / DOG-M163x-A ist bestellbar unter anderem bei Reichelt und das in den verschiedensten Farben. Dadurch sind etliche Farbkombinationen (5 verschiedene Displays und 6 verschiedene Hintergrundfarben) möglich. Grundsätzlich unterscheidet es sich in positiv und negativ Schrift kombinierbar mit den unterschiedlichsten Hintergrundbeleuchtungen. Ein Blick ins Datenblatt sei aber empfohlen.

Exemplarisch mit grünem Hintergrund / schwarzer Schrift und schwarzem Hintergrund / grüner Schrift


Die Verschaltung: Das Display kann entweder als 8-bit/4-bit paralell oder per SPI Schnittstelle, die an sehr vielen Controlern vorhanden ist, angesteuert werden. Im weiteren beschränken wir uns auf den SPI Anschluß, da dieser die Verkabelung deutlich reduziert.

Anschlüsse am Display (ohne Hintergrundbeleuchtung)


Jetzt kommt es drauf an, wie das Display mit dem Mikrocontroller verbunden wird. Hier hatte ich mich das erste Mal verrant. Aber an sich ist es ganz einfach: Es gibt die Anschlüsse SI (28), CLK (29), RS (39) und CSB (38). Alle anderen Anschlüsse werden statisch (vergleiche 3.3V und 5V Anschluß) verschaltet. SI bedeutet serial Data in oder wird auch mit MOSI (Master Output Slave Input) bezeichnet, CLK wird Clock heißen, RS ist die Unterscheidung zwischen Daten und Befehlen und zum Schluß CSB, welches den Chip select darstellt. Bei der Verschaltung mit einem µC muß jetzt darauf geachtet werden, daß die Anschlüsse SI und CLK auch am richtigen Port des µC landen (vgl. Datenblatt). RS und CSB sind dabei frei wählbar.

Zum näheren Verstehen von SPI kann ich folgendes Skript der UNI Koblenz-Landau empfehlen:
SPI – Serial Peripheral Interface

Wird das Display nun mit einem µC, in dem hier vorgestellten Fall, ein ATMEGA-8 verbunden hilft das Datenblatt des ATMEGA-8 weiter welches die Anschlüsse MOSI und CLK sind. Am PDIP (Gehäuseform) ATMEGA-8 ist MOSI der Port PB3 und CLK der Anschluß PB5. Die anderen beiden Anschlüße können je nach belieben verteilt werden. Folgender Anschluß ist möglich:

Anschlußbeispiel (für 3.3V) mit ATMEGA-8 incl. Treiber Hintergrundbeleuchtung

Software: Sind alle nötigen Hardwareverschaltungen gemacht kommt der weitaus schwierigste Teil. Das Datenblatt des Displays in Bezug auf die Initialisierung des Displays zu verstehen. Für manche sollte es kein Problem darstellen, so ganz easy ist es dann noch wieder nicht.

1) das SPI Device am µC als Master aktivieren [spi.c]

#define DOGM163_MOSI    PB3     // MOSI, Master out slave in, am Atmega8
#define DOGM163_SCK     PB5     // SCK am Atmega8
#define DOGM163_SS      PB2     // SS am Atmega

void spi_init(void)
{
    // MOSI, SS und SCK als Ausgang setzen
    DDRB |= (1<<DOGM163_SS)|(1<<DOGM163_MOSI)|(1<<DOGM163_SCK);
    //SPI als Master aktivieren. Clock rate fck/16
    SPCR |= (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}

// Senden von Daten über das SPI Interface
void spi_transmit(char cData)
{
    /* Start transmission */
    SPDR = cData;
    /* Wait for transmission complete */
    while(!(SPSR & (1<<SPIF)));
}

2) die Ports für RS und CSB als Ausgänge am µC setzen [dog-m163.c]

#define DOGM163_CSB     PD6     // Port fuer CSB am µC
#define DOGM163_RS      PD7     // Port für RS am µC    
#define DOGM163_PORT    PORTD   // Port am Atemega8

void init_PORTS_DOGM163 (void)
{
    //RS und CSB als Ausgang setzen
    DDRD |= (1<<DOGM163_RS) | (1<<DOGM163_CSB);

}
 
3) Display initialisieren, benötigte Funktionen [dog-m163.c]

// Das Display resettet den internen Counter bei der fallenden Flanke vom CSB
void reset_CSB_DOGM163 (void)
{
    DOGM163_PORT |= (1<<DOGM163_CSB);
    DOGM163_PORT &= ~(1<<DOGM163_CSB);

}
void write_instruction_DOGM163 (char instruction)
{
    //RS low = instruction
    DOGM163_PORT &= ~(1 << DOGM163_RS);
    //resetten des Counters
    reset_CSB_DOGM163();
    // instruktionen senden
    spi_transmit(instruction);
    _delay_ms(2);
    //Display wieder deaktivieren (chip select=1)
    DOGM163_PORT |= (1<<DOGM163_CSB);
}
void write_char_DOGM163 (char instruction) // Daten zum Display senden
{
    //RS high = data
    DOGM163_PORT |= (1 << DOGM163_RS);
    //resetten des Counters
    reset_CSB_DOGM163();
    // Daten senden
    spi_transmit(instruction);
    _delay_ms(2);
    //Display wieder deaktivieren (chip select=1)
    DOGM163_PORT |= (1<<DOGM163_CSB);
}
void write_string_DOGM163 (char *buffer) // sollte selbsterklärend sein
{
    while (*buffer){
        write_char_DOGM163(*buffer);
        buffer++;
    }
}


Das waren die nötigen Funktionen, jetzt gilt es die Initialisierungsroutine mit den "richtigen" Werten zu füllen und das Display zu aktivieren.

void init_3lines_DOGM163(void)
{
    init_PORTS_DOGM163();
    _delay_ms(200);
 
   // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 00
    write_instruction_DOGM163 (0x38);
    // Instruction Set, {0 0 1 DL N DH IS2 IS1} = 00 11 10 01 
    write_instruction_DOGM163 (0x39);

    // 15 Bias (Spannung), {0 0 0 1 BS 1 0 Fx} = 00010101, es kann auch 1D gewählt werden, dann leuchtet der Hintergrund stark nach 
    write_instruction_DOGM163 (0x1D);

    // Contrast (Bit C3-C0) {0 1 1 1 C3 C2 C1 C0} = 01111111
    write_instruction_DOGM163 (0x7F);

    // Power/ICON/Contrast (Bit C5-C4) {0 1 0 1 Ion Bon C5 C4} = 01011111
    write_instruction_DOGM163 (0x5F); 

    // Follower {0 1 1 0 Fon Rab2 Rab1 Rab0} = 01101001, Rab siehe Datenblatt Power supply
    write_instruction_DOGM163 (0x69);
    _delay_ms(200);

    // Display Function, {0 0 0 0 1 D C B} = 00001100
    write_instruction_DOGM163 (0x0C); 

    // Entry Mode {0 0 0 0 0 1 I/D S} = 00000110
    write_instruction_DOGM163 (0x06);
}


Für nähere Erläuterungen sei ausdrücklich das Datenblatt des Displaycontrolers empfohlen.

Wurde die Initialisirung durchgeführt kann das Display mit allen zur Verfügung stehenden Befehlen benutzt werden. Ich habe folgende, meiner Meinung nach sinnvolle Funktionen für das DOG-M163 implementiert:


init_3lines_DOGM163
init_doublehigh_upper_DOGM163
init_doublehigh_lower_DOGM163
set_cursor_DOGM163 (row, column)
clear_DOGM163
cursor_home_DOGM163
cursorON_blinkOFF_DOGM163
cursorON_blinkON_DOGM163
cursorOFF_blinkOFF_DOGM163
cursorOFF_blinkON_DOGM163
turnOFF_DOGM163
set_contrast_DOGM163 (contrastvalue)
set_character_DOGM163 (characterNumber, data0, data1, data2, data3,  data4, data5, data6, data7);


Wird ein DOG-M081 oder DOG-M162 verwendet, muß die Initialisierung entsprechend angepasst werden, da das Display ja nur eine oder zwei Zeilen hat, aber der Controler hier der ST7036 von Sitronic gleich bleibt.

Download [free to use]:
DOG-M163 Treiber: dog_m163.c  dog_m163.h
SPI Treiber: spi.c spi.h
Eagle DOG-M Library: eagle DOG-M163 (gleiche Verwendung bei DOG-M081 und DOG-M162)

Links: 
Datenblatt ST7036 Displaycontroller
Datenblatt DOG-M163
SPI - Serial Peripheral Interface
Datenblatt ATMEGA-8

Feedback:
blumengiesser@posteo.de