Forum: Mikrocontroller und Digitale Elektronik Nochmal Hilfe zum DOGXL


von Felix (Gast)


Lesenswert?

Hallo, ich brauche hilfe zum betreiben des Displays DOGXL. Ich will ihn 
mit einem Atmega8 im 3-wire 8-bit SPI Modus betreiben. Die Verschaltung 
ist wie laut Datenblatt. Einzige änderungen 1uF Kondensator zw. pin 19 
und 20 bzw 18 und 21. An VLCD habe ich einen 0,1 uF an Masse. Auf die 
Polung bei den elkos habe ich geachtet. Reset (Pin 29) liegt auf masse. 
Pin 27 geht an PB2, 31 an PB3 und 32 an PB5. Die Pegelwandlung habeich 
über Spannungsteiler gemacht.
Es tut sich allerings gar nicht am Display.

Ich bin für jede Hilfe dankbar..

So sieht mein Code aus



#define F_CPU 1000000UL                        /ontroller Taktfrequenz

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

//DOGXL160 Initialisierungsbefehle

#define Set_Com_End_H                 0xF1
#define Set_Com_End_L                 0x67
#define Set_LCD_Mapping_Control       0xC6
#define Set_Scroll_Line_LSB           0x40
#define Set_Scroll_Line_MSB           0x50
#define Set_Panel_Loading             0x2B
#define Set_Pump_Controll             0x2F
#define Set_LCD_Bias_Ratio            0xEB
#define Set_Vbias_Potentiometer_H     0x81
#define Set_Vbias_Potentiometer_L     0x5F
#define Set_RAM_Address_Control       0x89
#define Set_Display_Enable            0xAF

//DOGXL160 weitere Befehl

#define Set_All_Pixels_On             0xA5
#define Set_Inverse_Display           0xA6
#define System_Reset                  0xE2
#define Page_Address                  0x60
#define Column_LSB0                   0x00
#define Column_MSB0                   0x10




void SPI_Master_Init(void)                        //ISP Initialisierungs 
Funktion
{
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}


void SPI_Senden(char cData)                        //SPI Senden Funktion
{
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)));
}

void waitus(void)                        //warten fkt
{
  _delay_us(10);
}

//DOGXL160

void DOGXL160_Init(void)
{
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Com_End_H);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Com_End_L);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_LCD_Mapping_Control);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Scroll_Line_LSB);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Scroll_Line_MSB);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Panel_Loading);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Pump_Controll);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_LCD_Bias_Ratio);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Vbias_Potentiometer_H);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Vbias_Potentiometer_L);
  PORTB |= (1<<PB2);
  waitus();
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_RAM_Address_Control);
  PORTB |= (1<<PB2);
  waitus();;
  PORTB &= ~(1<<PB2);
  SPI_Senden(Set_Display_Enable);
  PORTB |= (1<<PB2);
}





int main (void)                              //Hauptprogramm
{
  //Variablen, Arrays


  //Initialisierungen

  _delay_ms(500);


  /* Set MOSI and SCK output, all others input */
DDRB = 0b00001100;


  SPI_Master_Init();                          //SPI initialisieren
  PORTB |= (1<<PB2);                          //CD --> high (Data)

  _delay_us(10);
  PORTB &= ~(1<<PB2);                          //CD --> low (Command)
  SPI_Senden(System_Reset);
  PORTB |= (1<<PB2);                          //CD --> high (Data)
  _delay_us(10);

  DOGXL160_Init();                          //Display initialisieren


  _delay_ms(10);

  PORTB &= ~(1<<PB2);                          //CD --> low (Command)
  SPI_Senden(0x6C);                          //Page Address = 12
  PORTB |= (1<<PB2);                          //CD --> high (Data)
  _delay_us(10);
  PORTB &= ~(1<<PB2);                          //CD --> low (Command)
  SPI_Senden(0x15);                          //Column Address = 80
  PORTB |= (1<<PB2);                          //CD --> high (Data)
  _delay_us(10);
  PORTB &= ~(1<<PB2);                          //CD --> low (Command)
  _delay_us(10);
  PORTB |= (1<<PB2);                          //CD --> high (Data)
  SPI_Senden(0b00011011);                        //Testbild vier Pixel 
in der Displaymitte
  PORTB &= ~(1<<PB2);                          //CD --> low (Command)

  //Hauptschleife

  while(1)
  {                          //test ob uC läuft

DDRC  = 0xff;  //AUSGANG



PORTC=0b11111111  ;  //LED

  }

  return 0;

}

