Forum: Projekte & Code 128x64 Grafikdisplay von Pollin


von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

Hier die Ansteuerung in C. Stammte von dem Source, den ich hier mal für
den M16C reingesetzt hatte.

Mfg Sascha

von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

Und Header-File

Mfg Sascha

von Sascha (Gast)


Lesenswert?

Ganz vergessen. Grafik geht noch nicht :(
Kommt aber noch.....

Mfg Sascha

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

Hier eine Version für den Datenbus (geht etwas schneller).
Auf dem 128x64 Display habe ich so mit einem mega8515 mit 18,432MHz
etwa 23fps geschafft als ich ein drehende 3D Figur dargestellt habe.

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

In der Header Datei die Adressen und die Auflösung einstellen.

von pebisoft (Gast)


Lesenswert?

kann man dieses display auch mit einem avr und winavr-c über den
parallelen adapter proggen, den man dazu kaufen kann, damit man sich
mit den spannungen nicht rumärgern muss.
mfg pebisoft

von Benedikt (Gast)


Lesenswert?

Ja, aber ich weiß nicht wie es mit dem Timing aussieht, da die 100Ohm
Widerstände zusammen mit den Leitungenen einen Tiefpass bilden.

von Wolfgang (Gast)


Lesenswert?

Hallo,
ich habe kein Programm anzubieten, würde aber gern, da hier aktuell
mein Problem behandelt wird, Eure Hilfe in Anspruch nehmen.
Ich habe mir das Pollin LCD mit Ansteuerzusatz zugelegt, um mich mit
„Grafik“ vertraut zu machen; finde aber nicht den richtigen Anfang.
Da ich das Datenblatt T6963C zu „Grafik“ nicht richtig deuten kann,
außerdem nicht einen avr, sondern später mal einen MSP430 verwenden
möchte, meine Frage, ob es noch weitere Literatur zum Thema
„Grafik“-Ansteuerung mit einem T6963 gibt.
Was will ich konkret machen?
Auf dem LCD soll eine Folge von Messwerten in Echtzeit als Kurve
dargestellt werden.
Ist x auf der x-Achse bei 128 angekommen, soll der Bildschirm gelöscht
werden und das Spiel beginnt von vorn.
Also, welche Befehlfolge müsste  ich wählen, um einen Bildpunkt (x, y)
nach dem anderen anzusteuern bzw. mit welcher Befehlfolge wird ein
einzelner Bildpunkt gesetzt?

MfG
Wolfgang

von Wolfgang (Gast)


Lesenswert?

@pebisoft
die 100 Ohm Widerstände dürften nicht stören:
1. die Ansteuerung mit dem PC funktioniert problemlos, wobei die
Kabellänge sogar 2m beträgt
2. bei C=10pF ergibt sich eine RC konstante von 1ns, wenn ich richtig
rechne.

Die mir am 14.7.05 gelieferte Ansteuerschaltung erzeugt nur die
negative Hilfsspannung. Die +5V +-10% müssen extern erzeugt werden.
Wenn mit einem µC das LCD angesteuert werden soll, würde ich nicht auf
die Pollin-Schaltung setzen, sondern würde die Spannungsversorgung
selbst entwerfen. Eine einstellbare neg. Spannung bis –4V sollte
reichen. (bei mir reichen für einen guten Kontrast -2,2V)

MfG
Wolfgang

von Rufus T. Firefly (Gast)


Lesenswert?

@Wolfgang:

"Da ich das Datenblatt T6963C zu „Grafik“ nicht richtig deuten
kann,"

Wo genau ist denn Dein Problem? Schreib mal, an welcher Passage Du
hängst.

von pebisoft (Gast)


Lesenswert?

wenn ich das richtig verstanden habe, brauche ich mir mit dem
zusatzstecker für den parallelen port keine gedanken machen über die
negative spannung, sondern brauche nur noch die positiven 5 volt.
die kann ich dann von der avrplatine abnehmen, weil diese dort
vorhanden sind.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

wenn ich aber den avr direkt mit den datenstiften des parallelen
anschlusses verbindet, also in den parallen stecker,(der parallele port
hat auch 5volt) wo muss ich dann welche spannung anlegen, damit die
minusspannung für das display erzeugt wird.
mfg pebisoft

von Sascha (Gast)


Lesenswert?

Die kleine Platine wird auch mit 5V versorgt. Da ist eine kleine
Printklemme, da wird die Stromversorgung angeschloßen.

Mfg Sascha

von pebisoft (Gast)


Lesenswert?

wird auch die negative spannung erzeugt am zusatzmodul ohne das man noch
etwas erfinden muss dafür?
mfg pebisoft

von Sascha (Gast)


Lesenswert?

@pebisoft
Sicherlich, dies macht der MC34063. Habe die Platine auch hier liegen.

Mfg Sascha

von Wolfgang (Gast)


Lesenswert?

@Rufus
Es ist nicht nur eine einzelne Passage, sondern ich erkenne  nicht die
Zusammenhänge der  Funktionsweise  eines „Grafik“ LCD. Ich muss noch
dazu sagen, dass meine Englischkenntnisse so schlecht sind, dass ich
insbesondere bei  mir noch unbekannten  Wirkprinzipien die
Zusammenhänge nur schwer erkennen kann.
Im Prinzip möchte ich zunächst wissen, wie man einen einzelnen
Bildpunkt setzen kann.
Ich habe schon einmal mit einem Text LCD (HD44780) gearbeitet. Aber
dabei wurde jeweils ein Zeichen, bestehend aus 6x8 Bildpunkten, an eine
bestimmte Stelle gesetzt. Jetzt soll aber nur ein einzelner Bildpunkt
gesetzt werden und dazu find ich nicht das Prinzip.
Hoffentlich hab ich mich verständlich genug ausgedrückt.
MfG
Wolfgang

von Ralf (Gast)


Lesenswert?

Hi Wolfgang,

ist ganz einfach:

In der Initialisierung des Displays wird dem T6963 mitgeteilt wo der
Grafikbereich im internen Ram des Display beginnt. Als Beispiel gehen
wir jetzt davon aus, dass das Display mit dem Grafikbereich-Beginn
0x0000 initialisiert wurde und das auch bereits die entsprechenden
Einstellungen gemacht wurden, also Grafik = ON usw.

Wenn du nun den Adresspointer des T6963 auf 0x0000 setzt, und dann z.B.
0x55 ans Display sendest, so wird der Wert 0x55 in die erste
Speicherstelle des Display-Rams geschrieben. Der Controller weiss ja,
dass dort der Grafikbereich ist, also bringt er die 0x55 auf das
Display. Das Ergebnis ist dann, dass das erste Pixel links oben aus
ist, das zweite ist an, usw.

Für das Pixel setzen/löschen unterstützt der T6963 noch einen eigenen
Befehl. Dazu musst du ebenfalls den Adresspointer des Displays auf die
8-Bit-Speicherstelle setzen, indem sich das Pixel befindet, das du
steuern willst. Mit dem Pixel-Befehl des T6963 kannst du nun sagen,
welches der 8 Pixel nun an oder aus ist.

Hoffe das hat dir weitergeholfen.

Wenn nicht, einfach weiterfragen grins

Gruß Ralf

von Wolfgang (Gast)


Lesenswert?

Da die Funktionsweise eines LCD m.E. nicht unbedingt in die Rubrik
„Codesammlung“ passt, werde ich in der Rubrik „µC&Elektronik“ ein neues
Thema: „Funktionsweise eines Grafik LCD“ eröffnen.
MfG
Wolfgang

von pebisoft (Gast)


Lesenswert?

das display hat 8kbyte speicher, kann man den auch wieder auslesen und
die daten anderweitig verwenden.
mfg pebisoft

von Marko B. (Gast)


Lesenswert?

Ja. Man kann den Speicher auch mit Bitmaps füllen und diese vertikal
scrollen, oder zwischen mehreren Bitmaps umschalten.

von pebisoft (Gast)


Lesenswert?

hallo marco, hast du einpaar befehle für einen programmieranfänger auf
dem display. ich finde kein hinweis dafür, wie man zb ein byte ausliest
aus dem speicher. kannst du mal eins schreiben, 2 byte an 6. stelle
ablegen im speicher und dann wieder herausholen zum bearbeiten.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

ich habe mein display über den parallelen anschluss laufen an einem
avr.
12 leitungen habe ich zur verfügung. es fehlt mir noch reset und die
buchstabenumschaltung (6 oder 8bit) für den avr. wo kann ich diese
beiden leitungen  anzapfen an der fertigen parallelplatine.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

hallo sascha, kannst du mir mal ein beispiel in einer main() geben für
text und grafik, bei beiden ist die main() nicht vorhanden, wäre dir
dankbar. ich weiss nicht, wie ich z.b. ein string übertragen kann.
mfg pebisoft

von Marko B. (Gast)


Lesenswert?

pebisoft:

Du kannst CE auf GND legen, dann brauchst Du nur 11 Leitungen. RST und
FS kommen an 5V.

Hast Du schon eine funktionierende Ansteuerung, d.h. kannst Du
wenigstens Daten/Kommandos senden und bekommst etwas angezeigt?

von Sascha (Gast)


Lesenswert?

Hi,
@pebisoft

#include <avr/pgmspace.h>

const char MTEXT0_0[] PROGMEM= {"Hallo"}; //Text steht im Flash

int main(void)
{
  lcd_init();


    lcd_printp(MTEXT0_0,0x00,0x00); // Text aus dem Flash
    lcd_print("Hallo",0x00,0x021); // Text

  for(;;)
    {
                 }
        return 0;
}

Mit Grafik anzeigen bin ich noch nicht weiter gekommen. Da ich den Font
6*8 nutze, habe ich momentan noch totale Verzerrungen. Man kann nichts
erkennen.

Mfg Sascha

von Benedikt (Gast)


Lesenswert?

>RST und FS kommen an 5V.
Da wäre ich vorsichtig ! Reset ist das was man unter Reset versteht,
und wenn man es an 5V hängt, ist nichts mit Reset...
Diese Tatsache hat mich eine halbe Stunde Fehlersuche gekostet: Auf dem
LCD erschien nur Müll, bis ich darauf kam mal einen Reset am LCD zu
machen. Seitdem hängen immer 10k + 100nF dran.

von pebisoft (Gast)


Lesenswert?

mit dem programm von pollin über die parallele schnittstelle wird alles
angezeigt, grafik und text. mit dem programm von sascha auf dem avr
noch nichts. d0-d7 greife ich am display ab (klemme 10-17 am
dsiplay.),
wr,rd,ce,c/d,rst (klemme 5-9 am display) wenn ich ohne die prallele
arbeite.
beim hochdrehen des kontrastes sehe ich die pixel.
es wird aber noch nichts angezeigt.
daten gehen bei mir über portb0-portb7 und steuersignale über
portd2-portd6.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

ich habe einen avr16 mit intern 8mhz.
mfg pebisoft

von pebisoft (Gast)


Lesenswert?

winavr-prog wurde auf portd und portb programmiert(geändert).
mfg pebisoft

von Marko B. (Gast)


Lesenswert?

Benedikt:

Das ist mir auch klar! Die Reset-Schaltung hatte ich schon drin, habe
sie aber wieder rausgenommen, da es ohne genauso gut funktioniert. Es
erscheinen nach dem Einschalten einfach zufällige Zeichen. Wenn das
Display aber sofort nach dem Einschalten vom uC initialisiert wird,
sieht man nichts, es funktioniert auch alles einwandfrei.

Ist natürlich gut möglich, daß man damit bei einem anderen Display auf
die Nase fällt.

pebisoft: zeig doch mal Deinen kompletten Code. Ich habe schon eine
Library geschrieben, ist aber noch nicht fertig. Im Moment arbeite ich
an der Darstellung von Bitmap-Fonts.

von pebisoft (Gast)


Lesenswert?

habe keine resetleitung angeschlossen, nur die 8 datenleitungen und die
4 steuerleitungen.
der text wird nicht als "hello "ausgegeben sondern es erscheinen in
der 2. reihe 3 buchstaben und in der 3. reihe 5 buchstaben
die auch teilweise durch 3 leerzeichen getrennt sind. die buchstaben
sind alles komische sonderzeichen und 3 "ö".
mit dem parallelen anschluss geht das display.
mfg pebisoft

hier der code:

//********************************************************************** 
**
// T6963.C
// LowLevel Routinen für LCD-Displays mit T6963
//********************************************************************** 
**

#include <avr/interrupt.h>
#include <avr/signal.h>
#include <string.h>
#include "T6963.h"

unsigned char LCD_CMD;          // Command-Byte
unsigned char LCD_STATUS;       // Status-Byte
unsigned char LCD_DATA;         // Daten-Byte


/**** LCD-Display-Routinen
**********************************************/
void lcd_init(void)
        {
        unsigned int t;
    LCD_CTRL = 0xff;
    DDRD=0xff;
    PORTB=0xFF;
        //LCD_RST_L();          // Display Reset
        //    for (t=0; t<2000; t++)
        //    {}
        //LCD_RST_H();          // Display Reset fertig
        LCD_DATA = 0x00;        // Text Home Adress setzen
        lcd_send_data();        // Auf 0000H setzen
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x40;
        lcd_send_cmd();
        LCD_DATA = 0x15;        // Text AREA Adress setzen
        lcd_send_data();        // 28H = 40 Zeichen
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x41;
        lcd_send_cmd();
        LCD_DATA = 0x00;        // Grafik Home Adress setzen
        lcd_send_data();        // Auf 0200H setzen
        LCD_DATA = 0x02;
        lcd_send_data();
        LCD_CMD = 0x42;
        lcd_send_cmd();
        LCD_DATA = 0x15;        // Grafik AREA Adress setzen
        lcd_send_data();        // 28H = 40 Zeichen
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x43;
        lcd_send_cmd();
        LCD_DATA = 0x02;        // Offset Pointer setzen
        lcd_send_data();
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x22;
        lcd_send_cmd();
        lcd_send_cmd();
        LCD_CMD = 0x80;         // OR-Mode
        lcd_send_cmd();
        LCD_CMD = 0x9C;         // Text an Grafik aus
        lcd_send_cmd();
        LCD_DATA = 0x00;        // Adress Pointer setzen
        lcd_send_data();        // 0000H
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x24;
        lcd_send_cmd();
        lcd_clear_ram();        // zum Schluß noch das Ram des
        }                       // Display's löschen

void lcd_status(void)
        {
        DATA_DIR_IN();          // Port B als Eingang
        LCD_CD_H();             // Commando High
        LCD_RD_L();             // Read Low
        LCD_CE_L();             // Chip Enable Low
        LCD_STATUS = LCD_READ;  // Status lesen
        LCD_CE_H();             // Chip Enable High
    LCD_RD_H();             // Read High
        LCD_STATUS &= (0x03);   // Bits ausmaskieren
        }

void lcd_status_am(void)
        {
        DATA_DIR_IN();          // Port 2 als Eingang
        LCD_CD_H();             // Commando High
        LCD_RD_L();             // Read Low
        LCD_CE_L();             // Chip Enable Low
        LCD_STATUS = LCD_READ;  // Status lesen
        LCD_CE_H();             // Chip Enable High
    LCD_RD_H();             // Read High
        LCD_STATUS &= (0x08);   // Bits ausmaskieren
        }

void lcd_send_cmd(void)         // Commando an Display senden
        {
            do
                {
                  lcd_status();
                }
            while (LCD_STATUS != 0x03);
        DATA_DIR_OUT();             // Port 2 als Ausgang
        LCD_WRITE = LCD_CMD;
        LCD_CD_H();             // Commando High
        LCD_WR_L();             // Write Low
        LCD_CE_L();             // Chip Enable Low
        LCD_CE_H();             // Chip Enable High
        LCD_WR_H();             // Write High
        }

void lcd_send_data(void)         // Daten an Display senden
        {
            do
                {
                  lcd_status();
                }
            while (LCD_STATUS != 0x03);
        DATA_DIR_OUT();             // Port 2 als Ausgang
        LCD_WRITE = LCD_DATA;
        LCD_CD_L();             // Commando High
        LCD_WR_L();             // Write Low
        LCD_CE_L();             // Chip Enable Low
        LCD_CE_H();             // Chip Enable High
        LCD_WR_H();             // Write High
        }

void lcd_send_data_am(void)         // Daten an Display senden
        {
            do
                {
                  lcd_status_am();
                }
            while (LCD_STATUS != 0x08);
        DATA_DIR_OUT();             // Port 2 als Ausgang
        LCD_WRITE = LCD_DATA;
        LCD_CD_L();             // Daten Low
        LCD_WR_L();             // Write Low
        LCD_CE_L();             // Chip Enable Low
        LCD_CE_H();             // Chip Enable High
        LCD_WR_H();             // Write High
        }

void lcd_print(const char *progmem_s, char adress_h, char adress_l)
        {
        char c;

        LCD_DATA = adress_l;    // übergebene Adresse setzen
        lcd_send_data();
        LCD_DATA = adress_h;
        lcd_send_data();
        LCD_CMD = 0x24;
        lcd_send_cmd();

        LCD_CMD = 0xB0;         // Auto Write Mode an (Auto Inkrement)
        lcd_send_cmd();

    while ( (c = pgm_read_byte(progmem_s++)))
      {
      lcd_send_str(c);
      }
        LCD_CMD = 0xB2;         // Auto Write Mode aus (Auto
Inkrement)
        lcd_send_cmd();
        }

