PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD über I2C C-Bibliothek für AVR



privatestatic
25.08.2006, 01:23
Hallo Leute,

ich hab mir vor ein paar Tagen das LCD mit Ansteuerung über I2C mittels Portexpander PCF8574
aus dem Artikelbereich (https://www.roboternetz.de/wissen/index.php/LCD-Modul_am_AVR#Ansteuerung_.C3.BCber_I.C2.B2C )
nachgebastelt.
Dummerweise habe ich dann keine C-Bibliothek für diese Kombination gefunden und mir deshalb eine selbst erstellt.

Da evtl. auch bei Anderen Interesse an solch einer Bibliothek besteht, stelle ich sie zum Herunterladen auf meine Webseite.

i2clcd Bibliothek: http://computerheld.de/i2clcd/
i2clcd Dokumentation: http://computerheld.de/i2clcd/doc/index.html

Ich habe ein HD44780 kompatibles 2x16 Display (KS0070B) und einen ATMega32 @ 16 Mhz.
Als Portexpander nutze ich den PCF8574P und als Compiler avr-gcc (GCC) 4.1.0.
Andere Konfigurationen konnte ich nicht testen.

Zum Compilieren wird die I2C-Bibliothek von Peter Fleury http://jump.to/fleury benötigt.

Viel Spass beim Testen!

Grüße
Nico

BlooD
28.10.2006, 11:03
Wunderbar, genau das was ich gesucht hab :)
Werde das demnächst mit einem 40-Zeichen LCD testen und bescheid geben, dann kannst das als "tested" auf die HP aufnehmen... wenn ichs hinbekomme ;)

privatestatic
29.10.2006, 18:20
Super!
Wenn was nicht geht, dann sag bescheid damit ich es anpassen kann!

Grüße
Nico

atlas85
28.05.2014, 16:21
Hallo,
erstmal zu meinem Problem: Zeichen der Reihe 3 werden in Reihe 1 angezeigt, nach änderung von Parametern geht das in Reihe 1, jedoch nicht mehr in Reihe 2. Noch maliges Anpassen führt nur zum entgültigen Erlöschen des Display.
Ich habe das ganze mit einem eigenen ATmega8 Test Board und der I2C Erweiterung versucht, als Umgebung benutze ich "Atmel Studio 6.2".
Das Display ist ein Displaytech 204A, also ein 20 Zeichen * 4 Zeilen Display .
Im Code habe ich die Zeilen angepasst:

#define LCD_I2C_DEVICE 0x40 /**< Change this to the address of your expander */
#define LCD_LINES 4 /**< Enter the number of lines of your display here */
#define LCD_ROWS 20 /**< Enter the number of rows of your display here */

#define LCD_LINE1 0x00 /**< This should be 0x00 on all displays */
#define LCD_LINE2 0x40 /**< Change this to the address for line 2 on your display */
#define LCD_LINE3 0x14 /**< Change this to the address for line 3 on your display */
#define LCD_LINE4 0x54 /**< Change this to the address for line 4 on your display */


Bei LCD_LINES und LCD_ROWS habe ich auch schon versucht 2 Lines und 40 ROWS, jedoch ohne erfolg.

Eine "i am alive LED" funktioniert nur bis zur lcd_init. dann ist alles eingefroren.

...
while(1)
{

PORTB ^= (1<<PB0);
i2c_init();

PORTB ^= (1<<PB0);
lcd_init();

PORTB ^= (1<<PB0);
unsigned char string1[] = "Alles ATMEGA_8 1";
unsigned char string2[] = "Alles ATMEGA_8 2";
lcd_gotolr(1,1);
lcd_print(string1);
lcd_gotolr(3,1);
lcd_print(string2);

...

- Was kann ich an der Konfiguration falsch gemacht haben?
- Was läuft mit der Anzeige schief (dass Zeile 3 die Fortsetzung von Zeile 1 ist ist mir bekannt, jedoch nicht, wieso Zeichen 21 an Stelle von Zeichen 17 erscheint und ab dann weiter gezählt wird...)

Danke schon mal für die Hilfe.
Grüße

Achim S.
28.05.2014, 16:56
Hallo Atlas85
Dein Fehler sieht nach Speicher aus. Wenn das Zeichen auf Platz 17 erscheint, könnte dort etwas nicht stimmen. Vielleicht stinmmt die Position der Ausgabe nicht. Stell mal den ganzen Code rein. Vielleicht hast du zwei unterschiedliche Positionen angegeben.
achim

atlas85
29.05.2014, 22:49
Hallo,

danke schon mal für den Tipp.
Ich habe soeben mal nochmal alles aus dem Schrank geholt und beim Messen fiel mir auf, dass weder SDA noch SCL etwas tun.
Alle Dateien die ich verwende sind als Anhang in einem ZIP Archiv. Wie schon erwähnt verwende ich AtmelStudio 6.2, also habe ich die Projektdatei mit dazu gepackt.

Grüße