Forum: Mikrocontroller und Digitale Elektronik LCD 4x16 Problem


von Willy (Gast)


Lesenswert?

Servus,
ich habe mir bei Pollin dieses LCD bestellt:
LCD-Modul TC1604A-01 
http://www.pollin.de/shop/dt/MTczOTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TC1604A_01.html

Leider bringe ich es nicht zum laufen und benötige eure Hilfe.

aktueller Stand:
----------------
Die Hintergrundbeleuchtung funktioniert nach dem einschalten von PA5.
Kurz nach dem Start zeigt das Display in der ersten und zweiten Zeile 
jeweils 8 schwarze Felder an. Diese verschwinden nach ein paar Sekunden 
wieder und das Display ist dann "leer".

Verwendete Library:
-------------------
Peter Dannegger - 
http://www.mikrocontroller.net/attachment/30300/lcd_drv.zip

main.h
------
1
#ifndef F_CPU
2
#define F_CPU 16000000UL
3
#endif
4
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <util/delay.h>
8
#include "defs.h"
9
10
#define  LCD_D4    SBIT( PORTC, 4 )
11
#define  LCD_DDR_D4  SBIT( DDRC, 4 )
12
13
#define  LCD_D5    SBIT( PORTC, 5 )
14
#define  LCD_DDR_D5  SBIT( DDRC, 5 )
15
16
#define  LCD_D6    SBIT( PORTC, 6 )
17
#define  LCD_DDR_D6  SBIT( DDRC, 6 )
18
19
#define  LCD_D7    SBIT( PORTC, 7 )
20
#define  LCD_DDR_D7  SBIT( DDRC, 7 )
21
22
#define  LCD_RS    SBIT( PORTA, 6 )
23
#define  LCD_DDR_RS  SBIT( DDRA, 6 )
24
25
#define  LCD_E0    SBIT( PORTA, 7 )
26
#define  LCD_DDR_E0  SBIT( DDRA, 7 )

main.c
------
1
#include "main.h"
2
3
#define TRIGGER PC0
4
#define FOCUS PD7
5
#define LED1 PD3
6
#define LED2 PD4
7
#define LED3 PD5
8
#define LED4 PD6
9
#define BACKLIGHT PA4
10
#define LCD_POWER PA5
11
12
int main(void)
13
{
14
  // Display initialisieren
15
  lcd_init();
16
  
17
  /*
18
  * Timer 1
19
  * 16-Bit
20
  * CTC-Mode
21
  * f = 1Hz
22
  */
23
  TCCR1B |= (1 << WGM12);
24
  TIMSK |= (1 << OCIE1A);
25
  OCR1A = 15625-1;
26
  TCCR1B |= ((1 << CS10) | (1 << CS12));
27
  
28
  // Auslöser an PC0
29
  DDRC |= (1 << DDRC0);
30
  
31
  // Focus an PD7
32
  DDRD |= (1 << DDRD7);
33
  
34
  // LEDS
35
  DDRD |= (1 << DDRD3);
36
  DDRD |= (1 << DDRD4);
37
  DDRD |= (1 << DDRD5);
38
  DDRD |= (1 << DDRD6);
39
  
40
  // LCD
41
  DDRA |= (1 << DDRA4);  // Backlight
42
  DDRA |= (1 << DDRD5);  // LCD Power
43
  
44
  // lcd einschalten
45
  PORTA |= (1 << LCD_POWER);
46
  
47
  sei();
48
  lcd_pos( 0, 1 );
49
  lcd_text( (u8*)"Zeile 1" );
50
  
51
    while(1)
52
    {
53
        PORTD ^= ( 1 << LED1 );
54
        PORTD ^= ( 1 << LED2 );
55
        PORTD ^= ( 1 << LED3 );
56
        PORTD ^= ( 1 << LED4 );
57
        _delay_ms(100);
58
    }
59
}
60
61
ISR (TIMER1_COMPA_vect)
62
{
63
    PORTC ^= ( 1 << TRIGGER );
64
}

Hat jemand nen Tipp für mich?

VG
Willy