void lcd_send_str(unsigned char lcd_dat)
        {
        lcd_dat -= 0x20;        // 20h subtrahieren da Display nich
ASCII
        LCD_DATA = lcd_dat;     // kompatibel
        lcd_send_data_am();     // Daten an Display senden
        }

void lcd_clear_ram(void)
        {
        unsigned int t;
        LCD_DATA = 0x00;        // int. Ram des Display's löschen.
        lcd_send_data();        // laut Datenblatt des Herstellers 8kb
        LCD_DATA = 0x00;
        lcd_send_data();
        LCD_CMD = 0x24;
        lcd_send_cmd();
        LCD_CMD = 0xB0;         // Auto Write Mode an (Auto Inkrement)
        lcd_send_cmd();
                for (t=0; t<8192; t++)
                {
                LCD_DATA = 0x00;
                lcd_send_data_am();     // Daten an Display senden
                }
        LCD_CMD = 0xB2;         // Auto Write Mode aus (Auto
Inkrement)
        lcd_send_cmd();
        }

void lcd_printg(const char *progmem_s, char adress_h, char adress_l)
        {
        char c;

        LCD_DATA = adress_l;    // übergebene Adresse setzen
        lcd_send_data();
        LCD_DATA = adress_h;
        lcd_send_data();
        LCD_CMD = 0x24;
        lcd_send_cmd();

        LCD_CMD = 0xB0;         // Auto Write Mode an (Auto Inkrement)
        lcd_send_cmd();

    while ( (c = pgm_read_byte(progmem_s++)))
      {
      lcd_send_strg(c);
      }
        LCD_CMD = 0xB2;         // Auto Write Mode aus (Auto
Inkrement)
        lcd_send_cmd();
        }

