In diesem Kapitel wird ein LCD Display mithilfe eines Port Expanders (PCF8574A) an den I²C Bus angeschlossen und in Atmel Studio eine entsprechende Bibliothek implementiert. Anschließend wird für das Display das bereits im vorherigen Kapitel bekannte Hello-World-Programm geschrieben.

Der PCF8574A ist ein I²C 8-Bit I/O Port Expander. Die serielle Schnittstelle I²C wurde bereits in einem vorherigen Kapitel behandelt. Der Port Expander wandelt die seriell (über den Bus) übertragenen Signale auf eine parallele Übertragung um. Um den Port-Expander via I²C ansprechen zu können, benötigt dieser eine feste Adresse. Diese kann an den Adresspins A0, A1 und A2 begrenzt definiert werden. Dazu werden die Pins auf High oder Low gelegt. Welche Adressen zu welcher Konfiguration gehören, kann dem Datenblatt entnommen werden. P0 bis P7 sind die parallelen Ausgänge. GND und Vcc dienen der Spannungsversorgung des Expanders sowie des Displays und werden wie SDA und SCL mit dem Arduino verbunden. SDA und SCL sind die bereits bekannten I²C-typischen Leitungen.


Abb.: Port Expander; Quelle: BBS2 Wolfsburg


Im folgenden Beispiel ist der Port-Expander bereits auf einer Zusatzplatine an der Rückseite des LCD Displays verlötet gewesen. Wie auch im vorherigen Hello World LCD Beispiel wird wieder ein 16x2 LCD Display verwendet:

LCD Dsiplay Rückseite

Abb.: Zusatzplatine LCD Display I²C; Quelle: BBS2 Wolfsburg



SDA muss an den analogen Pin 4 und SCL an den analogen Pin 5 des Arduino angeschlossen werden.

Der Aufbauplan sieht wie folgt aus:

Anschlussplan

Abb.: Aufbau LCD Display via I²C ; Quelle: BBS2 Wolfsburg

Pin 1 des Displays liegt auf der linken Seite.


Da auf der rückseitigen Platine des LCD Displays keine Pull Up Widerstände verbaut sind, müssen sie für einen problemlosen Betrieb selbst hinzugefügt werden. Verwendet werden 4,7kΩ Widerstände.

Um das LCD Display sowie I²C in Atmel Studio verwenden zu können, müssen entsprechende Bibliotheken implementiert werden.

Im Beispiel wurden die LCD Bibliothek von folgender Quelle bezogen:

https://www.avrfreaks.net/forum/lcd-display-iic-1602-atmega328p

-> Beitrag von david.prentice vom 04.06.2014 13:16 Uhr

Damit das LCD Display richtig angesprochen wird, müssen in einigen der Bibliotheken kleine Änderungen vorgenommen werden. Diese Änderungen sind bauteilspezifisch. Sie können dem Datenblatt des Displays entnommen werden. Man kann leider keine allgemeine Konfigurationslösung angeben. Die folgenden Änderungen wurden anhand der im Beispiel verwendeten Bauelemente vorgenommen.

Änderung in der LCD.h für die Zeilen 145-174:

#ifndef LCD_DATA0_PIN
#define LCD_DATA0_PIN		4		/**< pin for 4bit data bit 0	*/
#endif
#ifndef LCD_DATA1_PIN
#define LCD_DATA1_PIN		5		/**< pin for 4bit data bit 1	*/
#endif
#ifndef LCD_DATA2_PIN
#define LCD_DATA2_PIN		6		/**< pin for 4bit data bit 2	*/
#endif
#ifndef LCD_DATA3_PIN
#define LCD_DATA3_PIN		7		/**< pin for 4bit data bit 3	*/
#endif
#ifndef LCD_RS_PORT
#define LCD_RS_PORT		LCD_PORT	/**< port for RS line		*/
#endif
#ifndef LCD_RS_PIN
#define LCD_RS_PIN		0		/**< pin  for RS line		*/
#endif
#ifndef LCD_RW_PORT
#define LCD_RW_PORT		LCD_PORT	/**< port for RW line		*/
#endif
#ifndef LCD_RW_PIN
#define LCD_RW_PIN		1		/**< pin  for RW line		*/
#endif
#ifndef LCD_RS_PORT
#define LCD_RS_PORT		LCD_PORT	/**< port for Enable line	*/
#endif
#ifndef LCD_E_PIN
#define LCD_E_PIN		2		/**< pin  for Enable line	*/
#endif

Pin Konfiguration/Verbindung zwischen Port Expander und LCD Display, z.B. Pin P5 des Port Expanders, liegt an D5 des Displays und P2 des Expanders liegt an Port E des Displays.


Änderung in der lcd_i2cmaster.c, Zeile 13:

#define PCF8574A		0x3F		//for your solder blobs
Hier wird die Adresse des I²C Slave (in dem Fall der Port Expander) eingetragen.


In der folgenden main.c ist das Hello World Programm geschrieben:

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"			//LCD Display Bibliothek

extern void lcd_backlight(char on);	//not in lcd.h

int main(void)
{
	lcd_init(LCD_ON_DISPLAY);	//Initialisierung LCD Display
	
	lcd_clrscr();			//Löschen aller Inhalte auf dem Display
	
	lcd_home();			//Cursor auf die Home Position legen
	
	while(1)
	{
		lcd_gotoxy(0, 0);	//Cursor auf Zeichen 0, Zeile 0
		lcd_puts("T");
		lcd_puts("e");
		lcd_puts("s");
		lcd_puts("t");
		
		lcd_gotoxy(0, 1);	//Cursor auf Zeichen 0, Zeile 1
		
		lcd_puts("Hellow World!");
	}
}

Ergebnis:

Endergebnis

Abb.: Ergebnis LCD Display via I²C; Quelle: BBS2 Wolfsburg



Wichtige Funktionen für das LCD-Display:

void lcd_init()                     - Initialisiert das Display (muss am Anfang des Displays aufgerufen werden)

void lcd_clrscr()                 - Sendet den Befehl zum Löschen des Displays

void lcd_puts()                  - Sendet einen String an das LCD-Display

void lcd_home()                - Setzt den Cursor an Spalte 1, Zeile 1

void lcd_gotoxy(x,y)          - Setzt den Cursor an Spalte x, Zeile y


Problembehandlung:

Falls auf dem Display nichts erkannt werden kann, kann es sein, dass der Kontrast umgestellt werden muss. Dies ist auf der Rückseite des Displays über das Potentiometer möglich. Andernfalls kann es sein, dass die in der lcd_i2cmaster gewählte Slaveadresse falsch ist. In diesem Fall kann man im Datenblatt des Expanders nach der richtigen Adresse suchen oder sich für die Arduino IDE einen I²C Scanner herunterladen. Der I²C Scanner gibt die Adresse im seriellen Monitor aus.

Zuletzt geändert: Montag, 28. Februar 2022, 16:39