von holger (Gast)


Lesenswert?

>So sieht mein Code aus
>
>#define F_CPU 1000000UL                        /ontroller Taktfrequenz

Daraus macht der Compiler sicher nur eine Fehlermeldung.

>  /* Set MOSI and SCK output, all others input */
>DDRB = 0b00001100;

Netter Kommentar, nur wird SCK nicht zum Ausgang.

von spess53 (Gast)


Lesenswert?

Hi

> Auf die Polung bei den elkos habe ich geachtet.

Welche Elkos?

Kannst du nach der Initialisierung an Pin17 eine Spannung > 10V messen.

MfG Spess

von Felix (Gast)


Lesenswert?

@Holger: hast recht hab die zeile abgeändert in DDRB = 0b00101000;
das /controller stand so nicht im quelltext, der fehler ht sich beim 
schreiben des threads eingeschlichen.

@spess: die elkos zw. pin 19 und 20 bzw. 18 und 21, sowie an VLCD.
Die spannung von 10 Volt kann ich nicht messen.

Wobei ich jetzt sagen muss das die LED mit abgeänderten Zeile "DDRB = 
0b00101000;" nun nicht mehr angeht.

Das heißt wohl es wird nicht initialisiert?!

von spess53 (Gast)


Lesenswert?

Hi

>@spess: die elkos zw. pin 19 und 20 bzw. 18 und 21, sowie an VLCD.
>Die spannung von 10 Volt kann ich nicht messen.

Da gehören Keramik-Cs hin.

MfG Spess

von Felix (Gast)


Lesenswert?

bist du sicher,das es mit elkos nicht geht? zumindest hab ich gelesen 
das hier einige elkos benutzen.
Was sagst du zum code. sollte das passen?

von holger (Gast)


Lesenswert?

>DDRB = 0b00101000;

Jetzt ist PB2 kein Ausgang mehr;)

von Felix (Gast)


Lesenswert?

stimmt jetzt geht die led auch wieder an :)

von Felix (Gast)


Lesenswert?

an VLCD kann ich aber noch nichts messen.

von spess53 (Gast)


Lesenswert?

Hi

>bist du sicher,das es mit elkos nicht geht? zumindest hab ich gelesen
>das hier einige elkos benutzen.

Das ist zumindest die Aussage von EA und meine eigene Erfahrung.

Was sagst du zum code. sollte das passen?

Ich bin notorischer Assemblerprogrammierer. Allerdings macht mich dieser 
Kommentar stutzig:

> /* Set MOSI and SCK output, all others input */

Lies dir mal das Kapitel 'SS Pin Functionality' im Datenblatt durch.

MfG Spess

von Oliver (Gast)


Lesenswert?

Wir hatten vor einiger Zeit mal ein DOGXL160 Shield für den Arduino 
entwickelt. Vielleicht hilft der Schaltplan weiter:

http://code.google.com/p/dogm128/wiki/dogxl160

Dort gibt es auch eine Graphic-Lib zum Runterladen (auch für nicht 
Arduino), die den DOGXL160 unterstützt. Die Lib enthält sowohl HW als 
auch SW SPI (soweit ich mich erinnere), was das Problem mit dem 
Slave-Select-Pin etwas entschäfen könnte.

Grüße,
Oliver

von Felix (Gast)


Lesenswert?

@spess: also im Datenblatt steht das SS als input festgelegt werden 
soll. Wenn ich das mache geht die LED nach der Initialisierung nicht an. 
Ich vermute das Programm bleibt irgendwo hängen. Hast du eventuell die 
Initialisierung als asm code. Damit könnte ich zumindest testen ob es 
überhaupt geht.

@oliver: danke für den tip aber ich möchte es erstmal per hand machen.

