- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 5 von 5

Thema: LCD über I2C ansprechen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Alter
    48
    Beiträge
    45

    LCD über I2C ansprechen

    Anzeige

    E-Bike
    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) 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:

    Code:
    #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: Klicke auf die Grafik für eine größere Ansicht

Name:	i2clcd_RN_20121229.jpg
Hits:	21
Größe:	21,5 KB
ID:	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
    Geändert von Reissdorf (30.12.2012 um 15:01 Uhr)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    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
    Geändert von schorsch_76 (30.12.2012 um 09:19 Uhr)

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Alter
    48
    Beiträge
    45
    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.
    Geändert von Reissdorf (30.12.2012 um 13:10 Uhr)

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    48
    Beiträge
    456
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    10.10.2007
    Alter
    48
    Beiträge
    45
    Hallo Georg,
    es hat ein einfaches "i2c_init();" gefehlt!

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

Ähnliche Themen

  1. LCD an PCF8574 über I2C - 2*16 läuft / 4*20 LCD nicht?
    Von stfan1409 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 15.04.2012, 16:06
  2. Anfängerfrage: AtMega32 über I2C im Slavemode ansprechen
    Von Phi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.04.2008, 17:25
  3. LCD über Subroutine ansprechen ???
    Von Enrico3 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 21
    Letzter Beitrag: 23.02.2007, 10:31
  4. RNB FRA 1.22 oder RN Control über I2C ansprechen
    Von Dr.U.Bianchi im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 31
    Letzter Beitrag: 05.07.2005, 11:55
  5. 2.te C-control M2.0 über I2C-Bus ansprechen?
    Von zerbarus im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 1
    Letzter Beitrag: 11.03.2005, 14:45

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress