Hier die Ansteuerung in C. Stammte von dem Source, den ich hier mal für den M16C reingesetzt hatte. Mfg Sascha
Ganz vergessen. Grafik geht noch nicht :( Kommt aber noch..... Mfg Sascha
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.
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
Ja, aber ich weiß nicht wie es mit dem Timing aussieht, da die 100Ohm Widerstände zusammen mit den Leitungenen einen Tiefpass bilden.
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
@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
@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.
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
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
Die kleine Platine wird auch mit 5V versorgt. Da ist eine kleine Printklemme, da wird die Stromversorgung angeschloßen. Mfg Sascha
wird auch die negative spannung erzeugt am zusatzmodul ohne das man noch etwas erfinden muss dafür? mfg pebisoft
@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
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
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
das display hat 8kbyte speicher, kann man den auch wieder auslesen und die daten anderweitig verwenden. mfg pebisoft
Ja. Man kann den Speicher auch mit Bitmaps füllen und diese vertikal scrollen, oder zwischen mehreren Bitmaps umschalten.
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
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
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
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?
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
>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.
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
winavr-prog wurde auf portd und portb programmiert(geändert). mfg pebisoft
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.
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);
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
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
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(;;) { } }
Hi, könnte vielleicht ein Problem in der Initialisierung sein. Poste doch mal deinen Code. @pebisoft: Hast du meine Mail gekriegt?? Mfg Sascha
hallo, habe deine mail bekommen. an der grafik bin ich noch nicht weitergekommen. dein programm ist eine sehr gute grundlage. mfg pebisoft
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"); ... }
hallo! hab mir das display + platine bestellt. nur, welche pind der D-SUB-25 Buchse haben welche funktion? mfg Holzfäller
@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
@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
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
@ 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
@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
@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
Darf ich fragen, welches Display ihr bei Pollin meint? Ich finde jedenfalls keins mit 128x64.
Wer zu spät kommt, den bestraft das Leben... Ich kann Dir aber welche verkaufen, für 19Euro das Stück.
bei pollin hat es 7 euro gekostet plus ansteuerungsplatine 4 euro. mfg pebisoft
@pillon Ist das auch der Preis, den du bei eBay verlangst (verlangen wirst)?
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
Gibts ihrgend wie den kompletten neuen Code zum DL auch mit Grafik?
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
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?
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
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
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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.