void lcd_send_strg(unsigned char lcd_dat)
        {
        LCD_DATA = lcd_dat;     // kompatibel
        lcd_send_data_am();     // Daten an Display senden
        }

const

int main(void)
{

  lcd_init();
    lcd_print("Hallo",0x00,0x021); // Text

  for(;;)
    {
                 }
}


die header-datei :

//********************************************************************** 
**
// T6963.H
#include <avr/io.h>
#include <avr/pgmspace.h>

//PORTB ist der Datenport
#define DATA_DIR_IN()  DDRB =0x00;
#define DATA_DIR_OUT() DDRB =0xFF;
#define LCD_READ   PINB
#define LCD_WRITE  PORTB

#define LCD_WR    2                // LCD_WRITE
#define LCD_RD    3                // LCD_READ
#define LCD_CE    4                // LCD_CS
#define LCD_CD    5                // LCD_COMMAND/DATA
#define LCD_RST    6                // LCD_RESET
#define LCD_CTRL  PORTD              // Steuerport LCD

#define LCD_WR_H()     LCD_CTRL |=  _BV(LCD_WR)  // = 1
#define LCD_WR_L()      LCD_CTRL &= ~_BV(LCD_WR)  // = 0
#define LCD_RD_H()     LCD_CTRL |=  _BV(LCD_RD)
#define LCD_RD_L()      LCD_CTRL &= ~_BV(LCD_RD)
#define LCD_CE_H()     LCD_CTRL |=  _BV(LCD_CE)
#define LCD_CE_L()      LCD_CTRL &= ~_BV(LCD_CE)
#define LCD_CD_H()     LCD_CTRL |=  _BV(LCD_CD)
#define LCD_CD_L()      LCD_CTRL &= ~_BV(LCD_CD)
#define LCD_RST_H()     LCD_CTRL |=  _BV(LCD_RST)
#define LCD_RST_L()      LCD_CTRL &= ~_BV(LCD_RST)

