Hallo allerseits, ich habe folgendes Problem: Ich habe ein Atmel Eva-Board 2.0 vom Pollin, bestückt mit einem ATTiny2313 und ein LCD MDL162D655 (auch vom Pollin). Programmierung mache ich über AVR Studio 4.12 SP4 in C, mit dem AVR Dragon. Programmiererfahrung habe ich leider noch nicht so viel. Nun versuche ich schon seit einiger Zeit das LCD in oben beschriebener Kombination zum laufen zu bringen. Beschaltung, Fuses und Programm siehe unten. So wie es aussieht, kann ich jedoch das LCD nicht einmal initialisieren. Es leuchtet leider immer nur die obere Zeile. Ich habe schon einige Foren durchsucht, aber noch keine Lösung für mein Problem gefunden. Deshalb hätte ich folgende Fragen: Liegt es am Programm oder an der Schaltung / dem LCD? Sollte das Programm so funktionieren? Das Display ist über ein Flachbandkabel wie folgt am Eva-Board angeschlossen: LCD Eva-Board ATTiny2313 1 VSS 35 GND 2 VDD 36 VCC 3 V0 39/40 über 10k Poti 4 RS 30 PD4 5 R/W 31 PD5 6 E 32 PD6 7 DB0 9 PB0 8 DB1 10 PB1 9 DB2 11 PB2 10 DB3 12 PB3 11 DB4 13 PB4 12 DB5 14 PB5 13 DB6 15 PB6 14 DB7 16 PB7 Fuses: CKSEL=1111 SUT=11 BODLEVEL=111 CKOUT=0 Das Programm findet ihr im Anhang. Vielen Dank für eure Hilfe! Gruß Robert
Hallo, interessant ist erst einmal, was du mit der Einheit "ns" meinst. Dein Controller läuft anscheinend mit 4 GHz. Aber ok, ist ja nur ein Kommentar. Überarbeite die Initialisierung. Der Hersteller gibt wohl keine Routine an? Normalerweise im 8-Bit-Mode Power On 15ms 0x30 5ms 0x30 100µs 0x30 strobe 0x38 0x08 strobe bla bla Aber, ich habe schon LCDs gesehen, mit folgender Routine: Power On 15ms 0x38 39µs bla bla Etwas kürzer. Außerdem wartest du zu lange zwischen den einzelnen Kommandos.
Hi, du sendest vier mal 0x30. Mach mal drei draus. Wenn das nicht hilft schmeiß ready(); raus. Wenn du lange genug wartest kannst du dir den Ready/Busy Check sparen. Ich mach das schon seit Jahren so mit PIC und AVR. Damit spart man sich auch den R/W Pin. Fest auf 0 legen. Das klappt bei allen meinen Displays wunderbar. Wird das hier noch ausgegeben ? uart_puts("Nach LCD_Init \r\n"); uart_puts("Beginn Pause 2 init \r\n"); Dahinter solltest du ein while(1); dranhängen. Evtl. startet dein Programm nur ständig neu. Cu Holger
Guten Abend, erst einmal vielen Dank für eure Antworten. Ich bin leider nicht früher dazugekommen euere Tips auszuprobieren. Ich habe das Programm jetzt etwas umgeschrieben. Die Timings habe ich aus dem Datenblatt für den HD44780. Diese sollten jetzt eigentlich passen. Leider funktioniert es immer noch nicht. Die erste Zeile leuchtet, die 2te immer noch nicht :-( . Habe langsam das Gefühl daß das Display kaputt ist. Hat vielleicht einer von euch ein kleines Programm das sicher funzt (Initialisierung und ein Zeichen wiedergeben würde reichen)? Ich habe das ganze nämlich schon mit mehreren LCDs ausprobiert. Leider hats bis jetzt mit keinem geklappt :-(. Vielen Dank Gruß aus München Robert
C kann ich nicht... Aber: - Bist Du sicher, dass Dein Tiny2313 mit 8MHz klappert? (Fusebits korrekt eingestellt) - Bist Du sicher, dass Dein Compiler die Warteschleife in 'LCD_delay_timer' nicht wegoptimiert? ...
Vielleicht noch einmal für mein Verständnis, die erste Zeile leuchtet ? Das bedeutet das alle Pixel an sind ? Wenn ja dann ist es nicht einmal initialisiert. Außerdem laß das Init mit 0x30 mal weg, 3x 0x38 und gut ist, dann clear und entry mode.
Hallo Im Anhang mal mein Treiber fürs LCD im 4bit Modus. Nur mal als Beispiel.
Guten Abend, -> Hannes Lux: Ich habe die Fuses nochmal ausgelesen. Er läuft über den externen 8MHz-Quarz. Das mit dem Wegoptimieren kann ich mir nicht vorstellen, da es eine einfache Zählschleife ist, die der uC auf jeden Fall durchlaufen müsste. -> Joe: Richtig! es läßt sich nicht initialisieren. Ich hab's grad mal probiert mit deinem Tip 3 mal 0x38. Dazu habe ich das Programm geändert (siehe Anhang). Hat leider auch nicht funktioniert -> Franz Rainer: Danke. Ich werde es mir heute zu Gemüte führen Vielen Dank für eure Hilfeversuche Gruß Robert
...aber sicher wird die Zählschleife wegoptimiert (solange z.B. die Zählvariable nicht "volatile" deklariert ist)! Jeder halbwegs vernünftige C-Compiler erkennt, dass hier nichts gemacht wird und schmeisst das Teil weg.
-> Stefan Wimmer Danke für den Tip. Ich bin leier noch nicht so erfahren in C. Ich habe es jetzt geändert (siehe Anhang). Leider hat das mein Problem auch nicht gelöst. Gruß Robert
Also ich habe immernoch keine Ahnung von C, frage mich aber, warum Du nicht einfach das Delay() benutzt, das die AVR-LibC mitbringt? Das funktioniert wenigstens, liest man zumindest in vielen einschlägigen Beiträgen hier im Forum. ...
Ich hab's jetz mal mit dieser Version probiert (mit _delay_ns/ms). funktioniert leider auch nicht. Außerdem geht mir bald der Speicher aus. Werds wohl mal mit nem ATMega16 probieren. :-(
Wenn ich richtig gelesen habe, setzt Du EN auf 1 und legst dann die Daten auf den Port. Eigentlich werden die Daten auf den Port gelegt und erst dann der Schreibimpuls erzeugt.
Guten Morgen. Das Display übernimmt die Daten bei fallender Flanke vom Enableimpuls.
Zur Benutzung von delay_(ms) ist zu sagen: The maximal possible delay is 262.14 ms / F_CPU in MHz. Also: Bei 8MHz delay = max. 32,7675ms bei 4MHz max. 65,535 ms bei 16MHz max. 16,38375ms
Also ich lege erst die Daten an (Enable ist dabei auf L), dann lege ich Enable auf H und nach einigen Takten wieder auf L. Und das funktioniert. Allerdings im 4-Bit-Mode, für die Nutzung des 8-Bit-Mode gab es noch keine Notwendigkeit, das habe ich also noch nicht gemacht. Ich programmiere in Assembler, da macht der Controller exakt das, was programmiert wurde. Um dieses mit C zu erreichen, reicht mein Wissen nicht, C ist mir zu kryptisch. ...
Hallo, evtl. ist es noch von Interesse: Da ich zufällig eine ganz ähnliche Kombination laufen habe, habe ich die Version mal mit meiner verglichen (ATTiny2313 mit KS0070B, KS0066U (sollten kompatibel sein)) und eine funktionierende Version erstellt. Ich verwende bei meiner Hardware die gleiche Pinbelegung (nur RS und E sind vertauscht), die Version ist so angepasst, dass sie bei dir sofort funktionieren sollte. #define F_CPU 8000000 muss VOR #include <util/delay.h> Eigentlich gibt es dazu aber auch eine recht eindeutige Warnung vom Compiler. und: DDRD= (1<DDD4) | (1<DDD5) | (1<DDD6); sollte DDRD= (1<<DDD4) | (1<<DDD5) | (1<<DDD6); sein. und noch einige "Kleinigkeiten", guck dir am besten die Version mal an, wie gesagt ich habe es auf einem ATTiny2313 getestet. Allerdings habe ich kein Experimentierboard, sondern eine selbstgeätzte Platine, wenn es nicht funzt ist evtl ein Pin vertauscht? Der Speicher des 2313 reicht locker um ein LCD anzusteuern, ein ATMega16 ist wirklich nicht nötig. Bei mir sind trotz ziemlich großem Funktionsumfang (u.a. Kommunikation per RS232) noch über 25% Flash frei und SRAM werden gerade mal 4 Byte benutzt (statisch) aber auch im worstcase dürften da höchstens nochmal 10 Byte dazukommen, soviel passiert ja nicht gleichzeitig. mfg Kolja
Wenn man die Vorschau benutzt wird das Feld für den Dateianhang zurückgesetzt, das muss man wissen. Also hier dann die Datei, sorry fürs Doppelposting.
Guten Abend Erst einmal vielen Dank für Eure Hilfe! Ich, bzw. Kohlja hat den Fehler gefunden und es ist mir unendlich peinlich :-). An und für sich hätte jedes meiner Programme funktioniert, wenn sich da nicht bei der Zuweisung des Datenrichtungsregisters ein Tippfehler eingeschlichen hätte. >Kohlja: Ich habe deine Version an einem ATMega 16 ausprobiert und dort funktioniert sie auch. Aber beim Tiny reicht mir der Speicher nicht aus. Ich compiliere es mit dem AVR Studio und bekomme dort immer ein Programm mit 2294 bytes (112%). Was für einen Compiler verwendest du? Woran kann es sonst noch liegen? Oder hast du's mit Assembler programmiert :-)? Wünsche Euch allen noch 'ne schöne Woche Gruß Robert
Hallo Robert, schön dass es bei dir (wenigstens auf dem ATmega16) jetzt läuft. Ich verwende WinAVR 20070122, mit dem AVR Studio kenne ich mich nicht aus, hab es vor einiger Zeit mal für Assembler benutzt, aber nie für C. Soweit ich weiß benutzt AVR Studio aber auch den gcc (WinAVR). Hier mal die Ausgabe von avr-size bei mir:
1 | AVR Memory Usage |
2 | ---------------- |
3 | Device: attiny2313 |
4 | |
5 | Program: 262 bytes (12.8% Full) |
6 | (.text + .data + .bootloader) |
7 | |
8 | Data: 0 bytes (0.0% Full) |
9 | (.data + .bss + .noinit) |
Evtl. liegt es an der Optimierung?! Ich verwende -Os, also Size, irgendwo hab ich gelesen, dass -O3 beispielsweise Riesencode erzeugt. Aber selbst mit -O3 komme ich dabei gerade auf 604 Byte:
1 | AVR Memory Usage |
2 | ---------------- |
3 | Device: attiny2313 |
4 | |
5 | Program: 604 bytes (29.5% Full) |
6 | (.text + .data + .bootloader) |
7 | |
8 | Data: 0 bytes (0.0% Full) |
9 | (.data + .bss + .noinit) |
Gibt es evtl. im AVR Studio noch eine Einstellung, dass irgendwelcher Debugcode mit in die Datei eingebaut wird? Ist nur eine Spekulation, wie gesagt ich kenn das AVR Studio nicht, aber so einen krassen Größenunterschied kann ich mir eigentlich nicht erklären, bei dir ist die Datei ja fast 10x so groß. Hast du die Datei compiliert, die ich hochgeladen habe, oder deine ursprüngliche Version mit korrigiertem DDR? Ansonsten fällt mir dazu gerade auch nichts mehr ein woran das noch liegen kann, ich kämpfe auch oft genug mit den Tücken von C/C++. Also die Version die ich hier reingestellt habe, habe ich wie gesagt live auf einem ATtiny2313 getest, es müsste also eigentlich auch bei dir funktionieren. Evtl. hat noch jemand eine Idee, der sich mit dem AVR Studio auskennt, oder du versuchst es mal mit WinAVR zu kompilieren. mfg Kolja
Hallo Kohlja, ich habe es glaube ich noch nicht erwähnt, aber ich bin ein blutiger Anfänger, was uC's angeht und im Programmieren mit C habe ich auch noch nicht so viel Erfahrung. Das mit der Optimierung kannte ich vorher auch noch nicht, ich hab einfach mal drauf losprogrammiert :-). Danke für den Tip Gruß Robert
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.