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
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