von holger (Gast)


Lesenswert?

>@spess: also im Datenblatt steht das SS als input festgelegt werden
>soll. Wenn ich das mache geht die LED nach der Initialisierung nicht an.

Genau das Gegenteil ist der Fall. SS muss ein Ausgang sein.
Oder wenigstens ein Eingang mit Pullup, den du nicht als
Eingang verwenden darfst!

von spess53 (Gast)


Angehängte Dateien:

Lesenswert?

Hi

>@spess: also im Datenblatt steht das SS als input festgelegt werden
>soll.

Da steht auf S.125:

'If SS is configured as an output, the pin is a general output pin which 
does not affect the SPI system. Typically, the pin will be driving the 
SS
pin of the SPI Slave.'

Wenn du /SS als Eingang konfigurierst muss es auf H bleiben. Bei L an 
/SS schaltet das SPI in den Slave-Mode.

>Hast du eventuell die Initialisierung als asm code. Damit könnte ich >zumindest 
testen ob es überhaupt geht.

Das DOGXL habe ich vor längerer Zeit nur mal kurz getestet. Also noch 
keine richtige Lib erstellt. Die Initialisierung von SPI und LCD habe 
ich dir mal in den Anhang kopiert.

Ein Beispiel für die Initialisierung in C findest du auch bei EA:
http://www.lcd-module.de/support.html

MfG Spess

von Felix (Gast)


Lesenswert?

habe jetzt den elko an VLCD durch einen aus keramik ersetzt und den 10M 
Widerstand hinzugefügt der nach neuerem datenblatt hinzugefügt werden 
soll. Auch nach vielem vielem probieren bekomme ich den doxl nicht zum 
laufen.
Keine spannung an VLCD. Werde es jetzt morgen mal mit dem tip von oliver 
probieren. hab langsam das gefühl, das der display kaputt ist. naja mal 
schauen...

von Felix (Gast)


Lesenswert?

So ich habe jetzt nochmal den C quelltext auf das allernotwendigste 
runtergebrochen um eventuell fehler auszuschließen. ich bin mir fast 
sicher das der code richtig ist. Nochmal zum display: durch ändereung 
des pegels an PB2 wird wird der Bitzähler des displays zurückgesetzt, 
der pegel muss während der übertragung unverändert bleiben >> ist 
gewährleistet.

Dann werden 8 Bits übertragen mit MSB zuerst >> ist gewährleistet.

SCK max. 8 Mhz (der atmega läuft mit internem 1 Mhz) >> gewährleistet

Hat jemand noch eine ideeoder findet jemand einen fehler??

Hier nochmal der Code:



#define F_CPU 1000000UL                        //Controller Taktfrequenz

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



#define Set_Com_End_H                 0xF1
#define Set_Com_End_L                 0x67
#define Set_LCD_Mapping_Control       0xC0
#define Set_Scroll_Line_LSB           0x40
#define Set_Scroll_Line_MSB           0x50
#define Set_Panel_Loading             0x2B
#define Set_LCD_Bias_Ratio            0xEB
#define Set_Vbias_Potentiometer_H     0x81
#define Set_Vbias_Potentiometer_L     0x5F
#define Set_RAM_Address_Control       0x89
#define Set_Display_Enable            0xAF


#define System_Reset                  0xE2




void waitus(void)                        //warten Fkt
{
  _delay_us(10);
}

void SPI_Master_Init(void)                        //ISP Initialisierungs 
Funktion
{

SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPOL)|(1<<CPHA);

}


void SPI_Senden(unsigned char cData)                        //SPI Senden 
Funktion
{
  PORTB &= ~(1<<PB2);      //LOW
  SPDR = cData;
  while(!(SPSR & (1<<SPIF)));
  PORTB |= (1<<PB2);      //HIGH
}




