Forum: Mikrocontroller und Digitale Elektronik EA DOGM204-A an ATMega644 Zeichenposition


von René K. (tesla24)


Lesenswert?

Hallo,

das 4x20 Display wird über SPI angesteuert und zeigt auch das richtige 
Zeichen im Display an (laut Tabelle im Datenblatt)

Aber die Position macht mir Kopfzerbrechen!
Ichhabe aus einem anderen Beitrag den Code genommen, angepasst und die 
Position als Dez und nicht als Hex genommen:
1
void SetPos(unsigned char Zeile, unsigned char Spalte)
2
{
3
    switch(Zeile)
4
    {
5
        case 1:    LCD_Write_Instr(132 + Spalte-1);
6
        break;
7
        case 2:    LCD_Write_Instr(152 + Spalte-1);
8
        break;
9
        case 3:    LCD_Write_Instr(184 + Spalte-1);
10
        break;
11
        case 4:    LCD_Write_Instr(216 + Spalte-1);
12
        break;
13
        default:   LCD_Write_Instr(0x80);
14
        break;
15
    }
16
}

Bei Spalte wird überall die "1" an die Finktion übergeben, also hinten 
steht + 0. So wie es jetzt ist steht das Zeichen in jeder Zeile an 
erster Stelle.

Wie man schon sieht, ist zwischen den Positionsangaben nicht über eine 
Differen von "20" und wenn ich 132+17-1 also = 148 sende, ist das 
Zeichen irgendwo in der 2. Zeile.....

Irgendwie verwirrt mich das und ich komme nicht drauf wie das 
funktionieren soll.....

Vielen Dank

: Bearbeitet durch User
von Matthias (Gast)


Lesenswert?

Heiko K. schrieb:
> Aber die Position macht mir Kopfzerbrechen!
> Ichhabe aus einem anderen Beitrag den Code genommen, angepasst und die
> Position als Dez und nicht als Hex genommen:
Ich würde dazu das Datenblatt zu Rate ziehen.
Dort steht es wird ein SSD1803A Controller verwendet. Im Zweifel muß man 
sich das Datenblatt des Controllers auch noch zu Gemüte führen.

Die Initialisierung von Seite 5 
(http://www.soselectronic.hu/a_info/resource/d/ea/EADOGM204-A.pdf) 
machst Du schon?
Im welchem Winkel wird das Display betrieben (bottom view oder top 
view)?
Davon hängt oft die Adressberechnung ab.

Im EA-Datenblatt ist dazu nur der Hinweis auf den Controller zu finden:
http://www.lcd-module.de/fileadmin/eng/pdf/zubehoer/ssd1803a_2_0.pdf
Dort findet sich die Adressaufteilung im Abschnitt 9.17 (Seite 48 
unten):
1
In 4-line display mode (N=1, NW = 1), DDRAM address
2
is from “00H” – “13H” in the 1st line, from “20H”
3
to “33H” in the 2nd line, from “40H” – “53H” in the
4
3rd line and from “60H” – “73H” in the 4th line.


> Irgendwie verwirrt mich das und ich komme nicht drauf wie das
> funktionieren soll.....
Du kennst den Unterschied zwischen 20(D) = dezimal und 20H = 
hexadezimal?

> nicht über eine
> Differen von "20"
Probier es mal mit 32(D).

Matthias

von René K. (tesla24)


Lesenswert?

Ja die Init ist wie im Datenblatt als Beispiel (also Bottom View)
der Unterschied zwischen Hex und Dezimal ist bekannt. Aber ich glaube 
hier in meiner Funktion ist irgendwo der Wurm drin:

void SPI_Transmit(char Data)
{
    SPDR = Data;
    while(!(SPSR & (1<<SPIF)));
}

void LCD_Write_Instr(char instr)
{
    SPI_Transmit(0x1F);
    SPI_Transmit(instr & 0x0F);
    SPI_Transmit((instr >> 4) & 0x0F);
    _delay_us(500);
}

An die LCD_Write_Instr übergebe ich dann die Adresse, aber ich glaube da 
passt irgendwas nicht so ganz...

von Matthias (Gast)


Lesenswert?

Heiko K. schrieb:
> das 4x20 Display wird über SPI angesteuert

Heiko K. schrieb:
> SPI_Transmit(instr & 0x0F);
> SPI_Transmit((instr >> 4) & 0x0F);

Wie ist IM2 und IM1 bei Dir beschaltet?

SPI und 4-Bit-Modus passt für mich nicht zusammen...
Kapitel 7.10.2 beschreibt die nötige SPI-Sequenz.
...doch irgendwas komisches mit 4 Bit....
Wie ist Dein SPI konfiguriert? MSB first oder LSB first?

Teste mal die folgende Funktion:
1
#define LCD_SET_DDRAM_ADDR (0x80)
2
3
void SetPos(unsigned char Zeile, unsigned char Spalte)
4
{
5
    // Zeilen und Spalten Zaehlung beginnt ab 1
6
    int adresse;
7
8
    adresse  = 0x20 * (Zeile - 1);
9
    adresse += Spalte - 1;
10
    LCD_Write_Instr( LCD_SET_DDRAM_ADDR + adresse);
11
}

von René K. (tesla24)


Angehängte Dateien:

Lesenswert?

Ich habe LSB-first:

void SPI_MasterInit(void)
{

    DDRB |= (1<<DDB5) | (1<<DDB7) | (1<<DDB0) | (1<<DDB4);
    SPCR = (1<<SPE) | (1<<DORD) | (1<<MSTR) | (1<<CPOL) | (1<<CPHA)  | 
(1<<SPR0);  //aktiviere SPI als Master mit 500kHz

}



IM2 ist LOW (also GND) und IM1 ist auf HIGH (VDD)

Beschaltet habe ich es wie im Bild (aber nur mit SCLK (500kHz)und MOSI) 
ich habe nur diesen einen Slave dran.

Aber dort war ein Fehler !! Deine Funktion funktioniert, nur irgendwie 
zeigt er mir das falsche Zeichen ? obwohl das ja sonst immer geklappt 
hat...

void LCD_Write_Data(char data)
{
    SPI_Transmit(0x5F);
    SPI_Transmit(data & 0x0F);
    SPI_Transmit((data >> 4) & 0x0F);
    _delay_us(500);
}

Vielen Dank schon mal!

von René K. (tesla24)


Lesenswert?

Es wird doch das richtige Zeichen gezeigt, hab in der falschen 
Zeichensatztabelle geguckt!

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.