- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 9 von 9

Thema: TWI Anfängerprobleme

  1. #1

    TWI Anfängerprobleme

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi liebe Forengemeinde, ich bin gerade am weiteren ausbauen eines Programmes und würde meinem uC gerne die I2C Kommunikation beibringen. Dazu habe ich das Tutorial Master-Slave-GCC durchgearbeitet.
    Aber mein Compiler bringt immer wieder den Fehler "i2cmaster.h:No such file or directory" und ich werde auf die Zeile #include <i2cmaster.h> in der datei twimaster.c verwiesen.

    Ich habe die Dateien in mein Projekt importiert und auch im Makefile die anderen ".c" Dateien als ext.source eingegeben. Zum Kompilieren benutze ich die aktuellste Version vom AVR STUDIO6.

    Davor hat er sich noch über Signal (SIG_OUTPUT_COMPARE1A) beklagt welches ich daraufhin in ISR (TIMER1_COMPA_vect) geändert habe.

    Hat jemand einen Tipp für mich?

    Vielen Dank schonmal für eure Hilfe.

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von Natureengeneer Beitrag anzeigen
    ... Aber mein Compiler bringt immer wieder den Fehler ...
    Nehmen wir mal an, Du programmierst mit AVRStudio 4. Dann mal:
    obere Befehlsleiste: [Projekt]
    => Fly out kommt. Gaaanz unten müsste da stehen
    [Configuration Options] - klick drauf. Ein Fenster geht auf. Gaanz oben, links steht
    General . . . . darunter
    [Include
    Directories] - klick drauf.
    Dieses Fenster zeigt rechts oben vier Symbole, das linke ist ein Ordner. Klick drauf. Jetzt gibts drunter ne editierbare Zeile - rechts davon ein Drei-Punkte-Button. Pick (linker Mausknopf) auf den Button. Es kommt ein Explorerfenster "Ordner suchen". Such den Ordner auf Deinem Rechner, in dem Deine i2cmaster.h steht. Pick auf den Ordner, pick auf [OK] - der Ordner erscheint dann unten im Fenster.

    Versuchs jetzt nochmal mit dem Compilieren.

    Wenns nicht geht, wirf den Rechner weg, hör auf mit TWI (machte MIR etliche Probleme *ggg*) - oder frag nochmal hier.
    Ciao sagt der JoeamBerg

  3. #3

    Vielen Dank das war die Lösung.

    Im Studio6 gehts so: Reiter Project => Properties => Toolchain => AVR/GNU C Compiler => Directories => IncludePaths===>> ADD ITEM

  4. #4

    Pfeil DS16 gibt 0 aus

    Ich bin jetzt schon ein ganzes Stück weiter gekommen und versuche einen DS1621 zu lesen.

    Sensordefines:
    PHP-Code:
    uint16_t ds16_temperatur;
    #define DS1621_Write  0x90
    #define DS1621_Read   0x91 
    Einschaltfunct.:
    void ds1621_einschalten(void)
    PHP-Code:
    {
        
    i2c_init();
        
    i2c_start(DS1621_Write);
        
    i2c_write(0xEE);
        
    i2c_stop();
        
    i2c_start(DS1621_Write); 
        
    i2c_write(0xAA);
        
    i2c_stop();
        
    _delay_ms(200); 

    Daraufhin=>>>

    Sensorabfrage:
    PHP-Code:
    i2c_start(DS1621_Read);
    ds16_temperatur i2c_readAck(); // <== int16_t Rückgabewert
    i2c_readNak();
    i2c_stop(); // <== 
    Jetzt noch ==>

    Stringformatierung:
    PHP-Code:
    char DEES [10];
    sprintf(DEES,"DSTEMP: %d",ds16_temperatur); 

    Soweit so gut. Keine Fehler beim Kompilieren. Einziges Problem ist es kommt immer eine 0 an

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von Natureengeneer Beitrag anzeigen
    ... DS1621 ... lesen ... Keine Fehler beim Kompilieren ... es kommt immer eine 0 an ...
    Ist doch klar. Die Compiler bringen nach ein Uhr nachts immer wieder Schrott (woran das nur liegen kann???) - nur bei mir liefs gestern nach eins (nach fehlerbehafteten Abenden) sauber - ´n RC-5-Dekoder im Interrupt.

    Spass beiseite. Dein guter Wille ist im Code ja schon zu sehen, aber Du musst ziemlich kräftiger wollen, wenn Du bei den Atmels bei EINEM i2c_read ZWEI Bytes (Zitat aus Deinem Code : // <== int16_t Rückgabewert) haben willst. Meine Atmels spendieren dabei immer nur ein Byte : ( .

    Abhilfe: lies mal diese Schnippsel (klick) - beachte, dass dabei aus unerfindlichen Gründen (angeblich will ich, dass der Quellcode übersichtlicher ist) teilweise zwei oder drei Befehle in einer einzigen Zeile stehen. Es ist der alte Trick aus zwei Bytes ein Word zu löten. Und achte bitte auch auf die Typdefinitionen uint8_t und uint16_t.

    Viel Erfolg.
    Geändert von oberallgeier (26.11.2012 um 09:20 Uhr) Grund: Wieder mal Definition und Deklaration geschüttelt
    Ciao sagt der JoeamBerg

  6. #6
    OK, weiterprobiert...
    PHP-Code:
    unsigned char retTempHTempLdatatest;

    void ds1621_lesen(void)
    {
        
            
    i2c_start(DS1621_Read);
            
    data i2c_readAck();
            
    TempH data;
            
    data i2c_readNak();
            
    TempL data;
            
    i2c_stop();
        
        

    so müsste es doch klappen???? wenn ich aber TempH und TempL am LCD ausgebe, habe ich für beide den Wert 0...???

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    Zitat Zitat von Natureengeneer Beitrag anzeigen
    OK, weiterprobiert ... so müsste es doch klappen ... für beide den Wert 0 ...
    Sozusagen experimentelle Softwareentwicklung . . .

    Ich kenne Dein dsDingsda nicht, ich will auch nicht DEIN Datenblatt für Dich lesen. Seltsam kommt mir vor, dass Du ab Register Null des Teilchens Deine Daten suchst - stimmt das so? Ich Suche meine Daten in I²C-Satelliten meist an einem bestimmten Registerplatz.

    Code:
    // =================================================================================
    ...
    // ----------------------------------------------------------------------------
    //      Lesen von 6 Registern ab Register 0x02. X, Y, Z-Koordinate
    ...
      ret = i2c_start (I2C_BMA_W); 
      ret = i2c_write (0x02); 
            i2c_stop  (); 
                                    //
       ret = i2c_start (I2C_BMA_R); 
       ret = i2c_read  (ACK); x = (int16_t)ret; 
       ret = i2c_read  (ACK); x = x | ((int16_t)ret << 8); x /= 64; 
    ...
    // ----------------------------------------------------------------------------
    Steht so auch im zitierten Code .
    Ciao sagt der JoeamBerg

  8. #8
    Jetzt hab ichs gerafft!!!

    PHP-Code:
    void ds1621_lesen(void)
    {
        
            
            
    i2c_start(DS1621_Write);
            
    i2c_write(0xAA);
            
    i2c_stop();
            
    i2c_rep_start(DS1621_Read);
            
    TempH i2c_readAck();
            
    TempL i2c_readNak();
            
    i2c_stop();
            
    ret = (TempH TempL /256); // <===Noch nicht gut!
        
        

    Works!

    DANKESCHÖN.
    Geändert von Natureengeneer (26.11.2012 um 12:58 Uhr)

  9. #9
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.685
    ... ret = (TempH * 1 + TempL /256); // <===Noch nicht gut! ...
    Ja, sieht so aus. Es gibt sicher zahllose Beispiele um zwei Bytes zu einem Word zusammenzulöten.
    (M)Eines wäre:

    Code:
    // ============================================================================== =
    // ============================================================================== =
     void I2CTST01 (void)          // I2C-Testroutine
    ...
      uint8_t btst1     =  0;       // Read-back-Byte vom Slave
      uint8_t btst2     =  0;
      uint8_t btst3     =  0;
    ...
        btst2  = i2c_read (ACK);             //
        btst3  = i2c_read (ACK);             // 
    ...
    //#define uniq(LOW,HEIGHT) ((HEIGHT << 8)|LOW)   // ###>>> Macro 2x 8Bit --> 16Bit
      iword         = uniq(btst3, btst4);   // 2à 8Bit --> 16Bit
      itoa(iword, zahlwort, 10);            //
      uart_puts("\tWert für Word4high3low\t");      // Ausgabe
      uart_puts(zahlwort);                  //
    ...
    // ===  Ende I2CTST01 (void)  ============================
    // ============================================================================== =
    Die Makrodefiniton muss halt an irgendeiner Stelle deponiert werden - das ist Deine Freiheit. Ohne Makro gehts natürlich auch.
    Geändert von oberallgeier (26.11.2012 um 18:00 Uhr) Grund: selber gedankenlos
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. Anfängerprobleme
    Von Patroclus im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 37
    Letzter Beitrag: 13.12.2011, 20:45
  2. Ein paar Anfängerprobleme
    Von ElociNe im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 07.10.2011, 14:38
  3. Anfängerprobleme
    Von LuZ im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 11.03.2008, 15:29
  4. Anfängerprobleme
    Von paul-stanley im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 01.03.2008, 00:03
  5. Welches Kabel für TWI (I2C) verwenden? Hilfe bei TWI Routine
    Von Sauginius im Forum AVR Hardwarethemen
    Antworten: 23
    Letzter Beitrag: 26.07.2004, 14:33

Stichworte

Berechtigungen

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

Solar Speicher und Akkus Tests