Forum: Mikrocontroller und Digitale Elektronik Problem: LCD mit ATTiny


von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von S. W. (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

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

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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?

...

von Joe (Gast)


Lesenswert?

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.

von Franz-Rainer (Gast)


Angehängte Dateien:

Lesenswert?

Hallo
Im Anhang mal mein Treiber fürs LCD im 4bit Modus.
Nur mal als Beispiel.

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan W. (wswbln)


Lesenswert?

...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.

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

-> 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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Robert (Gast)


Angehängte Dateien:

Lesenswert?

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. :-(

von jack (Gast)


Lesenswert?

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.

von Franz-Rainer (Gast)


Lesenswert?

Guten Morgen.

Das Display übernimmt die Daten bei fallender Flanke vom Enableimpuls.

von Franz-Rainer (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Kolja (Gast)


Lesenswert?

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

von Kolja (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Robert (Gast)


Lesenswert?

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

von Kolja (Gast)


Lesenswert?

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

von Robert (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.