void DOGXL160_Init(void)
{

  SPI_Senden(Set_Com_End_H);

  waitus();

  SPI_Senden(Set_Com_End_L);

  waitus();

  SPI_Senden(Set_LCD_Mapping_Control);

  waitus();

  SPI_Senden(Set_Scroll_Line_LSB);

  waitus();

  SPI_Senden(Set_Scroll_Line_MSB);

  waitus();

  SPI_Senden(Set_Panel_Loading);


  waitus();

  SPI_Senden(Set_LCD_Bias_Ratio);

  waitus();

  SPI_Senden(Set_Vbias_Potentiometer_H);

  waitus();

  SPI_Senden(Set_Vbias_Potentiometer_L);

  waitus();

  SPI_Senden(Set_RAM_Address_Control);

  waitus();

  SPI_Senden(Set_Display_Enable);

}


//Hauptprogramm

int main (void)
{


  _delay_ms(500);

  DDRB = 0b00101100;
                          //PB3 --> SCK, PB2 --> CD, PB5 --> MOSI



  SPI_Master_Init();                          //SPI initialisieren

  PORTB |= (1<<PB2);                          //CD --> high (Data)

  waitus();
                            //CD --> low (Command)
  SPI_Senden(System_Reset);
                            //CD --> high (Data)
  waitus();

  DOGXL160_Init();                          //Display initialisieren


  //Hauptschleife

  while(1)
  {

  DDRC  = 0xff;  //AUSGANG
    PORTC=0b11111111;  //LED

  }

  return 0;

}

von holger (Gast)


Lesenswert?

>Reset (Pin 29) liegt auf masse.

Da gehört er aber nicht hin.

von Felix (Gast)


Lesenswert?

stimmt, hab es geändert. es hat jedoch keine auswirkung auf das display.

von Felix (Gast)


Lesenswert?

achso meinst du das. Ne den reset Pin vom dogxl hab ich mit VDD 
verbunden ( also 3,3V).

von Holger S. (223rem)


Lesenswert?

"Die Verschaltung ist wie laut Datenblatt."

wahrscheinlich zu trivial, aber:
GOGXL /CS0 an GND ???


Gruß Holger Sch.

heisst natürlich DOGXL  :)

von FELIX (Gast)


Lesenswert?

ja das war falsch.hab ich dann die letzten Tage noch berichtigt in der 
Schaltung.

von Felix (Gast)


Lesenswert?

ja CS0 ist an ground.

von Holger S. (223rem)


Lesenswert?

Ich betreibe das DOGXL im 4wire-Mode;
sollte eigentlich (wenn's richtig umgesetzt ist) egal sein.
Straff mal Deine Initialisierung, die meisten Parameter werden eh per 
default gesetzt.
Bei mir sieht's so aus.
1
void Init_DOGXL(void){
2
3
volatile uint8_t i;
4
5
  INIT_DOGXL_PINS;           // CMD u. RST  für's LCD setzen.
6
  for(i=200; i>0; i--){;};   // delay a little bit...
7
  DOGXL_RELEASE_RST;         // ...
8
  Set_Vbias_Pot(0x9C);       // VBIAS Cmd & Value(hier 0x9C !!!)
9
  Clear_Screen();            // RAM mit 0x00 beschreiben
10
  Send_Display_Cmd(DISPLAY_ENABLE);
11
}

Mann erkennt dann flächig einen Hauch von Pixel.
Wie sieht denn Dein Display nach der INIT aus?

Gruß Holger Sch

ps:
Deine:
waitus();
kannste vergessen!

von Felix (Gast)


Lesenswert?

ziehst du den CD nach der Übertragung ohne Verzögerung wieder auf High? 
die waitus() war dafür gedacht da noch ein bischen zeit zu geben. meinst 
das macht probleme?

von Felix (Gast)


Lesenswert?

Das ganze ist jetzt so übersichtlich das man es gut nachvollziehen kann:



#define F_CPU 1000000UL                        //Controller Taktfrequenz

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



#define Set_Com_End_H                 0xF1
#define Set_Com_End_L                 0x67
#define Set_LCD_Mapping_Control       0xC0
#define Set_Scroll_Line_LSB           0x40
#define Set_Scroll_Line_MSB           0x50
#define Set_Panel_Loading             0x2B
#define Set_LCD_Bias_Ratio            0xEB
#define Set_Vbias_Potentiometer_H     0x81
#define Set_Vbias_Potentiometer_L     0x5F
#define Set_RAM_Address_Control       0x89
#define Set_Display_Enable            0xAF


#define System_Reset                  0xE2




void waitus(void)                        //warten Fkt
{
  _delay_us(10);
}

void SPI_Master_Init(void)                        //ISP Initialisierungs 
Funktion
{

SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<CPOL)|(1<<CPHA);

}