#define lcd_puts_P(__s)  lcd_puts_p(PSTR(__s))
#define XMAX  127
#define XMIN  0
#define YMAX  63
#define  YMIN  0
#define G_BASE  0x200
#define BYTES_PER_ROW  21

void lcd_init(void);
void lcd_status(void);
void lcd_status_am(void);
void lcd_send_cmd(void);
void lcd_send_data(void);
void lcd_send_data_am(void);
void lcd_print(const char *progmem_s, char adress_h, char adress_l);
void lcd_send_str(unsigned char);
void lcd_clear_ram(void);
void lcd_printg(const char *progmem_s, char adress_h, char adress_l);
void lcd_send_strg(unsigned char lcd_dat);

von Sascha (Gast)


Lesenswert?

Die LCD_PRINT Routine sieht so aus

void lcd_print(char *txt, char adress_h, char adress_l)
        {
        char c;

        LCD_DATA = adress_l;    // bergebene Adresse setzen
        lcd_send_data();
        LCD_DATA = adress_h;
        lcd_send_data();
        LCD_CMD = 0x24;
        lcd_send_cmd();

        while((c = *txt)) //Solange Zeichen größer 0x00
      {
      txt++; //Nächstes Zeichen
      if (c == 0) break; //Raus wenn Zeichen gleich 0
      lcd_send_str(c);
       LCD_CMD = 0xc0;
      lcd_send_cmd();
      }
        }

