Hallo, ich habe ein atmega16 nach Anweisung von Fleury angeschlossen und benutze die mitgegebene Library. Ich will damit ein ST7036 (4bit, 2-lines) ansprechen Ich habe entsprechend den Anweisungen initialisiert, also #define XTAL 4000000 #define LCD_LINES 2 #define LCD_DISP_LENGTH 16 #define LCD_LINE_LENGTH 0x40 #define LCD_START_LINE1 0x00 #define LCD_START_LINE2 0x40 #define LCD_WRAP_LINES 0 #define LCD_IO_MODE 1 #if LCD_IO_MODE #define LCD_PORT PORTB /**< port for the LCD lines */ #define LCD_DATA0_PORT LCD_PORT /**< port for 4bit data bit 0 */ #define LCD_DATA1_PORT LCD_PORT /**< port for 4bit data bit 1 */ #define LCD_DATA2_PORT LCD_PORT /**< port for 4bit data bit 2 */ #define LCD_DATA3_PORT LCD_PORT /**< port for 4bit data bit 3 */ #define LCD_DATA0_PIN 0 /**< pin for 4bit data bit 0 */ #define LCD_DATA1_PIN 1 /**< pin for 4bit data bit 1 */ #define LCD_DATA2_PIN 2 /**< pin for 4bit data bit 2 */ #define LCD_DATA3_PIN 3 /**< pin for 4bit data bit 3 */ #define LCD_RS_PORT LCD_PORT /**< port for RS line */ #define LCD_RS_PIN 4 /**< pin for RS line */ #define LCD_RW_PORT LCD_PORT /**< port for RW line */ #define LCD_RW_PIN 5 /**< pin for RW line */ #define LCD_E_PORT LCD_PORT /**< port for Enable line */ #define LCD_E_PIN 6 /**< pin for Enable line */ eingetragen und will das mitgelieferte 'test_lcd' benutzen aber leider passiert nichts. Hat irgendjemand schon mal dieses Display benutzt und eine Idee woran es liegen könnte?
Hallo, bist Du weiter gekommen? ich habe nun das selbe Problem. Nach dem Programmieren steht zwar was auf dem LCD, aber nach einem Reset ist alles weg. Gruß Toby
Hi Nochmal, da es ein etwas anderer controler ist, muß man diesen Wohl anders initialisieren. Im Datenblatt steht zB. zur 4 Bit Mode Initialisierung folgendes : Power On Wait some Time >40ms Function set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 0 0 0 0 Wait some Time >1,6ms Function set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 X X X X Wait some Time >26,3us Function set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 1 X X X X Wait some Time >26,3us Function set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 0 X X X X Wait some Time >26,3us Function set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 1 0 X X X X 0 0 N DH IS2 IS1 X X X X Wait some Time >26,3us Internal OSC frequenzy RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 1 X X X X 0 0 BS F2 F1 F0 X X X X Wait some Time >26,3us Contrast Set RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 1 1 X X X X 0 0 C3 C2 C1 C0 X X X X Wait some Time >26,3us Power/ICON/Contras Control RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 0 1 X X X X 0 0 Ion Bon C5 C4 X X X X Wait some Time >26,3us Follower control RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 1 1 0 X X X X 0 0 Fon Rab2 Rab1 Rab0 X X X X Wait some Time >26,3us Display On/Off Control RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 0 0 0 0 0 0 X X X X 0 0 1 D C B X X X X So, das soll die Initialisierung sein. Und was bitte ist mit dem E (Enable) Pin wären der Zeit, wo ich die Daten sende, und warte? Vielleicht kann mir jemand sagen, wie ich die Radig oder Fleury Lib umschreiben muß?! Bei der Fleury Lib kann man wenigstens die Pins frei wählen. Bei Radig ist das schon etwas schwerer, denke ich. Ich habe folgende Pin Belegung : PA7 PA6 PA5 PA4 PA3 PA2 PA1 PA0 DB7 DB6 DB5 DB4 --- E R/W RS Und ich programmiere mit Win AVR. Gruß Toby
Hallo, Leidensgenosse. Ich bin dazu übergeggangen mir meine eigene Lib zu schreiben, da ich mit der Fleury-Lib das Display auch nicht zum Laufen kriege. Leider bin ich noch nicht fertig. Trotzdem versuche ich mal dir Antwort zu geben. Die Enable Leitung muss bevor man etwas an die Datenregister schickt auf high gesetzt werden and nach dem Setzen der Datenregister wieder zurück auf low. Erst durch das Setzen von high-low werden die Daten übernommen. Das Ganze ist nicht explizit beschrieben sondern nur durch eine Grafik im Datenblatt dokumentiert. Leider habe ich das jetzt nicht zur Hand um dir ganz genau die Seite zu sagen. Wichtig ist, dass die Datenleitung für jedes Nibble auf high-low gesetzt werden muss. Das Ganze schreibt dir ein noch blinder, der hofft dass er bis Ende der Woche ein funktionierendes Display hat.
Also wenn der Kontroller HD44780 Kompatibel ist klappt das gaaaanz bestimmt mit der Fleury Lib - die hab ich erst vergangene Woche benutzt. Grüße, Stefan PS: Acho als Pinbelegung hab ich display D4..7 auf Port pin 0..3 gelegt. und auch die lcd.h entsprechend angepasst. Dort steht auch nochmal ein Verweis auf die quartz - Frequenz drinne wege delays, die das Display brauch. Grüße, Stefan
Hallo, habe ebenfalls probleme mit dem ST7036-Controller. Hab bisher nur I2C-LCDs angesteuert, und bin sozusagen Neuling im Gebrauch der 4bit-Ansteuerung. Im Datenblatt des ST7036 erscheint mir bei der Initialisierung im Assembler-Code-Beispiel etwas merkwürdig. Dort werden bei den 4 Function-Sets nur jeweis die oberen 4 Bits übertragen; und bei den weiteren Registern beide Halb-Bytes (erst die oberen, und dann die unteren 4Bits). ?!? Ich weiß nicht wie das bei anderen Displays im 4Bit Mode funktioniert. Hab mein Programm mal angehängt(hier nur 3 Funct.Sets mit nur 4Bit) Klappt aber so und so nicht ;( Bin der Meinung, entweder immer nur die oberen 4 Bits, oder immer beide Halbbytes nacheinander und dabei das untere Halbbyte als don't care, oder? Grüße, Rainer
Hallo nochmal, ich habe mir Ulrich Radig`s Lib umgeschrieben. Damit laüft mein DOGM 163 super. Bei Intresse, bitte melden. Einzigstes Problem war, das ich eine andere Pinbelegung wie Ulrich habe. Ich hebe die Daten und die Steuerleitungen genau anders rum. Bei Ulrichs Lis ist auch ein sehr schoner Formatierungteil dabei, um einfach Int Werte auszugeben. Gruß Toby
Hallo, bei mir läufts jetzt auch ! :) Hab die Initialisierungswerte vom Datenblatt falsch interpretiert. (meiner Meinung nach auch leltsam dargestellt) Konnte jetzt sämtliche NOPs und Waits wieder löschen. Läuft jetzt einfach prima. Habs am MSP-Port4 hängen im 4Bit-Mode und 3,3V Kann mich nur anschließen: Bei Interesse einfach melden. Schönen Tag noch! Rainer
Hallo Rainer, kannst du die Datei, inder du die Ports und Pins definierst auch noch mitschicken (DOGM.h?) Stefan
Hallo, ich habe das DOGM 163 am laufen. Ich habe die Ulrich Radig lib umgeschrieben. Könnt ja mal reischauen! Aber bitte entschuldigt die Schreibweise im Main. Ist halt nur der Anfang meines Projektes. Ach, wie kann man eigentlich einen AD Wert umrechnen, und mit 2 Kommastellen ausgeben? zB. Die Temperatur mit einer Kommastelle, die Spannung mit 2 Kommastellen ? Und dann habe ich da noch eine KTY13-5 drauf. Wie kann ich damit die Temperatur berechnen? Wie geht das mit einer nicht linearen Wiederstands Kurve, und deren berechnung? Das main.c sieht in etwa so aus : #include <main.h> #include <lcd.c> #include <avr/signal.h> #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr\pgmspace.h> #include <avr/iom128.h> volatile char Software_Zaehler = 0; volatile char AD_Kanal_Zaehler = 0; volatile int FP_Chk = 0; volatile int RC_Sply = 0; volatile int ECU_Sply = 0; volatile int AMB_Temp = 0; volatile int EGT = 0; volatile int Oil_Temp = 0; volatile int Aux1_Emk = 0; volatile int Anlg_Aux = 0; volatile int FP_Chk_1 = 0; volatile int RC_Sply_1 = 0; volatile int ECU_Sply_1 = 0; volatile int AMB_Temp_1 = 0; volatile int EGT_1 = 0; volatile int Oil_Temp_1 = 0; volatile int Aux1_Emk_1 = 0; volatile int Anlg_Aux_1 = 0; /* Initialisierung */ void ioinit (void) { /* Ein-/Ausgänge 1 Ausgang, 0 Eingang */ //DDRA = 0xFF; // Port Ausgang //PORTA = 0x00; // Port alle Low //PORTA wird mit der lcd_init(LCD_DISP_ON); gesetzt DDRB = 0xFF; // Port Ausgang PORTB = 0x0D; // Port keine Pullup / High PB0-PB2-PB3 DDRC = 0x00; // Port Eingang PORTC = 0xFF; // Port Pullups DDRD = 0x00; // Port Eingang PORTD = 0xFF; // Port Pullups DDRE = 0x00; // Port Eingang PORTE = 0xFF; // Port Pullup DDRF = 0x00; // Port Eingang AD Wandler //PORTF = 0xFF; // Port Pullup DDRG = 0x00; // Port Eingang PORTG = 0x1F; // Port Pullup /* Timer1 MCU/1024 */ TCCR1B = _BV (CS12) | _BV (CS00); /* Timer1 Overflow */ TIMSK = _BV (TOIE1); } void adinit (void) { // ADEN enable, ADSC start, ADFR free running, ADSP2,1,0 MCU/128 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); } //Hauptprogramm int main (void) { //Initzialisierung ioinit(); //Ports und Timer setzen adinit(); //AD Wandler setzen //Initzialisierung des LCD - Displays LCD_Init(); // 1. Zeile 5x16 Dots, 2. Zeile 5x8 Dots Write_LCD(0x2E,0); //Function set DH=1,N=1,Tabelle 1,0 Write_LCD(0x18,0); //Tabelle 1,0, UD=1 LCD_Clear (); LCD_Print(0,4,"Irgendwas"); LCD_Print(1,3,"und nochwas"); //Schleife for (int a=0;a<30000;a++) { for (int b=0;b<10000;b++); } LCD_Clear (); sei (); //Hauptprogramm läuft ständig in einer schleife und macht nichts for(;;); } SIGNAL(SIG_OVERFLOW1) { if(AD_Kanal_Zaehler > 4) { AD_Kanal_Zaehler = 0; } AD_Kanal_Zaehler ++; switch (AD_Kanal_Zaehler) //welcher AD Kanal soll gelesen werden { //case 1 : //ADMUX = 0x40; //AD Kanal 0 FP_Chk //FP_Chk = 0; //break; case 1 : ADMUX = 0x41; //AD Kanal 1 RC_SPLY ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) RC_Sply = ADC; //ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) RC_Sply_1 = RC_Sply; //RC_Sply /= 1.69; // V errechnen break; case 2 : ADMUX = 0x42; //AD Kanal 2 ECU_Sply ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) ECU_Sply = ADC; //ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) ECU_Sply_1 = ECU_Sply; //ECU_Sply /= 1.69; // V errechnen break; case 3 : ADMUX = 0x43; //AD Kanal 3 AMB_Temp ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) AMB_Temp = ADC; //ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) AMB_Temp_1 = AMB_Temp; //AMB_Temp /= 1.69; // °C errechnen break; case 4 : ADMUX = 0x44; //AD Kanal 4 EGT ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) EGT = ADC; //ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) EGT_1 = EGT; break; case 5 : ADMUX = 0x45; //AD Kanal 5 Oil_Temp ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion" while(!(ADCSRA & (1<<ADIF))); // auf Abschluss der Konvertierung warten (ADIF-bit) Oil_Temp = ADC; //ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2) Oil_Temp_1 = Oil_Temp; break; //case 7 : //ADMUX = 0x46; //AD Kanal 6 Aux1_Emk //Aux1_Emk = 0; //break; //case 8 : //ADMUX = 0x47; //AD Kanal 7 Anlg_Aux //Anlg_Aux = 0; //break; } // LCD Init 3 Zeilen 5x8 Dots Write_LCD(0x29,0); //Function set DH=0,N=1,Tabelle 1,0 LCD_Clear (); LCD_Print(0,0,"AD Wert: %4i",ADC); LCD_Print(1,0,"AD Kanal: %1i",AD_Kanal_Zaehler); //LCD_Print(2,0,"AD Wert: %5i",ADC); PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB |= (1 << PB3); // grüne LED aus Bit setzen switch (AD_Kanal_Zaehler) //welcher AD Kanal soll gelesen werden { //case 1 : //LCD_Print(2,0,"Fuel Pump Check"); //PORTB &= ~(1 << PB0); // rote LED an Bit löschen //PORTB |= (1 << PB2); // gelbe LED aus Bit setzen //PORTB |= (1 << PB3); // grüne LED aus Bit setzen //break; case 1 : //LCD_Print(2,0,"RC Spannung"); RC_Sply_1 /= 0.646; // V errechnen LCD_Print(2,0,"RC U: %3i mV",RC_Sply_1); PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB &= ~(1 << PB3); // grüne LED an Bit löschen break; case 2 : //LCD_Print(2,0,"ECU Spannung"); ECU_Sply_1 /= 0.361; // V errechnen LCD_Print(2,0,"ECU U: %4i mV",ECU_Sply_1); PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB &= ~(1 << PB3); // grüne LED an Bit löschen break; case 3 : //LCD_Print(2,0,"AMB Temperatur"AMB_Temp); AMB_Temp_1 /= 1.477; // °C errechnen LCD_Print(2,0,"AMB Temp: %2i%cC",AMB_Temp_1,0xDF); // Wert(int),°(c 0xDF),C, temp_2,0xDF,C PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB &= ~(1 << PB3); // grüne LED an Bit löschen break; case 4 : LCD_Print(2,0,"EGT"); PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB &= ~(1 << PB3); // grüne LED an Bit löschen break; case 5 : LCD_Print(2,0,"Oil Temperatur"); PORTB |= (1 << PB0); // rote LED aus Bit setzen PORTB |= (1 << PB2); // gelbe LED aus Bit setzen PORTB &= ~(1 << PB3); // grüne LED an Bit löschen break; //case 7 : //LCD_Print(2,0,"AUX 1 EMK"); //PORTB &= ~(1 << PB0); // rote LED an Bit löschen //PORTB |= (1 << PB2); // gelbe LED aus Bit setzen //PORTB |= (1 << PB3); // grüne LED aus Bit setzen //break; //case 8 : //LCD_Print(2,0,"Analog AUX"); //PORTB &= ~(1 << PB0); // rote LED an Bit löschen //PORTB |= (1 << PB2); // gelbe LED aus Bit setzen //PORTB |= (1 << PB3); // grüne LED aus Bit setzen //break; } //int temp_1 = 0; //int temp_2 = 0; //temp_1 = ADC; //temp_1 /= 1.69; //temp_2 = ADC; //temp_2 /= 17; //batt_1 = ADC/0.0635; //batt_1 = ADC/0.633; // mV //batt_11 = ADC / 63; // V ganze Zahl //batt_12 = ADC % 63; // V Komma Stellen //batt_2 = ADC/0.633; // mV //batt_21 = ADC / 63; // V ganze Zahl //batt_22 = (ADC % 63)/10; // V Komma Stellen //temp_1 = ADC % 62; //batt_2 = (batt_1 % 6333) / 100; // V Komma Stellen //temp_1 = ADC ; // 3 Zeilen 5x8 Dots //Write_LCD(0x29,0); //Function set DH=0,N=1,Tabelle 1,0 //LCD_Print(0,0,"AD Wert: %5i",ADC); //LCD_Print(1,0,"Temp Wert: %3i",temp_1); //LCD_Print(2,0,"Temperatur: %2i C",temp_2); //LCD_Print(2,0,"Temperatur: %2i%cC",temp_2,0xDF); // Wert(int),°(c 0xDF),C, temp_2,0xDF,C for (int a=0;a<6000;a++) { for (int b=0;b<2000;b++); } } Gruß Toby
Moin! Tschuldigung, das ich störe, aber kennt jemand eine deutsch- oder englischsprachige Homepage, die aussagt, welche Pins auf high und welche auf low gesetzt sein müssen um ein Display anzusprechen (für Initialisierung und Darstellung von Text)? Ich wäre sehr dankbar, da ich leider keine Finde :-( Für ein Projekt in der Schule! Danke <shoo:bo>
Hallo, ist nich die seite von Ulrich radig auf Deutsch? Ich meine, da steht etwas über die Steuerleitungen. Kann mich aber auch irren. Gruß Toby
Das Display läuft bei mir, aber ich habe es nicht geschafft nachträglich den Kontrast zu verändern. Weiss jemand wass man da senden muss? Habe für folgende beiden write-Befehle verschiedene Werte ausprobiert. Aber der Kontrasst ist immer gleich. _lcd_write_data(0x78); //Senden des Contrast SET _long_delay(); _lcd_write_data(0x55); //Senden des Power/ICON/Conrast control _long_delay(); Ich weiss zusätzlich auch nicht wass es mit diesem "Follower Control" auf sich hat. Vielleicht hat das auch einen Einfluss? _lcd_write_data(0x6E); //Senden des Follower control _long_delay(); Gruss Ralph
Hallo. Ich versuche derzeit auch ein LCD-Displ. mit einem ST7036-Controller zum Laufen zu bringen. Bisher leider erfolglos :( Ich werde es nun mit dem von Tobias Tetzlaff veröffentlichten Programm versuchen. Dabei stellt sich mir jedoch eine Frage. In der Datei lcd.h steht in Zeile 26 als Anmerkung, dass LCD_D0 bis LCD_D3 auf gnd geschlossen gehören. Im Datenblatt steht jeoch, dass diese auf VDD geschlossen werden müssen. Funktioniert hier beides, oder handelt es sich hierbei um einen kleinen Tippfehler? LG Harry
Hallo, das ist wirklich ein Tippfehler. D0-D3 müssen auf VDD. Ich habe übrigens auch mal die LCD Lib für CodeVision umgeschrieben. Damit kann man den Kontrast und die Zeilenhöhe (Double High) ändern. Gruß Toby
Hallo, bin auch gerade am mühen das DOG-M 162 zum Laufen zu bringen. Leider bleibt das Display bisher dunkel. Auch der Versuch mit Toby's DOG.c brachte keinen Erfolg. Hat jmd. von Euch ein *.hex file für den Mega8 zum Testen? will nur wissen ob das Display defekt ist. Gruß Dani
OK, jetzt läufts. War ein timer Problem. Danke an Wolfram Hildebrandt für die Hilfe. Gruß Dani
hallo es ist lange her, aber die Probleme bestehen immernoch wollte fragen Ich habe ST7036 EA-DOG mit CortexM3 kann man code von Rainer dort verwenden was sollte ich da ändern (HelloWorld) Ausgabe dankeschön
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.