void SPI_Senden(char cData)                        //SPI Senden Funktion
{

  PORTB &= ~(1<<PB2);      //LOW = command (High=data)

  waitus();

  SPDR = cData;
  while(!(SPSR & (1<<SPIF)));

  waitus();

  PORTB |= (1<<PB2);      //HIGH

  waitus();


}




void DOGXL160_Init(void)
{

  SPI_Senden(Set_Com_End_H);

  SPI_Senden(Set_Com_End_L);

  SPI_Senden(Set_LCD_Mapping_Control);

  SPI_Senden(Set_Scroll_Line_LSB);

  SPI_Senden(Set_Scroll_Line_MSB);

  SPI_Senden(Set_Panel_Loading);

  SPI_Senden(Set_LCD_Bias_Ratio);

  SPI_Senden(Set_Vbias_Potentiometer_H);

  SPI_Senden(Set_Vbias_Potentiometer_L);

  SPI_Senden(Set_RAM_Address_Control);

  SPI_Senden(Set_Display_Enable);

}


//Hauptprogramm

int main (void)
{


  _delay_ms(10);

  DDRB = 0b00101100;   //PB3 --> SCK, PB2 --> CD, PB5 --> MOSI (alle 
Ausgang)




  SPI_Master_Init();                          //SPI initialisieren


  SPI_Senden(System_Reset);

  _delay_ms(10);

  DOGXL160_Init();                          //Display initialisieren


  //Hauptschleife

  while(1)

  {

  DDRC  = 0xff;  //AUSGANG
    PORTC=0b10111111;  //LED

  }

  return 0;

}

Muss ich vielleicht MOSI oder SCK noch auf high ziehen?

von Felix (Gast)


Lesenswert?

Nach der init sehe ich garnichts hab aber auch den "FSTN neg. 
transmissiv".
Allerdings kann ich an VLCD auch keine Spannung messen. Immer 0V.

von Holger S. (223rem)


Lesenswert?

ok, mit dem Befehl "Display_Enable" müsste sich eigentlich Vlcd 
einstellen.
>Muss ich vielleicht MOSI oder SCK noch auf high ziehen?
Nein, Deine SPI-Initialisierung sollte richtig sein und die 
entsprechenden Zustände nach einem Datentransfer herstellen.
Initialisiere nur mal "Vbias-pot", nix anderes, und spiele mit dem 
Parameter rum.
Du initialisierst mit 0x5F, ich(FSTN pos. transflective) mit 0x9C.
Wenn's nix bring, klekker mal die Hardware zu Papier;
so wie'se ist, nicht so wie Du denkst.

Gruß Holger Sch

von Felix (Gast)


Lesenswert?

Nur vbias potentiometer zu intiliasieren bringt keine änderung. die 
schaltung ist wirklich wie nach datenblatt (ausnahme reset auf VDD).
Werde dann morgen mal nen schaltplan basteln...

PB2 schaltet auch den CD, habs nachgemessen. die spannungsteiler bringen 
auch schöne 3V an den dogxl.
SCK und MOSI sind ja dann zwangsläufig durch die SPI init 
funktionstüchtig.

von Felix (Gast)


Angehängte Dateien:

Lesenswert?

So das Dislay funktiniert!!! Es ist mir fast ein bischen peinlich aber 
als ich heute den schaltplan erstellt habe ist mir aufgefallen das SCK 
und SDA vertauscht sind...ggrrrr

Jetzt habe ich 13,6 V an VLCD und überall auf dem display verteilt PIXEL 
(normal)????

Für alle die den dogxl mit einem atmega8 betreiben wollen, stelle ich 
mal hier den Schalplan und Quelltext mit rein.....

von spess53 (Gast)


Lesenswert?