mit deiner Version, liest du irgend welche Bytes aus dem Flash und
zeigst diese an

Mfg sascha

von Sascha (Gast)


Lesenswert?

@pebisoft

hast ne mail.

Mfg sascha

von pebisoft (Gast)


Lesenswert?

ja : pebisoft@arcor.de
mfg pebisoft

von Tobias (Gast)


Lesenswert?

Hallo,

ich habe ebenfallss mit dem Display ein 'kleines' Problem. Ich
steuere es über ein Embedded-System per I2C-Bus an. Bis jetzt verwende
ich nur die reine Textausgabe.

Mein Problem:
Ich kann nur auf die ersten 4 Zeilen voll Zugreifen. Ab Display-Stelle
(Pointer-Position) 0x80 'spinnt' das Display. Es erscheinen
irgendwelche Zeichen und wilde Pixel.

Ich schreibe meine SW in C++. Inzwischen habe ich alles so weit
umgebaut, dass ein Variablenüberlauf o.Ä. eigentlich nicht mehr
vorkommen sollte.

Hat jemand eine Idee woran es liegt, dass ich nur auf die ersten 0x80
Stelleen zugreifen kann?

Danke
Tobias

von pebisoft (Gast)


Lesenswert?

hallo, ich arbeite mit winavr-c.
der text unten im programm erscheint in der 1. zeile und der letzten
zeile, so iwe ich es angegeben habe. mit grafik bin ich noch nicht
soweit. so ie du siehst, komme ich auch über den wert 128 hinaus.
mfg pebisoft

