Forum: Mikrocontroller und Digitale Elektronik Display anfänger


von Renfer (Gast)


Lesenswert?

Hallo zusammen
Ich hab mir ein Display gekauft und diesen an einen ATMEGA32 
geschlossen. Den Display habe ich an PORTD gehängt und RS und E an 
PORTA(PIN1 und PIN2).
Gibt eine einfache möglichkeit irgendetwas auszugeben, z.B. "Hallo"
und kann man dieses Tutorial auch für den 8-Bit-Interfacemodus benutzen?
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

von Karl H. (kbuchegg)


Lesenswert?

Das kommt drauf an, was das für ein 'Display' ist.
Es gibt ja weltweit mehr als nur einen einzigen Typ.

> und kann man dieses Tutorial auch für den 8-Bit-Interfacemodus benutzen?
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Wenn es ein HD44780 kompatibles LCD ist, dann ja.
Musst du halt die Initialisierung ein wenig umschreiben. Aber wozu? Nimm 
halt den 4 Bit Modus. Das spart Leitungen.

: Bearbeitet durch User
von Renfer (Gast)


Lesenswert?

Ich hab dieses Display. 
http://www.distrelec.ch/Web/Downloads/_t/ds/dem16217syh_eng_tds.pdf?mime=application%2Fpdf
Wie finde ich heraus ob es HD44780 kompatibl ist?

von Datenblatt-LESER (Gast)


Lesenswert?

Renfer schrieb:
> Ich hab dieses Display.
> http://www.distrelec.ch/Web/Downloads/_t/ds/dem162...
> Wie finde ich heraus ob es HD44780 kompatibl ist?

Im Datenblatt steht, welcher Kontroller auf dem Display sitzt.
Der ST7066.
Wenn du das bei gurgel eingibst, erfährst du von Wikipedia, dass er zum 
HD44780 kompatibel ist.
Also bingo.

von Karl H. (kbuchegg)


Lesenswert?

Renfer schrieb:
> Ich hab dieses Display.
> 
http://www.distrelec.ch/Web/Downloads/_t/ds/dem16217syh_eng_tds.pdf?mime=application%2Fpdf

Das ist wohl kompatibel

> Wie finde ich heraus ob es HD44780 kompatibl ist?

Indem du bei deinem nächsten Einkauf nicht unbedingt nur nach dem Preis 
gehst, sondern auch danach, welche Informationen sonst noch verfügbar 
sind. Findest du ein Bauteil, bei dem du die notwendige Information 
nicht erhältst (zb in dem du danach goggelst) und das auch sonst keiner 
(zb in einem Forum) kennt, dann lass die Finger davon. Egal wie schön 
die Farbe ist, egal wie billig es ist. Löse dich von der Vorstellung, 
die dir PC vermitteln, das das alles zusammenpasst und man im Prinzip 
alles kaufen kann und es wird schon irgendwie gehen. Beim PC 
funktioniert das, weil es da Standards gibt, die sich seit Jahrzehnten 
etabliert haben.

: Bearbeitet durch User
von Renfer (Gast)


Lesenswert?

ok danke für den tipp

von Renfer (Gast)


Lesenswert?

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung
Ich hab dieses Tutorial durchgelesen und es anschliessen den Code 
kopiert und folgendes geändert:
//  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
#define LCD_RS        PD4
//  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
#define LCD_EN        PD5

zu

//  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
#define LCD_RS        PA1

//  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
#define LCD_EN        PA0

Jetzt macht es aber nix. Die schwarzen Balken bleiben stehen auf dem 
Display. Wird hier nicht mal die Initialisierung durchgeführt? Hat 
jemand ein Tipp wie weiter?

von Karl H. (kbuchegg)


Lesenswert?

Renfer schrieb:

> Jetzt macht es aber nix. Die schwarzen Balken bleiben stehen auf dem
> Display. Wird hier nicht mal die Initialisierung durchgeführt? Hat
> jemand ein Tipp wie weiter?

Wenn du die beiden Leitungen vom Port D auf den Port A übersiedelst, 
dann müssen in der Initialisierung auch diese beiden Leitungen auf 
Ausgang geschaltet werden bzw. die Ausgabeanweisungen entsprechend 
umgeschrieben werden.

Der Code geht nun mal davon aus, das alle Leitungen an nur einem 
einzigen Port hängen und ist auch genau für diesen Fall geschrieben.

