Problem mit LCD Ansteuerung!

Persönliche Seite #556610
Lesenswert?

Spontan würde ich sagen, dass dieser Aufbau (im Anhang vergrössert und 
komprimiert) nie und nimmer im Tutorial beschrieben ist.

Welchen Sinn haben die vier Brücken zwischen PORTB und PORTD? Wo sind 
die Pinnummern an PORTB und PORTD? An PORTB kann ich nur 7 IO-Leitungen 
entdecken, an PORTD 8.

Ich würde das neu aufbauen - so einfach wie möglich.
Angehängte Dateien:
#556630
Lesenswert?

Stefan Berker wrote:
> Vier Brücken ist für beide Fälle( 4Bits und 8 Bits Ansteuerung).
> Du kannst nur 7 IO Leitungen an PORTB entdecken weil ich nur 7 brauche.
> Die andere habe ich mit GND verbunden.

Das (die Brücken und der fixe Anschluss auf GND) ist keine gute
Idee. Damit zerschiesst man sich ganz schnell einen Port,
wenn die Dinger gegeneinander treiben.

> Und im Tutorial steht auch keine Anleitung für LCD Schaltung. Ich habe
> es selbst gemacht.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD
Persönliche Seite #556655
Lesenswert?

Spontan sieht es bis auf Kleinigkeiten (void main(void)) nicht schlecht 
aus.

Als nulltes ;-) würde ich die Kontrasteinstellung am LCD kontrollieren - 
nicht dass der zu niedrig eingestellt ist und einfach die Anzeige 
"blank" ist.

Wichtig für die sehr wichtigen Delays ist, dass F_CPU korrekt definiert 
ist und dass mit Optimierung übersetzt wurde vgl. AVR-GCC-Tutorial - 
Warteschleifen.

Als zweites würde ich die Pinzuordnung prüfen, bin dann aber am 
Schaltplan gescheitert.

An nächstes wäre dann der Vergleich der Initialisierungssequenz und der 
restlichen Ansteuerung mit dem Datenblatt des LCD-Controllers dran. Das 
müsste ich aber auftreiben lassen; ich glaube in der Artikelsammlung 
sind ein paar Weblinks drin.

Auch habe ich nicht im Kopf, ob alle Pins von PORTB und PORTD beim 
Atmega8515 General-I/O-Pins sind oder ob einige andere Funktionen haben. 
D.h. hier würde ich auch im Datenblatt lesen.
#556656
Lesenswert?

Auf die Schnelle drübergeschaut:

Das hier:
 {  PORTB |= (0<<PB0);//RS=0

löscht nicht ein Bit.
 0 << PB0   ist immer noch 0 (Eine 0 kann man nach links
schieben sooft man will, sie bleibt trotzdem 0)

Ergo steht da sinngemäß

   PortBit = PortBit | 0

Wenn du aber irgendein Bit mit 0 veroderst, ändert sich nichts
am Bit

  A   B    A OR B
  0   0       0
  1   0       1
  0   1       1
  1   1       1

(B sei die Maske, also das 0 << PB0. Das Ergebnis ist identisch
zu A. Nur dann wenn B eine 1 aufweist, ändert sich das. Du hast
aber keine 1, 0 << PB0 ist immer 0)

Ein Bit wird so gelöscht

  PORTB &= ~( 1 << PB0 );


Bit setzen     PORTB |= ( 1 << PB0 )
Bit Löschen    PORTB &= ~( 1 << PB0 )
Bit abfragen   PORTB & ( 1 << PB0 )
#556662
Lesenswert?

Als nächstes würde ich dann mal hergehen und in
das Programm künstliche Endlosschliefen an strategischen
Punkten einbauen. Daduch bleibt das Pgm quasi stehen und
du hast Zeit genug mit einem Multimeter direkt am Display
zu kontrollieren, ob alle Leitungen den Pegel haben, den
sie haben sollen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren