Hat schomal jemand mal versucht die EA DOG-M LCD´s anzusteuern. So recht will das nicht klappen. Normale LCD-Routinen scheinen da nicht zu funktionieren
Ansteuerbeispiel würde mich auch interessieren. Es ist offenbar ein neuer LCD Controller
Ja, ein ST7036 - Datenblatt hier: http://www.electronic-assembly.de/eng/pdf/zubehoer/st7036.pdf Allerdings (Zitat aus Datenblatt) "Instruction compatible to ST7066U and KS0066U and HD44780" Daher sollten normale Ansteuerungsroutinen funktionieren, aber vielleicht steht ja irgendwo im Datenblatt was hilfreiches. Vielleicht ist auch dieser Hinweis hilfreich: "Bitte beachten Sie, dass aufgrund der COG-Technik die Strombelastbarkeit der Ausgänge begrenzt ist. Es kann dadurch bei größerer Buslast zu Signalverschleifungen und unsauberen Pegeln kommen. Im Zweifelsfall sind zusätzliche Pull-Down Widerstände (8051) erforderlich, oder es müssen zusätzliche Waits/NOP's eingefügt werden." Interessant ist übrigens der ST7036I - der hat 'ne I²C-Schnittstelle. Das ist doch mal 'ne wirkliche Neuerung.
Laut Display Beschreibung soll es aber SPI sein. Alles etwas merkwürdig. So recht funktionieren tuts immer noch nicht im 4 Bit-Modus.
Ja, ihr habt recht: es funzt nicht. Ich bekomme zwar einen Text (2 Zeilen / 16 Zeichen) dargestellt aber die ersten 10 Zeichen gehen verloren und nach dem 16ten gibts einen Umbruch - also klappt auch ein Workaround nicht so recht. Irgendwie muss die Cursor-Baseadresse eingestellt werden, da durch auto-increment der LCD-Controller alles selber in der Hand hat. Merkwürdig, eigentlich sollte durch ein Clear Disay automatisch die erste darstellbare Position gesetzt werden. (Habe mich an die Initialisierungsvorgaben aus dem Datenblatt gehalten (Seite 41)).
Es funzt! Wenn nach der Beschreibung des LCD-Controller ST7036.pdf Seite 42 initialisiert wird, dann sollten auch die Zeichen korrekt sichtbar sein. Leider geht das Assembler-Beispiel auf Seite 42 über das hinaus, was auf Seite 41 als Initialisierung aufgeführt wird. Besonders wichtig ist das Timing für Clear Display (2 ms Delay) und Return Home (2 ms Delay). Wenn da etwas schief geht gibts haessliche Effekte.
Hallo, ich versuche das Display mit C zu betrieben, habt ihr eventuell einen funktionierenden C-Code mit dem ich das mal ausprobieren könnte? Wenn nicht würde ich auch gerne mal einen Blick auf den Assembler-Code werfen, weil ich kurz davor bin das Teil aus dem Fenster zu schmeißen.
Hallo, ich habe bereits einen eigenen Thraed eröffnet, gibt es schon neuigkeiten, im bezug auf ansteuerung des DOGM in C ? Gruß Toby
Hallo Also bei mir tut sich überhaupt nichts. Versuche das Display auch in C anzusteuern. Kein Blinken, gar nichts. Hab die I/Os und Enable Leitungen per Oszi herausgemessen. Das scheint OK zu sein. Das Busy Flag muss doch nicht ausgelesen werden, oder? Ich kann doch genauso gut auch eine Zeit abwarten? Verwende das Display im 4-Bit Mode. Laut Datenblatt werden bei der Initialisierung der ersten vier Befehle nur 4Bits übertragen. Bei den weiteren Befehlen ein ganzes Byte (dabei die oberen 4Bits als Daten und die unteren 4 Bits als don't care). Hab ich da irgendwo einen Denkfehler? Hab zusätzliche Zeiten und NOPs eingefügt; ZWECKLOS ! Hoffe Ihr habt mehr Glück! Wäre super wenn es hier ein paar Vorschläge in C geben würde :) Grüße Rainer
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
Hallo Leute, habe hier einmal meine Init-Routine in BASCOM-AVR gepostet. So ganz glücklich bin ich aber mit dem Diaplay auch nicht. Ich habe auch die serielle Funktion erfolgreich erprobt. Nachteilig ist (wenn man in BASCOM programmiert) daß die schönen LCD Befehle nicht funktionieren. Deshalb bin ich wieder zum 4 Bit Modus zurückgegangen. Es funktionieren CLS und UPPERLINE sowie LOCATE. Mehr habe ich noch nicht ausprobiert. Ab und zu verrutscht der Text um ein Zeichen nach rechts - weiß jemand warum? Viele Grüße Robert Mayr '-------------------------------------------------------------------- '***************** Initialisiere LC-Display (16*3) ****************** '-------------------------------------------------------------------- Initlcd: En = 0 : Rs = 0 For A = 1 To 3 Portd = &B00110000 '&3 Gosub Enbl Waitms 2 Next A For A = 1 To 2 Portd = &B00100000 '&2 Gosub Enbl Waitms 1 Next A '-------------------------------------------------------------------- Portd = &B10010000 '&9 Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B00010000 '&1 Gosub Enbl Waitms 1 Portd = &B11010000 '&D Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B01010000 '&5 Gosub Enbl Waitms 1 Portd = &B00000000 '&0 Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B01100000 '&6 Gosub Enbl Waitms 1 Portd = &B11000000 '&C Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B01110000 '&7 Gosub Enbl Waitms 1 Portd = &B11000000 '&C Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B00000000 '&0 Gosub Enbl Waitms 1 Portd = &B11110000 '&F Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B00000000 '&0 Gosub Enbl Waitms 1 Portd = &B00010000 '&1 Gosub Enbl Waitms 1 '-------------------------------------------------------------------- Portd = &B00000000 '&0 Gosub Enbl Waitms 1 Portd = &B01100000 '&6 Gosub Enbl Waitms 1 Cursor Off Noblink 'hide cursor Return '----------------- Initialisierung fertig --------------------------- Enbl: En = 1 'mach EN 1 En = 0 'und gleich wieder 0 Return
Mein DOG-M 162 bekomme ich unter Bascom im 4bit modus und 5V einfach nicht zum laufen. Das Display zeigt einfach nichts an. Alle möglichen Inits durchprobiert - nichts. Im SPI Modus hatte ich manchmal ein paar wirre zeichen, aber sonst nichts. Gibts evtl. schon was neues für Bascom ? @Robert Mayr: Kannst Du mal den gesamten Code hier reinstellen ? Bzw. den Code wie Du Dein DOG-M über SPI initialiert hast ? Ich dreh bald durch :-) Danke Holger
Funktioniert doch perfekt :-) $regfile = "m168def.dat" 'ATmega168 $crystal = 1000000 'Quarz: 1 MHz Config Portc = Output 'DOG 162, 4bit, 5 Volt 'Portc.0 = D4 'Portc.1 = D5 'Portc.2 = D6 'Portc.3 = D7 'Portc.4 = E 'Portc.5 = RS ' ---------------------- LCD DOG162 Init --------------------- Dog: Portc = &B00000011 : Gosub Enbl : Waitms 2 ' dummy Funktion Set Portc = &B00000011 : Gosub Enbl : Waitms 2 ' dummy Funktion Set Portc = &B00000011 : Gosub Enbl : Waitms 2 ' dummy Funktion Set Portc = &B00000010 : Gosub Enbl : Waitms 1 ' dummy Funktion Set Portc = &B00000010 : Gosub Enbl : Waitms 1 ' Funktion Set 1 Portc = &B00001001 : Gosub Enbl : Waitms 1 ' Funktion Set 2 Portc = &B00000001 : Gosub Enbl : Waitms 1 ' Bias 1 Portc = &B00001100 : Gosub Enbl : Waitms 1 ' Bias 2 Portc = &H5 : Gosub Enbl : Waitms 1 'Power/Icon/Contrast 1 Portc = &H2 : Gosub Enbl : Waitms 1 'Power/Icon/Contrast 2 Portc = &H6 : Gosub Enbl : Waitms 1 ' Follower control 1 Portc = &H9 : Gosub Enbl : Waitms 1 ' Follower control 2 Portc = &H7 : Gosub Enbl : Waitms 1 ' Contrast Set 1 Portc = &H4 : Gosub Enbl : Waitms 1 ' Contrast Set 2 Portc = &B00000000 : Gosub Enbl : Waitms 1 ' Display On 1 Portc = &B00001111 : Gosub Enbl : Waitms 1 ' Display On 2 Portc = &B00000000 : Gosub Enbl : Waitms 1 ' Clear Display 1 Portc = &B00000001 : Gosub Enbl : Waitms 2 ' Clear Display 2 Portc = &B00000000 : Gosub Enbl : Waitms 1 ' Entry Mode Set 1 Portc = &B00000110 : Gosub Enbl : Waitms 1 ' Entry Mode Set 2 Portc = &B00000000 Return Enbl: ' Enable ein Set Portc.4 Waitus 400 ' Enable aus Reset Portc.4 Return
Etwas kürzer: $regfile = "m168def.dat" 'ATmega168 $crystal = 1000000 'Quarz: 1 MHz Config Portc = Output 'DOG 162, 4bit, 5 Volt 'Portc.0 = D4 'Portc.1 = D5 'Portc.2 = D6 'Portc.3 = D7 'Portc.4 = E 'Portc.5 = RS Dog: Restore Da For Wertx = 1 To 20 Read Balken Portc = Balken : Waitms 2 Set Portc.4 Waitus 400 Reset Portc.4 Next Wertx Return Da: Data &H3 , &H3 , &H3 , &H2 , &H2 , &H9 , &H1 , &HC , &H5 , &H2 Data &H6 , &H9 , &H7 , &H4 , &H0 , &HF , &H0 , &H1 , &H0 , &H6
An Holger, also nachfolgend der Code zur seriellen Ansteuerung. Sorry, daß es etwas gedauert hat. War längere Zeit unterwegs. Grüße Robert '-------------------------------------------------------------------- ' Autor: Robert Mayr '-------------------------------------------------------------------- $regfile = "m8def.dat" $crystal = 1000000 '-------------------------------------------------------------------- '******* Konfiguration PortB 0,1,2 zur LC-Ausgabe mit DOGM162 ******* '-------------------------------------------------------------------- Ddrb = &B00000111 'Pin PB0 und PB1 und PB2 ist Ausgang (E+RS+CSB) Portb = &B00000111 'PullUp von PB0 und PB1 und PB2 aktivieren Dim W As Word , Kanal As Byte , J As Byte Dim Zaehler As Integer , Targ As String * 6 , S As Single Dim Text As String * 16 Dim Ausgabe(16) As Byte At Text Overlay Dim H As Single , A As Single , V As Bit Dim X(3) As Word , I As Byte '-------------------------------------------------------------------- '********* vor allem anderen, gebe was auf das Display Gosub Lcinit Gosub Intro 'Startbildschirm End 'end program Schiebe: Reset Portb.2 'CSB auf 0 Shiftout Si , Clk , J , 1 , 8 , 10 'schiebe 8 bits mit der steigenden Flanke und 10us Delay raus Set Portb.2 'CSB auf 1 Return '-------------------------------------------------------------------- '******* Hier wird die erste Meldung aufs Display gezaubert ********* '-------------------------------------------------------------------- Intro: 'Cls 'clear the LCD display 'Cursor Off Text = " TEXT TEXT TEXT " 'display this at the top line Gosub Textaus 'Lowerline 'select the lower line Text = " TEXT TEXT TEXT " 'display this at the lower line Gosub Textaus Text = "ser. Ansteuerung" 'display this at the lower line Gosub Textaus Wait 2 Return '-------------------------------------------------------------------- '********************** Textausgabe auf Disolay ********************* '-------------------------------------------------------------------- Textaus: Set Portb.1 'RS auf 1 For I = 1 To 16 J = Ausgabe(i) Gosub Schiebe Next I Return '-------------------------------------------------------------------- '********************** Initialisiere LC-Display ******************** '-------------------------------------------------------------------- Lcinit: Set Portb.0 'EN=1 Clk = 1 'CLK=1 Csb = 1 'CSB auf 1 Rs = 0 'RS auf 0 Csb = 0 'CSB auf 0 'Initialisiere LCD J = &H39 : Gosub Schiebe J = &H1D : Gosub Schiebe J = &H50 : Gosub Schiebe J = &H6C : Gosub Schiebe J = &H7C : Gosub Schiebe J = &H0F : Gosub Schiebe J = &H01 : Gosub Schiebe J = &H06 : Gosub Schiebe Set Portb.2 'CSB auf 1 Return
Bei mir läuft das Zweizeilen Display nun auch. Nach mehreren Versuchen und Misserfolgen und vielen Neuprogrammierungen ist dabei Code herausgekommen für: DOGM162 (2 Zeilen) - in C - in AVR Assembler (8-Bit und 4-Bit) - in PIC Assembler (8-Bit und 4-Bit) Netterweise lag es gar nicht an der Software, aber gerade an der habe ich lange gebastelt, was die vielen Konvertierungen zeigen. Ein Steckkontakt einer billigen Buchsenleiste war wohl defekt. Naja, solange es jetzt läuft.
eine AVR C Version für SPI ist jetzt ebenfalls vorhanden. (Die erfordert übrigens einen echten Hardwarereset. Die 4 und 8 Bit Modi jedoch nicht. Habe ich zuerst nicht bemerkt.)
Hall, ich möchte das DOGM162 im SPI mode und bei 3v3 betreiben. Mit den Unterlagen komm ich nicht zurecht. Wer kann mit C code senden der das Teil richtig initialisiert... Was sind denn bei dem Teil die Fußangeln ?? Dank für euere Hilfe !
Hallo Wolfran, könntest Du deinen Code zur Ansteuerung des DOGM mal posten? Gruß Toby
wisst ihr denn die pinbelegung der dinger? im datenblatt sind gerade mal 2 pins angegeben, aber die richtung, in der man zählen soll steht nicht da. alles in allem ein schlechtes datenblatt, wenn man da nicht die pinbelegung rauslesen kann. mein display zeigt auch rein gar nichts an, obwohl ich es so angeschlossen habe, wie es das datenblatt unter "Beispiele mit 8 Bit, 5 V" zeigt (oder ich denke zumindest, dass ich das display richtig angeschlossen habe). kann mir da jemand mal die pinnummern sagen? das wäre echt toll. muss ich befürchten, dass ich das display geschrottet hab, wenn ich Vcc und GND an den falschen pins angelegt habe? und: von www.electrosofts.com habe ich ein programm, mit dem man lc-displays über den rechner ansteuern kann. es funzt mit allen, nur das dog-m lässt sich zu nichts bewegen. wenn mir da einer helfen könnt wär das genial. grüsse
Die Pinbelegung steht sehr wohl im Datenblatt. Auf der letzten Seite des Herstellerdatenblatts bei den Abmessungen sind die Nummern eingetragen.
Hallo, achte bitte darauf, dass auch die übrigen Pin`s verschaltet sind. Ich habe das 3 zeilige im SPI Modus in Betrieb. Füge eventuell einige Wait`s in die Init ein. Das Disp. braucht ca. 40-50 ms inittime. Gruß Herbert
vielen dank für den tipp. noch ne frage, etwas ist mir nicht ganz klar: wenn ich das display im 4 Bit-modus betreibe, muss ich immer erst das high nibble ausgeben, enable ein- und wieder ausschaten und dann das low nibble ausgeben oder?? da bin ich mir nicht ganz sicher. ich habs leider noch nicht ausprobieren können, weil ich das display nur im 8 Bit-modus am pc anschliessen kann. gruss
Hat denn jemand mittlerweile nen Code für Assembler für dieses Display? Wolfram könntest Du deinen Code eventuell mal posten? Wäre sehr nett und hilfreich! Vielen Dank schonmal dafür! Gruß Thomas
Habe ich schon in einem anderen Thread gepostet. Hier ist er aber noch einmal.
Danke hatte ich bisher noch nicht gefunden. Werds aber mal suchen und mir anschauen. Ich melde mich dann wieder :-) MfG Michael
Hi, hat jemand ein funktionierendes Script für Bascom und SPI 5V mode. Der Oben gepostete Quellcode funktioniert bei mir nicht. gruss
Mein SPI Code sollte soweit aber laufen. Bei SPI muss man einen echten Hardwarereset machen, d.h. nach jedem Programmieren, einmal komplett die Spannung wegnehmen. Wenn es auch ein 16char, zeiliges Display ist, würde ich prüfen, ob die Hardware richtig angeschlossen ist. Das Datenblatt erzählt hier und da Mist. Das sind aber offensichtliche Dinge (die haben bei SPI den C/D-Pin nicht beschaltet, dafür einen anderen, meine ich).
Ja es ist ein 2*16 Bascom meckert z.B. bei fogenden Zeilen mit 114 Assignment Error. Clk = 1 Csb = 1 Rs = 0 Csb = 0 könntest du deine Pinbelegung bekannt geben wie sie richtig ist, also z.b. pin 26 auf portb.0?! ich verzweifle an dem Teil.
Bin jetzt mittlerweile mal auf 8 bit umgestiegen um deinen Code zu probieren aber das funktioniert leider auch nicht. Keine Ahnung was ich falsch mache oder warum es eben nicht geht. Weil ich hardwaremäßig alles schon zick mal kontrolliert habe und einfach keinen Fehler finden kann... Jemand noch ähnliche Probleme und im optimalfall noch ne Lösung dazu? :-) Wäre sehr dankbar dafür weil ich langsam echt am verzweifeln bin mit diesem Display. MfG Michael
Hier ist ein pdf für die 5V 8 Bit Ansteuerung für meinen AVR Assembler 8Bit 5V 16 Char Display Code. Da kommt jetzt einfach an PORTD0 D0 vom Display usw. PORTC0 = Display E PORTC1 = Display RW PORTC2 = Display RS @ Michael: Der 8 Bit Code ist der einfachste. Bleib mal dabei, bis es läuft und wechsel nicht alle 5 Min. herum. Du schreibst auch in zwei Beiträgen parallel, oder? Wenn es mit mit der Pinbelegung von oben nicht funktioniert, reiss das ganze Display ab, und mache einen neuen Schaltplan, den du hier postest. Dann noch mal alles von neuem aufbauen. Wie sieht es mit dem AVR aus? Läuft der? Lass einen Pin mal einfach an und ausschalten und messe, ob das funktioniert.
Leck mich am A**** es läuft :-) Aber frag nich was los war.... Hab jetzt alles auseindandergebaut und neu zusammen gebaut und es funzt. Muss wohl irgendwo in der Beschaltung ein Fehler gewesen sein obwohl ich alles durchgepipst hatte. Naja wie gesagt wahrscheinlich vor lauter Bäumen den Wald nicht mehr gesehen! Vielen vielen Dank! Oh mann das waren wieder ein paar graue Haare mehr^^
Und da bin ich nochmal :-) Also wie gesagt das Display läuft mittlerweile einwandfrei und ich hab jetzt mal bisschen damit rumgespielt. Funzt alles...bei 1Mhz ! Jetzt wollte ich das Display für eine andere Anwendung nutzen bei welcher ich den µC auf 4Mhz laufen lasse. In der Intialisierung für das Display habe ich dann das timing geändert und nops eingefügt aber es läuft nicht mehr. Klar das es ein timing Problem ist^^ aber hab jetzt auch schon wieder rum probiert und rum probiert und ich weiss nicht welche Stelle da genau Ärger macht. Weisst du wo ich besonders auf timing achten muss? Oder besser noch...hast du deinen Code auch für 4 Mhz ;-) Danke schonmal! MfG Michael
Ich habe es in Anlehnung an das Datenblatt vom ST7036 nocheinmal in Bascom probiert, aber es läuft einfach nicht. Im 4 & 8 Bit-Mode habe ich das Display direkt auf gang gekriegt, aber mit SPI will es nicht. Hat einer von euch eine Ahnung was ich falsch mache?!
Hallo, bin gerade auch am Verzfeifeln. Betreibe das Display im einfachsten Modus. 8Bit Leider gibt es kein einiges Zeichen aus. Bin um jede Hilfe dankbar!!! Meine Initialisierung lautet wie folgt: #define LCD_Display_OFF_Cursor_OFF_Blinking_OFF 0x08 #define LCD_Display_ON_Cursor_OFF_Blinking_OFF 0x0C #define LCD_Inc_Add_NO_Scroll 0x06 #define LCD_Cursor_OFF 0x08 #define LCD_Display_ON 0x04 #define LCD_Clear_Display 0x01 #define LCD_8Bit_2Line 0x38 #define OSC_Frequency 0x14 #define Contrast 0x78 #define PowerICON 0x5E #define FOLLOVER_CONTROL 0x6A #define CLEAR_LCD 0x01 DIG_Out_Prt (4, 0, 255); //D0-D7 == 1 DIG_Out_Line (4, 1, 0, 0); //Adressbytes RS DIG_Out_Line (4, 1, 1, 0); //Adressbytes RW DIG_Out_Line (4, 1, 2, 0); //Enable LCD Delay (0.005); LCD_Send_Cmd(LCD_8Bit_2Line); //(1) // Funtion SET Delay (0.005); LCD_Send_Cmd(LCD_8Bit_2Line); //(2) // Funtion SET Delay (0.005); LCD_Send_Cmd(OSC_Frequency); // Internal OSC Frequency Delay (0.005); LCD_Send_Cmd(Contrast); // Contrast Set Delay (0.005); LCD_Send_Cmd(PowerICON); // Power/ICON/Contrast control Delay (0.005); LCD_Send_Cmd(FOLLOVER_CONTROL); // Follower Control Delay (0.005); LCD_Send_Cmd(LCD_Display_ON_Cursor_OFF_Blinking_OFF); // Display O N/OFF Delay (0.005); LCD_Send_Cmd(CLEAR_LCD); // Clear Display
...aber versucht nicht, im SPI-Modus zu Lesen, das funktioniert nämlich nicht.
CONFIG LCD = LCDtype , CHIPSET=KS077 | Dogm163v5 | DOG163V3 | DOG162V5 | DOG162V3 [,CONTRAST=value]
Hallo ! Bin am verzweifeln. Betreibe ein Dog 162 unter Bascom mit mega8. Habe schon die ganzen Initialisierungsroutinen probiert, bekomme aber keine Anzeige aufs display. Habe zuerst versucht über i2c zu betreiben und bin jetzt im 4 bit 5V Modus. Ich sehe nicht mal bei der Initialisierung etwas. Da tut sich rein gar nix. Kann mir von euch bitte jemand einen Bascom Code geben, mit dem ich initialisiere und anschließend einfach nur etwas aus display schreiben kann. Bin mir nichtmal sicher, ob das Display nach den vielen Versuchen nicht schon kaputt ist. Meine Ports: Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5 Danke schonmal im Vorraus. Gruß Tommy
Hat sich erledigt ! Habs endlich geschafft !!! Lag wohl an der Kontrasteinstellung ! Gruß Tommy
Hier ein funktionierendes BASCOM - Beispiel per SPI:
1 | '-------------------------------------------------------------------- |
2 | ' DOGM 162 LCD per SPI in BASCOM |
3 | '-------------------------------------------------------------------- |
4 | $regfile = "m8def.dat" |
5 | $crystal = 1000000 '1Mhz |
6 | '$crystal = 8000000 'oder 8Mhz |
7 | '-------------------------------------------------------------------- |
8 | Dim Lcd_ausgabe_text As String * 16 |
9 | Dim Lcd_ausgabe_text_bitwise(16) As Byte At Lcd_ausgabe_text Overlay |
10 | Declare Sub Dogm_lowerline |
11 | Declare Sub Dogm_init |
12 | Declare Sub Dogm_write |
13 | Declare Sub Dogm_pushbyte(byval Pushbyte As Byte) |
14 | Byval Lcd_ascii As Byte , Byval Write_byte As Byte) |
15 | Declare Sub Dogm_clear |
16 | |
17 | Ddrb = &B11111111 'Port B alles auf Ausgang |
18 | Portb = &B11111111 'Alle Pullups ran |
19 | Rs Alias Portb.1 'Verkabelung = Selbsterklärend... |
20 | Csb Alias Portb.2 |
21 | Si Alias Portb.3 |
22 | Clk Alias Portb.4 |
23 | |
24 | '-------------------------------------------------------------------- |
25 | Dogm_init |
26 | Do |
27 | Lcd_ausgabe_text = "Zeile 1 xxxxxxxx" |
28 | Dogm_write |
29 | Wait 1 |
30 | 'Reset Rs = Steuerzeichen senden |
31 | 'Set RS = Text senden |
32 | 'Cursorposition: &H80 = Zeile 1, Position 1 / &HC0 = Zeile 2, Position 1 |
33 | Reset Rs : Dogm_pushbyte &HC0 + 5 'Zeile 2, Position 5 |
34 | 'Dogm_lowerline |
35 | Lcd_ausgabe_text = "Zeile 2 xxxxxxxx" |
36 | Dogm_write |
37 | Wait 2 |
38 | Dogm_clear |
39 | Wait 2 |
40 | Loop |
41 | End 'end program |
42 | |
43 | '- Subs ------------------------------------------------------------------- |
44 | Sub Dogm_clear |
45 | Reset Rs 'Command wird gesendet |
46 | Dogm_pushbyte &H01 'Clear senden |
47 | Waitms 2 'Timeout abwarten |
48 | End Sub |
49 | |
50 | Sub Dogm_lowerline |
51 | Reset Rs 'Command wird gesendet |
52 | Dogm_pushbyte &HC0 ' Cursorposition setzen |
53 | End Sub |
54 | |
55 | Sub Dogm_write |
56 | Local Dogm_zaehler As Byte |
57 | Set Rs 'Text wird gesendet |
58 | For Dogm_zaehler = 1 To 16 |
59 | Dogm_pushbyte Lcd_ausgabe_text_bitwise(dogm_zaehler) |
60 | Next Dogm_zaehler |
61 | End Sub |
62 | |
63 | Sub Dogm_pushbyte(byval Pushbyte As Byte) |
64 | Reset Csb |
65 | Shiftout Si , Clk , Pushbyte , 1 , 8 , 10 |
66 | Set Csb |
67 | End Sub |
68 | |
69 | Sub Dogm_init |
70 | Set Clk |
71 | Set Csb |
72 | Reset Rs |
73 | Waitms 40 |
74 | Reset Csb |
75 | Dogm_pushbyte &H38 : Waitus 30 'function set |
76 | Dogm_pushbyte &H39 : Waitus 30 'function set |
77 | Dogm_pushbyte &H1C : Waitus 30 'BIAS |
78 | Dogm_pushbyte &H53 : Waitus 30 '3V-Booster aus, power control |
79 | Dogm_pushbyte &H69 : Waitms 200 'Follover-Control |
80 | Dogm_pushbyte &H74 : Waitus 30 'Contrast Set |
81 | Dogm_pushbyte &H0C : Waitus 30 'Display on,Cursor off |
82 | 'Dogm_pushbyte &H0F : Waitus 30 'Display ein, Cursor ein, Cursor blinken |
83 | Dogm_pushbyte &H01 : Waitms 2 'Clear Display |
84 | Dogm_pushbyte &H06 : Waitus 30 'entry mode auto increment |
85 | Set Csb |
86 | End Sub |
Gruß, Ralf.
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.