Hi

>...habe ist mir aufgefallen das SCK und SDA vertauscht sind...ggrrrr

Stimmt, das führt manchmal zu einem Fehlverhalten.

>Für alle die den dogxl mit einem atmega8 betreiben wollen, stelle ich
>mal hier den Schalplan und Quelltext mit rein.....

Der ATMega8 bei einem solchen Display etwas schwach auf der Brust. Ein 
Bild in der Displaygröße hat schon über 4K. Einen oder mehrere Fonts 
möchtest du vielleicht auch.
Übrigens kann das Display, im Gegensatz zu der Datenblattangabe, auch 
Grautöne. EA hat das, lt. eigener Aussage, aus Kontrastgründen nur als 
SW-Display beworben.

MfG Spess

von Felix (Gast)


Lesenswert?

ja das mit den grautönen sehe ich auch grad. nach der init sind auf dem 
ganzen display pixel in verschiendenen tönen verteilt.
Bin grad ein bischen am probieren mal ein paar pixel zu steuern.

von Holger S. (223rem)


Lesenswert?

Hallo Felix,

na, hat dann ja doch geklappt.

> und überall auf dem display verteilt PIXEL
> (normal)????

Das Display-RAM ist undefiniert, wenn Du alles mal mit 0x00 beschreibst 
erhälst Du eine gleichmäßige Fläche. Dann noch mit den Displayparametern 
rumspielen und gut isses.
Wenn Du dann mit der Frequenz hochgehen solltest währe es angebracht, 
die Spannungsteiler für's DOGXL um den Faktor 10 zu verkleinern.

Gruß Holger Sch

von Felix (Gast)


Lesenswert?

also wenn ich alles mit 0 beschreibe bekomme ich einen fast schwarzen 
display. wenn man genau hinguckt sieht man aber vertikale streifen.
ich schreibe die 0 mit der schleife:
for(p=0; p < 26; p++)                     //  26  Pages
  {
    for(c=0; c < 160; c++)                  // 160 Columns
    {
    //  SPI_Senden(0x00 + p);
    //  SPI_Senden(0x00 + c);
    //  SPI_Pixel(0b00000000);
    }
  }

von Felix (Gast)


Lesenswert?

So natürlich:

for(p=0; p < 26; p++)                     //  26  Pages */
  {
    for(c=0; c < 160; c++)                  // 160 Columns */
    {
      SPI_Senden(0x00 + p);
      SPI_Senden(0x00 + c);
      SPI_Pixel(0b00000000);
    }
  }

von spess53 (Gast)


Lesenswert?

Hi

>also wenn ich alles mit 0 beschreibe bekomme ich einen fast schwarzen
>display.

Dann hasst du ein 'negatives' Display. Dann zum Löschen halt mit $FF 
beschreiben.

MfG Spess

von Felix (Gast)


Lesenswert?

jetzt gehts. Man sollte in c die variablen deklarieren. sonst fängt die 
schleife irgendwo an :)
genau, da ich ein negatives habe kann ich den display mit FF leer 
machen. Wenn ich alles mit 00 beschreibe wird der display ganz kurz 
hell, dann aber sofort wieder dunkel. kann der dogxl das nicht ab?

von spess53 (Gast)


Lesenswert?

Hi

>Wenn ich alles mit 00 beschreibe wird der display ganz kurz
>hell, dann aber sofort wieder dunkel. kann der dogxl das nicht ab?

Mach mal den Kondensator an VLCD größer. 100n stehen zwar im aktuellen 
Datenblatt, sind aber nach meiner Erfahrung zu klein.

Beitrag "Re: Probleme Kontrast DOGXL160 - Graphik-LCD"

MfG Spess

von Felix (Gast)


Lesenswert?

also ich habe jetzt mal ein bischen rumprobiert.
aber ich verstehe die Adresszuweisung von Page und Column nicht.

Im Datenblatt steht z.b "set page adress 011 PA(4-0) mit PA=0-25

Soll ich dann mit den ersten 5 Bit eine Zahl zwischen 0 und 25 
darstellen??

von spess53 (Gast)


Lesenswert?

Hi