int main(void)
{

  lcd_init();
  lcd_print("Hurra, pebisoft !",0,0); // 1 Zeile Text
  lcd_print("Es geht doch !",0,147); // letzte Zeile Text
  for(;;)
    {
    }
}

von Sascha (Gast)


Lesenswert?

Hi,

könnte vielleicht ein Problem in der Initialisierung sein. Poste doch
mal deinen Code.

@pebisoft: Hast du meine Mail gekriegt??

Mfg Sascha

von pebisoft (Gast)


Lesenswert?

hallo, habe deine mail bekommen. an der grafik bin ich noch nicht
weitergekommen. dein programm ist eine sehr gute grundlage.
mfg pebisoft

von Tobias (Gast)


Lesenswert?

Danke Sascha, für eure Hilfsbereitschaft

void OutLCD::Init(void)
{
int i;

I2C_transmit_char(IDctrl, 0x04);
I2C_release();
I2C_transmit_char(IDctrl, 0x14);
I2C_release();

//Text start Adresse
Send_Data(0x00);
Send_Data(0x00);
Send_Ctrl(0x40);

//Grafi start
Send_Data(0x00);
Send_Data(0x00);
Send_Ctrl(0x42);

//Text Area
Send_Data(0x20);                 //breite 32 byte
Send_Data(0x00);
Send_Ctrl(0x41);

//grafik area
Send_Data(0x20);
Send_Data(0x00);
Send_Ctrl(0x43);

//Mode
Send_Ctrl(0x80);

//Cursor setztem GRafik und TextModus
Send_Ctrl(0x97);

ClearDisplay();
}



void OutLCD::Send_Data(unsigned char data)
{
Status();
I2C_transmit_char(IDdata,data);
I2C_release();
I2C_transmit_char(IDctrl,0x12);
I2C_release();
I2C_transmit_char(IDctrl,0x1a);
I2C_release();
}



void OutLCD::Send_Ctrl(unsigned char ctrl)
{
Status();
I2C_transmit_char(IDdata,ctrl);
I2C_release();
I2C_transmit_char(IDctrl,0x1a);
I2C_release();
I2C_transmit_char(IDctrl,0x1e);
I2C_release();
}



void OutLCD::Write_Auto_Data(char data)
{
I2C_transmit_char(IDdata, data);
I2C_release();
I2C_transmit_char(IDctrl,0x12);
I2C_release();
I2C_transmit_char(IDctrl,0x16);
I2C_release();
}


