Da ich bereits mehrere Tage mit der Suche beschäftigt bin, bin ich der Kapitulation langsam nahe. Ich möchte ein DOG-M163 an einem ATMega32 im 4bit Modus betreiben. Habe bereits einige Beispiele versucht anzupassen, jedoch ohne Erfolg. Die Pinbelegung: D7 -> PC5 D6 -> PC4 D5 -> PC3 D4 -> PC2 E -> PC6 RS -> PC7 Programmiert wird mit dem AVR Studio 4.18 und einem STK500 in GCC. Ist nicht mein erstes Projekt, aber gewinne das Gefühl als wäre es so. Mit Bascom habe ich bereis einige Sachen am Laufen gehabt, nun möchte ich in C Programmieren. Wäre sehr erfreut wenn mir jemand mit einem fuktionierenden Beispiel unter die Arme greifen könnte.
Ist die Initialisierung des Display-Controllers OK? Wenn es nicht der "Standard-Controller" ist, kann es hieran liegen. Im Datenblatt des Kontrollers ist die Initialisierung i.d.R. recht gut beschrieben, im Datenblatt zum Display oft recht dürftig. Ich hatte da acuh schon mal ein Problem mit dem EA DIP204-4; statt des HD44780 ist ein KS0073 verbaut, zwar "fast" 100% kompatibel, aber eben nur fast.... Das Datenblatt zum Controller KS0073 half dann wenigsten weiter. Nur so als Tip.
Hier mal ein Beispiel im SPI-Mode: Beitrag "Re: Dog-M / ST7036 Routine für 1-Zeiliges Display SPI-Mode" Peter
Hallo Ich betreibe es im 4-Bit ,3-Zeilen ,5-Volt Modus Ich hoffe ich kann dir damit helfen. Ich habe 2 Wochen gebraucht bis es ging es lag an der Initializierung sie stimmt nicht mit dem Datenblatt überein. Gruss HB
Herbert Brandl schrieb: > Ich habe 2 Wochen gebraucht bis es ging es lag an der Initializierung > sie stimmt nicht mit dem Datenblatt überein. Vielleicht bist aber Du der Geisterfahrer und nicht die 10.000, die Dir entgegenkommen. In Deinen Init fehlt das 2-malige Setzen des 8Bit-Mode mit entsprechenden Delays. So kanns nur zufällig gehen. Peter
Herbert Brandl schrieb: > Hallo > > Ich betreibe es im 4-Bit ,3-Zeilen ,5-Volt Modus > > Ich hoffe ich kann dir damit helfen. > Ich habe 2 Wochen gebraucht bis es ging es lag an der Initializierung > sie stimmt nicht mit dem Datenblatt überein. > > Gruss > HB Ich danke vielmals für das Beispiel, aber ich komm nicht ganz klar damit. ../dogm.c:18: error: 'zeit' undeclared (first use in this function) habe beide Dateien eingebunden. Bindest du noch etwas anderes ein?
das ganze ist auch bei mir noch in der Versuchsphase deklariere die Variable "zeit" einfach als volatile unsigned int... in deinem Hauptprogramm dann sehen wir weiter ob noch mehr fehler auftauchen..
Die zeit wird dann noch in einem Timerinterrupt (1ms) hochgezählt... #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF void timer0_ovf_isr(void) { TCNT0 = 0x06; //reload counter value zeit++; } Timerinit sieht so aus ....für atmega128 16Mhz //TIMER0 initialize - prescale:32 // WGM: Normal // desired value: 1mSec // actual value: 1,000mSec (0,0%) void timer0_init(void) { TCCR0 = 0x00; //stop ASSR = 0x00; //set async mode TCNT0 = 0x06; //set count OCR0 = 0xFA; TCCR0 = 0x03; //start timer } Die interrupt Handler musst du für GCC anpassen ich programmier mit ICCAVR
Anbei ein funktionierendes, sehr simples Beispiel fuer den 4 bit Modus mit 5V und dreizeiligem Display. Wenn der Code nicht out of the box funktioniert, ist es ein Hardware Problem.
huibu schrieb: > Anbei ein funktionierendes, sehr simples Beispiel fuer den 4 bit Modus > mit 5V und dreizeiligem Display. > > Wenn der Code nicht out of the box funktioniert, ist es ein Hardware > Problem. Hallo huibu, ich danke dir für das Beispiel, jedoch kann es meiner Meinung nach nicht funktionieren, da ich andere PINS /PORT benutze. Natürlich kann ich die definierten PINS einfach anderst definieren. Wie auch den genutzten PORT, jedoch ist in meiner Hardware der Port nicht von 0 bis 3 sondern von 2 bis 5 genutzt. Wenn ich es soweit richtig verstanden habe nutzt dein Programm aber im angegebenen PORT die Bits 0 bis 3, wie kann ich dies ändern?
Hi Heiko! Du hast Dein Display am Port C des Atmega32 angeschlossen. Dort sitzt aber auch das JTAG-Interface. Ich wage es kaum zu fragen: hast Du oder hast Du nicht - das JTAG-Interface ausgeschaltet? Wenn nicht, so lassen sich Deine Probleme gut erklären. Gruß Tom
Hallo Tom, ich denke mich darf man das schon noch fragen, aber ich habe das JTAG-Interface ausgeschaltet. Gruß Heiko
Wäre zumindest die PIN definition so korrekt?
1 | // LCD E <--> Pin C6
|
2 | #define PIN_ENABLE PC6
|
3 | // LCD RS <--> Pin C7
|
4 | #define PIN_RS PC7
|
5 | // LCD DB4-DB7 <--> PORTD Bit PD2-PD5
|
6 | #define LCD_PORT PORTC
|
7 | #define LCD_DDR DDRC
|
8 | #define LCD_DB PC2
|
wieso quählst du dich mitm 4bit modus, nimm doch einfach SPI ? kann dir bei bedarf die fertigen routinen für nen 3zeiliges dog-m display mit hardware spi geben (ist für nen at90can128..ggf. musst du die spi register anpassen)
Ich habe eine gegebene Hardware welche ich mit eigener Software betreiben möchte. Daher weiß ich nur, dass es geht, aber nicht wie. Und ich verliere langsam echt die Gedult, denn alles was ich versuche scheitert irgendwie. Ich glaube ich versuche mich in einem neuen Hobby, beispielsweise Bananen schälen, sollte einfacher sein :-(
Heiko Fuchs schrieb: > Die Pinbelegung: > D7 -> PC5 > D6 -> PC4 > D5 -> PC3 > D4 -> PC2 Heiko Fuchs schrieb: > #define LCD_DB PC2 Du hast die Datenleitungen etwas ungünstig an die Portleitungen angeschlossen. Besser wären die Portbits 0..3 oder 4..7. So musst Du die Daten vor der Ausgabe zum LCD jeweils um zwei Positionen nach rechts bzw. links schieben. Was willst Du mit dem #define erreichen? Zeig doch mal deinen Init-Code.
Du kannst ja einfach Code für beliebige Pins nehmen: http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip Oder nimm SPI, geht auch über beliebige Pins. Peter
Hallo Heiko, ich habe selbst die Textdisplays von EA betrieben. Mir fällt auf das Du den R/W nicht angeschlossen hast. Laut Datenblatt ist dies aber erforderlich. Ansonsten überprüf mal Deine Bias Einstellungen. Ich hatte da damals auch meine Probleme mit.
1 | void displayinit (void) |
2 | {
|
3 | // LCD module initialization
|
4 | delay_ms(200); |
5 | lcd_init(16); |
6 | _lcd_write_data(0x29); //4bit Instalationstabelle 1 (Function Set) |
7 | delay_us(40); |
8 | _lcd_ready(); |
9 | _lcd_write_data(0x1C); // BS=1:1/4 FX=0 |
10 | delay_us(40); |
11 | _lcd_ready(); |
12 | _lcd_write_data(0x51); //Ion=0 Boster=0 C5=0 C4=1 |
13 | delay_us(40); |
14 | _lcd_ready(); |
15 | _lcd_write_data(0x6A); //Fon=1 Rab=(010) |
16 | delay_us(40); |
17 | _lcd_ready(); |
18 | _lcd_write_data(0x78); //Contrast=(1000) |
19 | delay_us(40); |
20 | _lcd_ready(); |
21 | _lcd_write_data(0x0C); // Display an Cursor aus |
22 | delay_us(40); |
23 | _lcd_ready(); |
24 | _lcd_write_data(0x01); // Clear Display |
25 | delay_us(40); |
26 | _lcd_ready(); |
27 | _lcd_write_data(0x06); // Entry Mode |
28 | delay_us(40); |
29 | lcd_clear(); |
30 | _lcd_write_data(0x25); //4bit Instalationstabelle 1 (Function Set) Einzeilig DH |
31 | delay_us(40); |
32 | }
|
Ansonsten habe ich hier nochmal meine Initialisierung. Meiner Meinung nach sind das die Besten Displays die ich kenne weil Sie so schön klein sind. Zudem die Möglichkeit den Kontrast zu verändern. Heute habe ich Graphische Displays von denen die sind noch eine Spur genialer. Gruß Lauso
> Meiner Meinung nach sind das die Besten Displays - Die Kontrastregelung der 16x3 ist Mist. Der Kontrast sollte, was extra unterstrichen wird, temperaturkompensiert sein. Aber zwischen 60-70 Grad kann man fast nichts mehr erkennen, wenn man den Kontrast bei Umgebungstemperatur eingestellt hat. Die sollten als 40-50 Grad-Displays verkauft werden, das wäre ehrlicher. - Die Schutzfolie wird immer noch auf den tausendstel Millimeter 100% deckungsgleich mit der Silberfolie (transreflektive Version) geschnitten. So ein Schwachsinn. Es passiert mir immer wieder, dass ich die Silberfolie anknabbere, obwohl ich nur die Schutzfolie abziehen will. - Ab und zu schlechte Fertigungsqualität, z.B. Luftblase im Glas im nicht sichtbaren Anschlussbereich. - Weil Backlight und Display getrennt sind, gibt es dazwischen einen minimalen Spalt, der dankbar die Fluxdämpfe und Isopropanol aufzusaugen scheint (Kapillarwirkung? Oder ist es die papierähnliche Schicht auf dem Backlight zur Streuung?). Wenn man, wie gefordert, das Backlight von oben verlötet und noch mal mit Isopronol zur Reinigung dran geht, oder wenn man in der Nähe lötet, dann kann sich dort Isop./Flux reinsaugen und das Display kriegt eine Abschattung, die nicht mehr verschwindet. Auf diese Weise habe ich drei Displays massakriert - bis mir aufgegangen ist, dass Reichelt keine Displays mit Abschattung liefert, sondern dass ein Montageproblem vorliegt. - Und natürlich viel zu teuer. Wieso das Backlight mit 4 orangen LEDs satte 6,60 EUR billiger ist, als dasselbe Backlight mit 4 weissen LEDS wird nur der Buchhalter erklären können. Für den Aufpreis für 4 weisse LED kann man bei IKEA eine GRÖNÖ-Tischlampe kaufen und mit dem Display an die Kunden ausliefern und noch Geld sparen :)
Hallo zusammen, ein Kollege hat sich heute die Zeit genommen seine Routine auf meine Bedürfnisse anzupassen. Dadurch war es nun möglich das Display zum Leben zu erwecken. Aber auch zusammen mussten wir die Hardware anpassen, die Belegung des Flachbandkabels welche µC und Disp verbinden, um die Anordnung der Pins in eine vernünftige oder ansteuerbare Reihenfolge zu bekommen. So sieht also die neue Belegung aus: PC2 --> RS PC3 --> E PC4 --> D7 PC5 --> D6 PC6 --> D5 PC7 --> D4 Sicher wäre es auch möglich mit PC2 bis PC5 die Daten heraus zu schreiben, aber hierbei war der Aufwand das Kabel zu ändern wesentlich geringer, als die entsprechende Änderung in der selbst (von ihm) geschriebenen Rutine. Also einen Dank an Alle die mir auf die Sprünge geholfen haben. @Dietmar Vielen Dank für die Infos, werde nun in meinem Projekt den Kontrast einstellbar machen, da ich evtl. Auch Temperaturen über 50°C zu erwarten habe.
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.