>Soll ich dann mit den ersten 5 Bit eine Zahl zwischen 0 und 25
>darstellen??

Die oberen 3 Bit (011) spezifizieren den Befehl 'Set Page Adress' und 
die unteren 5 Bit die Pagenummer.

>Im Datenblatt steht z.b "set page adress 011 PA(4-0) mit PA=0-25

Du meinst hoffentlich das Datenblatt vom Displaycontroller (UC1610).

MfG Spess

von Felix (Gast)


Lesenswert?

ah ok das habe ich verstanden. also die pixel kann ich jetzt schon 
relativ gut und gekonnt setzen. das einzige Problem was ich jetzt noch 
habe ist das wenn ich den display komplett dunkel mache mit:
for(p=0; p < 26; p++)                     //  26  Pages */
  {
    for(c=0; c < 160; c++)                  // 160 Columns */
    {
      SPI_Senden(0x00 + p);
      SPI_Senden(0x00 + c);
      SPI_Pixel(0b00000000);
    }
  }
Dann kann ich die pixel nicht mehr ansteuern.
Wenn ich hingegen den Pixelsalat vom start beibehalte und dort drin 
rumwurschtel geht alles.

von spess53 (Gast)


Lesenswert?

Hi

>Dann kann ich die pixel nicht mehr ansteuern.
>Wenn ich hingegen den Pixelsalat vom start beibehalte und dort drin
>rumwurschtel geht alles.

Du kannst kein einzelnes Pixel ansteuern. Um ein Byte (4 Pixel) gezielt 
zu Beschreiben gehst du wie folgt vor:

Kommando Page setzen
Kommando Low(Spalte) setzen
Kommando High(Spalte) setzen
Datenbyte setzen

MfG Spess

von FELIX (Gast)


Lesenswert?

was meinst du mit Low spalte bzw high spalt? den cs zieh ich bei 
Kommandos für die Übertragung immer nach low.

von spess53 (Gast)


Lesenswert?

Hi

>was meinst du mit Low spalte bzw high spalt? den cs zieh ich bei
>Kommandos für die Übertragung immer nach low.

Mal angenommen du willst in Page5 das Byte 53 adressieren dann sendest 
du

1. Kommando 0b01100101 = 0b01100000 (Set Page Adress) + 0b00000101 (5)

2. Die Spalte in 2 Befehlen. Einmal für das untere Nibble und dann für
   das obere Nibble.

   53 = 0b00110101
          |  ||__|__Unteres Nibble
          |__|______Oberes Nibble

Daraus ergeben sich die beiden Befehle:

     0b00000101 = 0b00000000 (Set Column Address LSB) + 0b00000101
     0B00010011 = 0b00010000 (Set Column Address MSB) + 0b00000011

MfG Spess

von FELIX (Gast)


Lesenswert?

ok Ich habe es bis jetzt wie folgt gemacht.
1. Page senden: 0b01100000
2. column senden: 0b00000000
damit wäre die Position ganz oben links am Display.
3. Daten für Pixel senden womit ich dann bestimmen kann welche der 4 
Pixel an oder aus sind.

war das so komplett falsch? es hat zumindest meist funktioniert.

von spess53 (Gast)


Lesenswert?

Hi

>war das so komplett falsch?

Nicht komplett.

>2. column senden: 0b00000000
>damit wäre die Position ganz oben links am Display.

Aber was ist so schwer zu verstehen, das die Column Adresse nicht in 
einem Stück gesendet wird? Dein Befehl setzt die Colunm Adresse auf 
einen Wert 0bxxxx0000.

Tu dir bitte einen Gefallen und lies das Datenblatt vom 
Displaycontroller. Mit dem Datenblatt vom Display kommst du in Puncto 
Programmierung nicht weit. Die Befehlsliste ist unvollständig und nicht 
erläutert. Und mit deinem
Trial&Error-Dediller wirst du nicht weit kommen.

MfG Spess

von FELIX (Gast)


Lesenswert?

ja das werde ich mir mal genauer ansehen. auf jedenfalls vielen dank an 
alle für die Unterstützung! Gruß Felix

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.