von Willy (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch ein Ausschnitt des Schaltplans wie das LCD angesteuert ist.

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

Was ist an PA5 alias LCD_Power angeschlossen? Doch nicht etwa die 
Stromversorung des Displays! Wenn doch, dann musst du die natürlich 
einschalten bevor du lcd_init() aufrufst!


Zu langsam getippt - aber Ursache bestätigt!

Sascha

: Bearbeitet durch User
von Sascha W. (sascha-w)


Lesenswert?

Im übrigen keine gute Idee GND abzuschalten, da über die anderen Pins 
ohne entsprechende Vorkehrung immer irgendwo Masse herkommt!

Sascha

von Willy (Gast)


Lesenswert?

Hallo Sascha,
danke für deine schnelle Antwort.

Das ich das Ding vorher Einschalten muss, da hätte ich auch selber drauf 
kommen können.

Leider bleibt das Display weiterhin "leer".

ich hab den Code mal angepasst und das Timer-Zeugs rausgeschmissen um es 
für dieses Problem übersichtlicher zu halten.

main.c
------
1
int main(void)
2
{
3
  // LEDS
4
  DDRD |= (1 << DDRD3);
5
  DDRD |= (1 << DDRD4);
6
  DDRD |= (1 << DDRD5);
7
  DDRD |= (1 << DDRD6);
8
  
9
  // LCD
10
  DDRA |= (1 << DDRA4);  // Backlight
11
  DDRA |= (1 << DDRD5);  // LCD Power
12
  
13
  // lcd einschalten
14
  PORTA |= (1 << LCD_POWER);
15
  
16
  // Display initialisieren
17
  lcd_init();
18
  lcd_pos( 0, 1 );
19
  lcd_text( (u8*)"Zeile 1" );
20
  
21
    while(1)
22
    {
23
        PORTD ^= ( 1 << LED1 );
24
    _delay_ms(100);
25
    }
26
}

Noch eine Zusatzinfo, machmal verschmieren die Schwarzen Balken nach dem 
Flashen, sind also nur halb zu sehen. Sieht aus wie ein Farbverlauf von 
Transparent nach Schwarz, ich versuche ob ich davon mal ein Bild machen 
kann.

Sascha Weber schrieb:
> Im übrigen keine gute Idee GND abzuschalten, da über die anderen Pins
> ohne entsprechende Vorkehrung immer irgendwo Masse herkommt!

Diese Funktion ist optional und nicht wichtig, wenns nicht hinhaut muss 
ich es das nächste mal anderst machen.

von hagi (Gast)


Lesenswert?

Nach dem einschalten des LCD muß du natürlich noch einen Moment warten 
bis die Initialisierung erfolgen kann.
Die genaue Zeit (ca. 20ms) steht im Datenblatt zum LCD.

In einer meinen Schaltungen versorge ich LCD-VCC direkt von einem Port.
Die paar mA die so ein LCD verbraucht sollte für den Port kein Problem 
sein.

von Willy (Gast)


Lesenswert?

Servus Hagi,
ich hab nun ein Delay von 20ms eingebaut nach dem Einschalten 
(Datenblatt 15ms bei 5V).

Geändert hat sich leider nichts.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

JTAG Fuse noch aktiv?
Falsche 4 Datenbits am Display angeschlossen?

von Willy (Gast)


Lesenswert?

Hallo Martin

Martin Wende schrieb:
> JTAG Fuse noch aktiv?

Die sollte aus sein:
LowFuse: 0xFF
HighFuse: 0xC9

Martin Wende schrieb:
> Falsche 4 Datenbits am Display angeschlossen?

Das kanns auch nicht sein, DB4-DB7 (Pin 11-14) wurden verwendet.

von Sascha W. (sascha-w)


Lesenswert?

was eigentlich sonst immer zuerst kommt - mal am Poti für den Kontrast 
gedreht?

Sascha

von Georg G. (df2au)


Lesenswert?

überbrücke doch mal deinen Transistor in der Masseleitung mit einem 
Stück Draht. Für einen Versuch wirst du den Stromverbrauch aushalten 
können. Nicht, dass du durch einen schlecht schaltenden Transistor ein 
Masseproblem hast.

von Willy (Gast)


Lesenswert?

Hallo Georg

Georg G. schrieb:
> überbrücke doch mal deinen Transistor in der Masseleitung mit einem
> Stück Draht.

Hab ich gemacht, am Display liegen nun konstant 5V an (zwischen Pin1 und 
Pin2)

@Sascha
ich hab Pin3 nun auf GND gelegt (testhalber) um die vollen Kontrast zu 
haben.

Ergebnis:
Das Display zeigt nun nach dem Flashen einen dünnen schwarzen Strich an, 
der dann mit der Zeit verschwindet.

von Georg G. (df2au)


Lesenswert?

Willy schrieb:
> ich hab Pin3 nun auf GND gelegt (testhalber) um die vollen Kontrast zu
> haben.
Den höchsten Kontrast bekommst du nicht bei GND sondern bei xV, 
ausprobieren.

> Ergebnis:
> Das Display zeigt nun nach dem Flashen einen dünnen schwarzen Strich an,
> der dann mit der Zeit verschwindet.
Da würde ich auf ein Kontaktproblem tippen.

Ohne jede Initialisierung, nur nach Anlegen der Betriebsspannung sollte 
das Display ein oder zwei Reihen dunkle Rechtecke zeigen. Diese Anzeige 
sollte stabil sein.

von Uwe (de0508)


Lesenswert?

Hallo Willy,

sind denn alle ACC, AVCC, GND und AGND angeschlossen und haben die ACC, 
AVCC je einen 100nF nach GND, AGND ?

von Georg G. (df2au)


Lesenswert?

Das Datenblatt von Pollin zeigt eine deutlich andere Pinbelegung als 
dein Schaltbild. Bist du sicher, dass alles richtig angeschlossen ist?

von Willy (Gast)


Lesenswert?

nein, da bin ich mir nicht sicher. ich werds besser nochmal checken.
Wo denkst hab ich mich vertan?

von Sascha W. (sascha-w)


Lesenswert?

Willy schrieb:
> Wo denkst hab ich mich vertan?
das kann man nicht sagen, da dein Displayanschluss nur 12 Pins hat, das 
Display selbst aber 16 - wie das verkabelt ist weißt nur Du!

Sascha

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.