Hast du denn deine ersten Schritte nicht mit LED-ein/aus schalten bzw. 
blinken lassen verbracht, so dass du erst mal grundsätzlich die Technik 
erlernt hast, wie man bestimmte Bits an einem bestimmten Port schaltet? 
Das in PA1 der Portname A vorkommt, ist zwar nett, aber trügerisch. Denn 
PA1 unterscheidet sich in nichts von PD1. Beides sind einfach nur 2 
unterschiedliche Bezeichnungen für das selbe: Das Bit 1. In dieser 
Bezeichnung ist aber nicht enthalten (auch wenn es so aussieht), dass 
dieses Bit am Port A residiert.

von leluno (Gast)


Lesenswert?

PA1 steht für 1, PA0 steht für 0, wenn du sonst nichts änderst, schreibt 
er dir 1 und 0 in Port D. Du müsstest also zumindest noch den Port 
ändern.

von Pete K. (pete77)


Lesenswert?

- Hast Du die Bauteile nach Datenblatt angeschlossen?
- Dann noch JTAG in den Fuses disablen.
- Abblockondensatoren nicht vergessen?
- F_CPU richtig verwendet, damit die delay-Zeiten stimmen?
- Warnungen vom Compiler ernst genommen?
- Kontrast richtig abgeschlossen (siehe Datenblatt)?
- Initialisierungsroutine mit dem Datenblatt verglichen, ob evtl. andere 
Timings angegeben sind? (Kompatibel heisst nicht baugleich)

von Renfer (Gast)


Lesenswert?

ich habs jetzt so geändert.

//  LCD DB4-DB7 <-->  PORTD Bit PD0-PD3
#define LCD_PORT      PORTD
#define LCD_DDR       DDRD
#define LCD_DB        PD0

//  LCD RS      <-->  PORTD Bit PD4     (RS: 1=Data, 0=Command)
#define LCD_RS        PD4

//  LCD EN      <-->  PORTD Bit PD5     (EN: 1-Impuls für Daten)
#define LCD_EN        PD5

zu

#define LCD_A_PORT         PORTA
#define LCD_A_DDR          DDRA
#define LCD_RS             PA1
#define LCD_EN             PA0

#define LCD_DATA_PORT      PORTD
#define LCD_DATA_DDR       DDRD
#define LCD_DATA_DB        PD0

Ist dies gut so?

von Karl H. (kbuchegg)


Lesenswert?

Renfer schrieb:

> zu
>
> #define LCD_A_PORT         PORTA
> #define LCD_A_DDR          DDRA
> #define LCD_RS             PA1
> #define LCD_EN             PA0
>
> #define LCD_DATA_PORT      PORTD
> #define LCD_DATA_DDR       DDRD
> #define LCD_DATA_DB        PD0
>
> Ist dies gut so?

Ich hätte das jetzt nicht
LCD_A_PORT
genannt.
Denn dieses #define soll ja letzten Endes regeln, an welchem Port die 
Control-Leitungen (RS und E) liegen. Das das am A Port ist, ist ein 
nettes Detail, sollte sich aber IMHO nicht im Namen des #define 
wiederspiegeln. Genauso wie sich ja in LCD_DATA_PORT auch nicht der 
konkrete Name des Ports wiederfindet.

Was spricht gegen
1
#define LCD_CTRL_PORT       PORTA
2
#define LCD_CTRL_DDR        DDRA

denn im Code selber, steht dann ja beispielsweise
1
   LCD_CTRL_PORT |= ( 1 << LCD_RS );

da steht also im Code, dass am Port an dem die Control Leitungen hängen, 
die RS Leitung auf 1 geschaltet werden soll. Und das ist ok so. Das sich 
das alles am Port A abspielt und welches Bit sich hinter RS verbirgt, 
das soll und will ich an dieser Stelle im Code ja gar nicht wissen.


Aber grundsätzlich:
Ja, das ist der Anfang der MOdifikation. Jetzt jeißt es den Code 
durchgehen und die Ausgabeanweisungen entsprechend modifizieren bzw. in 
Daten und Control Anweisungen zu zerteilen.
Denn beispielsweise das hier
1
void lcd_init( void )
2
{
3
    // verwendete Pins auf Ausgang schalten
4
    uint8_t pins = (0x0F << LCD_DB) |           // 4 Datenleitungen
5
                   (1<<LCD_RS) |                // R/S Leitung
6
                   (1<<LCD_EN);                 // Enable Leitung
7
    LCD_DDR |= pins;
kann ja nicht so bleiben. Die Datenleitungen sind ja nicht mehr am 
selben Port wie die Controlleitungen. Also wird es da auch 2 Zuweisungen 
an das jeweils richtige DDR Register geben müssen. usw. usw.

: Bearbeitet durch User
von Renfer (Gast)


Lesenswert?

ok werd ich mal machen danke für die Hilfe

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.