PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD über I2C ansprechen



Reissdorf
29.12.2012, 20:48
Hallo liebe Mitstreiter,

leider bin ich ein Programmier- und C-Anfänger und habe ein Problem und hoffe, dass es hier ein paar Leute gibt, die mir weiterhelfen können. Gerne würde ich ein Display über I2C und einen PCF8574 ansprechen. Dazu habe ich eine Schaltung gemäß des folgenden Links aufgebaut (https://www.roboternetz.de/community/threads/20277-LCD-%C3%BCber-I2C-C-Bibliothek-f%C3%BCr-AVR (http://www.rn-wissen.de/index.php/LCD-Modul_am_AVR#Ansteuerung_.C3.BCber_I.C2.B2C)) und die "i2clcd.h" von hier genommen (http://computerheld.de/i2clcd/). Bevor ich Fragen zum eigentlichen Programm habe, brauche ich Hilfe zum Erstellen der HEX-Datei im AVRStudio 5.1.

Ich habe meinem kleinen Programm die Codeschnipsel, wie auf computerheld.de angegeben (unter Documentation > Example), hinzugefügt. Die Dateien i2cmaster.h und i2clcd.h habe ich ins "Hauptverzeichnis" der Header-Dateien kopiert. Mein Programm schaltet eine LED Interrupt-gesteuert an und aus, was ohne I2CLCD-Funktionalität (in roter Schrift) gut klappt. Hier das Programm:


#include <avr/io.h> // Header-Datei f. IO-Register
#include <avr/interrupt.h> // Header-Datei f. Interruptfunktion
#include <stdint.h> // Header-Datei f. standard Datentypen
#include "i2clcd.h"


volatile uint8_t tcount; // Globale Variable (volatile)
uint8_t x; // Lokale Variable zum Schalter des Ports


ISR (TIMER0_OVF_vect)
{
/* Interrupt alle (16.000.000/256)/256 Hz = 244,140625 Hz
bzw. 1/488,28125 s = 4,096 ms */

tcount++; // tcount +1 pro Timer Interrupt (ca.10ms)
}


int main(void) // Hauptprogramm ab hier
{
x = 0;

DDRD = (1 << DDD7); // PortD7 als Ausgang für LED1
lcd_init(); //- Display initialization

// Timer 0 konfigurieren
TCCR0 = (1<<CS02); // Prescaler 256
TIMSK |= (1<<TOIE0); // Overflow Interrupt erlauben

sei(); // Global Interrupts aktivieren

char string[] = "Hi World";
lcd_print(string); //- Print a string
lcd_gotolr(2,4); //- Move to position (line 2, row 4)

while (1) { // Endlosschleife im Hauptprogramm


if ( tcount > 121 ) { // 122*4,096ms Warten (499,712ms)
if ( x == 0 ) { // Wenn x gleich 0 ist
PORTD &= ~( (1<<PD7)); // ...deaktiviere Port D7
x = 1; // Setze X auf 1
}
else { // Ansonsten
PORTD |= (1<<PD7); // ...aktiviere Port D7
x = 0; // Setze X auf 0
}


tcount = 0; // Zähler wieder auf 0 setzen

}
}
}

Nun zu meinem Problem. Wenn ich dieses Programm "kompilieren" möchte (F7 drücken), dann erscheinen die folgenden Fehlermeldungen: 24146
Könnt ihr entdecken, wo ich einen Fehler gemacht habe? Nach viel Sucherei und einigen Stunden arbeit, weiß ich nicht mehr weiter :(

Schon jetzt vielen Dank für eure Mühe und Hilfe,
euer Reissdorf

schorsch_76
30.12.2012, 09:12
Der Compiler gibt nur Warnungen aus. Warnungen sind aber meist Zeichen für mögliche Probleme ;)

Dein Hauptproblem sind die "undefined references". Du hast vergessen die c Datei der Lib dem Projekt hinzuzufügen (in den Projektbaum). Ich nutze kein Avr Studio, denke aber dass du Rechtsklick auf den Ordner in dem main.c enthalten ist, und dann "Hinzufuegen ..." musst.

Gruß
Georg

Reissdorf
30.12.2012, 12:55
Danke für den Hinweis, der war sehr hilfreich! Ich konnte das Programm erstellen und an den Mikrocontroller überspielen. Beim ersten Versuch leuchtete das Display auf, es war jedoch keine Schrift zu erkennen. Ich habe dann noch festgestellt, dass die blinkende LED ausgegangen ist. Nachdem ich eine kleine Änderung an dem Programm gemacht und dieses aufgespielt habe, leuchtet das Display nicht mehr. Auch nachdem ich die vorherige Programmversion aufgespielt hatte. Werden die I2C-Befehle auskommentiert, dann funktioniert die LED wieder. Wenn ich jedoch das "lcd_init();" wieder einbinde, dann scheint sich das Programm aufzuhängen.

Gibt es hier etwas zu beachten? Muss ich irgendwo die Adresse des I2C-Displays angeben? Aber wieso hat es dann vorher aufgeleuchtet, das ist es was mich unsicher macht.

PS: Das #include "i2cmaster.h" habe ich aus meinem Programm raus genommen und auch im Code weiter oben gelöscht.
PPS: Seltsamerweise leuchtet das Display jetzt wieder. Das Verbindungskabel war locker. Ist aber jetzt fest! Wie dämlich. Aber es zeigt nichts an, lediglich zwei Reihen mit je 16 schwarzer Kästchen. Die LED blinkt auch noch nicht.

schorsch_76
30.12.2012, 13:37
Ich habe ein KS0073 Display letztens probiert. Ich musste in der lcd Bibliothek noch die Anfangsaddressen der Zeilen und die Ports anpassen. Hab jetzt die I2CLcd Lib noch nicht angesehen. Evtl. ist auch dein Probem, dass du ein PCF8574P oder ein PCF8574 hast. Die unterscheiden sich in der I2C Addresse.

Gruß
Georg

Reissdorf
30.12.2012, 20:48
Hallo Georg,
es hat ein einfaches "i2c_init();" gefehlt! #-o

Jetzt geht es. Danke für deine Hilfe und Ratschläge!