void OutLCD::Write_LCD(int y, int x, char* zeichen)
{
int StringL, i;
int zaehler ;

zaehler=(y*0x20) + x;
StringL=strlen(zeichen);

Send_Data(zaehler & 0xff);   //spalte
Send_Data(zaehler >> 0x08);   //zeile??
Send_Ctrl(0x24);   //Adress Pointer
Send_Ctrl(0xb0);   //Auto Write

for (i=0 ; i < (StringL) ; i++)
 Write_Auto_Data(zeichen[i]-0x20);
Write_Auto_Data(0);

Send_Ctrl(0xb2);   //auto write ENDE
}

void main(void)
{
...
OutLCD Display(LCDdata, LCDctrl);
Display.Init();
Write_LCD(y, x, "test");
...
}

von Holzfäller (Gast)


Lesenswert?

hallo!

hab mir das display + platine bestellt.
nur, welche pind der D-SUB-25 Buchse haben welche funktion?

mfg
Holzfäller

von Sascha (Gast)


Lesenswert?

@Tobias

Die Speicheradressen für Grafik und Text überschneiden sich. Stell mal
die Adresse für Grafik auf 0200H. Dann ist 0H-1FFH für Text reserviert.
Desweiteren hat Die Zeile (breite) imt Text-Modus bei 8*8 16Bytes und
bei 6*8 22(21.33)Bytes. Und Text an Grafik an ist 09CH.

Mfg Sascha

von Tobias (Gast)


Lesenswert?

@Sascha

das habe ich jetzt ehrlichgesagt nicht so ganz kapiert. Ich habe bei
mir nur mal die Änderung an der Grafik gemacht:

//Grafik start
Send_Data(0x00);
Send_Data(0x20);
Send_Ctrl(0x42);

aber ich konnte noch keinen Erfolg vermelden. Was muss ich deiner
Meinung nach, noch tun?

Tobias

von Sascha (Gast)


Lesenswert?

Du gibst eine Zeilenlänge von 32Bytes an. Bei dem Font 6*8 hast du 21
und bei 8*8 16 Bytes/Zeichen pro Zeile.

Mfg Sascha

von Tobias (Gast)


Lesenswert?

@ Sascha

Danke, ich bin jetzt ein Stück weiter. Aber ich habe immernoch eine
Frage:-)

Main Display hat doch 240px, und ein Zeichen hat 8px. Also passen doch
30 Zeichen in eine Reihe.
Wiso wird die Text-Area dann auf 16 gesetzt?

Wenn ich jetzt etwas ausgeben will, setzt das Display Zeichen 17-30
nocheinmal in der Zeile eins Tiefer an dan Anfang. Woher kann das denn
kommen?

Vielen Dank
Tobias

von Sascha (Gast)


Lesenswert?

@Tobias

Dann schreib doch auch, was für ein Display du hast:) Ich bin jetzt von
diesem hier augegangen, das hat 128*64 Pixel.

//Text start Adresse
Send_Data(0x00);     //Textstart ab 0000H-01FFH
Send_Data(0x00);
Send_Ctrl(0x40);

//Grafi start
Send_Data(0x00);
Send_Data(0x02);     //Grafikstart ab 0200H
Send_Ctrl(0x42);

//Text Area
Send_Data(0x1E);                 //breite 30 byte
Send_Data(0x00);
Send_Ctrl(0x41);

//grafik area
Send_Data(0x1E);
Send_Data(0x00);
Send_Ctrl(0x43);

So sollte es dann aussehen

Mfg Sascha

von Tobias (Gast)


Lesenswert?

@Sascha

Jetzt geht es wieder nichtmehr.
Ich kann nach den letzten Änderungen wieder nur auf die ersten 0x80
zugreifen. Wenn ich auf die dahinterliegenden Stellen zugreifen will,
dann erscheinen wieder nur Wilde Zeichen auf dem Display.

Tobias

von Mr. Schaf (Gast)


Lesenswert?

Darf ich fragen, welches Display ihr bei Pollin meint?
Ich finde jedenfalls keins mit 128x64.

von pillon (Gast)


Lesenswert?

Wer zu spät kommt, den bestraft das Leben...

Ich kann Dir aber welche verkaufen, für 19Euro das Stück.

von pebisoft (Gast)


Lesenswert?

bei pollin hat es 7 euro gekostet plus ansteuerungsplatine 4 euro.
mfg pebisoft

von Wiskas(TM)-Jäger (Gast)


Lesenswert?

@pillon

Ist das auch der Preis, den du bei eBay verlangst (verlangen wirst)?

von pebisoft (Gast)


Lesenswert?

wenn ich welche übrig hätte (3 stück brauche ich selber), wären diese
für den o.a. preis plus porto zum empfänger gegangen.
mfg pebisoft

von dirk (Gast)


Lesenswert?

Gibts ihrgend wie den kompletten neuen Code zum DL auch mit Grafik?

von Sascha (Gast)


Lesenswert?

Hi,

Grafik geht zwar mittlerweile, aber du mußt beim Bild dann die richtige
Größe in Bytes angeben. Versuche ich gerade noch zu ändern.

Mfg Sascha

von Pascal (Gast)


Lesenswert?

bei Pollin gibts mal wieder 128x64-Displays, diesmal allerdings mit dem
Controller SED1565
Hat schon jemand was mit diesem Display gemacht?
Kann man das evtl. sogar genauso verwenden wie das hier Besprochene?

von Alexandre Terentiev (Gast)


Lesenswert?

Suche im Forum (Stichwort SED1565):
http://www.mikrocontroller.net/forum/read-4-234145.html
;)

von Klaus (Gast)


Lesenswert?

Hallo Sascha

diese Beträge sind zwar vom vorigen Jahr, hoffe aber dass du trotzdem
antwortest.

Habe deinen Treiber schon am laufen!
Leider dauert es ziemlich lange wenn ich Text ausgeben will.
Woran kann das liegen?
Habe ein 240x128 pixel display.wenn ich nur einzelne Zeichen ausgebe,
braucht das Programm etwa 1 minute bis das ganze display voll ist.
Habe auch einen Code von Benedikt gesehen der schneller sein soll,
leider findet man in seinem Code keine Zuweisungen der Steuerbits zu
dem Hardwareports!?

danke erst mal

von Sascha S. (sascha)


Lesenswert?

Hi,

Was für einen Controller nutzt du den? Hab ich auch ein 240x128 liegen.
Geht echt zügig. Zwar keine keine Vektor-Grafik :( aber trotzdem.
Benedikt nutzt den Memory-Port, hat aber nicht jeder AVR.
Was für einen Takt benutzt du den??

Mfg Sascha

von Klaus (Gast)


Lesenswert?

Hallo Sascha

Ich habe auch einen T6963 am Display und einen ATMEGA128 mit 16Mhz.
Sollte meiner Meinung daran nicht liegen, oder.
Mir ist aufgefallen, dass ein langer string, also so etwa 150 Zeichen,
recht zügig angezeigt wird, aber bis zum zweiten Aufruf der Funktion
zum Ausgeben des Strings dauert es dann schon lange.

Hast du es eigentlich schon geschafft, auch Grafiken auszugeben?
Mir sind die Buchstaben, etwas zu klein, möchte größere ausgeben.
Das geht aber anscheinend nur mit dem Zeilenabstand und den
Zeichenabstand. Ich meine man kann anscheinend den Text nicht auf pixel
genau ausgeben.


Danke für die rasche Antwort.
LG klaus

von Sascha S. (sascha)


Lesenswert?

Grafik, funktioniert gerade so. Bei dem momentanen Stand muß man die
Anzahl der bytes wissen, die als Grafik übertragen werden. Deshalb
wundert es mich. Bei Grafik sind es beim 240x128 Pixel Display max.
5120 Bytes die übertragen werden. Das dauert bei mir locker unter eine
Sekunde. Im Text-Modus sind es beim 6x8 Font max. 640 Bytes. Sollte
also noch schneller gehen. Irgendwo ist bei dir im Source nen Hacken.

Mfg Sascha

von Klaus (Gast)


Lesenswert?

Hallo Sascha
war
selbst schuld, habe in einer Timerinterrupt routine was geändert.
Dadurch kommt es zu hin und wieder zu Verzögerungen von 300ms.
Mein Timer wird alle 1ms aufgerufen und ich wollte daraus
sekunden,minuten generieren.Anscheinend dauert das viel zu lange was
ich da gemacht habe. Muss einen anderen Weg finden.

Hast du vielleicht einen Anhaltpunkt bezüglich Grafik routinen, zb.
fertigen code, damit ich nicht ganz von Null anfangen muss?

danke
Klaus

von Sascha S. (sascha)


Lesenswert?

Hast Mail.

Mfg Sascha

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.