- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: i2c - mehrere Sensoren auslesen

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114

    i2c - mehrere Sensoren auslesen

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,
    weiß nicht so recht weiter... Will mehrere DS1621 über einen I2C bus auslesen, aber weiß nicht so recht wie. Habe bis jetzt nur einen am laufen. Benutze die libary von Peter Fleury.

    Folgender maßen sieht das program bis jetzt aus:

    Code:
    #define GETTEMP 0xAA 	
    #define I2CTHERMO 0x90 
    #define STARTCONVERT 0xEE
    Code:
          i2c_start_wait(I2CTHERMO + I2C_WRITE); 
          i2c_write(GETTEMP); 
          i2c_rep_start(I2CTHERMO + I2C_READ); 
    
          temperaturVK = i2c_readAck();
          temperaturNK = i2c_readNak();
          i2c_stop();
    Muss ich diese funktionen für jeden Sensor einzeln eingeben? Also beispielweise für Sensor mit Adressierung A0=1, A1=0, A2=0:
    Code:
    #define GETTEMP2 0xAA 	
    #define I2CTHERMO2 0x92 
    #define STARTCONVERT2 0xEE
    Code:
          i2c_start_wait(I2CTHERMO2 + I2C_WRITE); 
          i2c_write(GETTEMP2); 
          i2c_rep_start(I2CTHERMO2 + I2C_READ); 
    
          temperaturVK2 = i2c_readAck();
          temperaturNK2 = i2c_readNak();
          i2c_stop();
    LG Hannes

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    schreib einfach eine Function der Du die SlaveAdresse des gewünschten Sensors mitgibst.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Zitat Zitat von linux_80
    Hallo,

    schreib einfach eine Function der Du die SlaveAdresse des gewünschten Sensors mitgibst.
    Sorry, kann dir gerade nicht ganz folgen. Weiß nich genau was du meinst...

    Das Program sieht im prinzip so aus:

    Code:
    #include <avr/io.h> 
    #include "i2cmaster.h" 
    #define GETTEMP 0xAA 				
    #define I2CTHERMO 0x90 				
    #define STARTCONVERT 0xEE 			
    
    int main(void) { 					
       char TemperaturVK;
       char TemperaturNK; 
       DDRD = (1<<PD5)|(1<<PD6);		
       i2c_init();
       i2c_start(I2CTHERMO+I2C_WRITE);	 
       i2c_write(STARTCONVERT); 		
       i2c_stop(); 
       for(;;) { 
          i2c_start_wait(I2CTHERMO+I2C_WRITE); 
          i2c_write(GETTEMP); 			
          i2c_rep_start(I2CTHERMO+I2C_READ); 
          TemperturVK = i2c_readAck();
          TemperturNK = i2c_readNak();
          i2c_stop(); 
          if (TemperturVK[0] >= 25) 		
             PORTD =(1<<PD5); 			
          else 							
             PORTD =(1<<PD6); 			
         } 
         return 0; 
    }
    Und will einen 2. Sensor hinzufügen

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Du hast doch eine Konstante namens I2CTHERMO in deinem Programm. Die dürfte ja die Adresse der Thermometers für deine Konfiguration der Adresseingänge enthalten. Wenn du die Adresseingänge des Thermometers allerdings anders beschaltest, hat das dann ja ne andere Adresse. Wenn du nun mehrere Thermometer verwenden willst, muss du denen jeweils ne andere Adresse geben und das bei i2c_start berücksichtigen, indem du dann eine andere Adresse übergibst.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Ja, aber genau das war ja meine frage, wie man das macht^^

    Code:
    #define GETTEMP 0xAA              
    #define I2CTHERMO1 0x90 
    #define I2CTHERMO2 0x92             
    #define STARTCONVERT 0xEE
    Code:
          i2c_start_wait(I2CTHERMO1+I2C_WRITE); 
          i2c_write(GETTEMP);           
          i2c_rep_start(I2CTHERMO1+I2C_READ); 
          TemperturVK1 = i2c_readAck(); 
          TemperturNK1 = i2c_readNak(); 
          i2c_stop(); 
    
          i2c_start_wait(I2CTHERMO2+I2C_WRITE); 
          i2c_write(GETTEMP);           
          i2c_rep_start(I2CTHERMO2+I2C_READ); 
          TemperturVK2 = i2c_readAck(); 
          TemperturNK2 = i2c_readNak(); 
          i2c_stop();
    etwa so?

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    10.08.2004
    Ort
    Großbardorf
    Alter
    37
    Beiträge
    674
    Ja, passt.
    Ich bin halt davon ausgegangen, dass du den code selbst programmiert hast und dann müsstest du auch wissen, wie das geht. Anscheinend kannst dus ja, auch wenn dus nicht unbedingt glaubst

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo Hannes,

    Es gibt mehrere Ansätze Dein 'Problem' zu Lösen.

    Du kannst natürlich die paar Zeilen so oft hintereinander schreiben, wie Du möchtest, bei 2 oder 3 Sensoren ist das kein Problem.

    Du könntest Dir so wie Linux80 sagt eine Funktion basteln an die Du z.B. Die Slaveadresse und ein Zeiger auf ein 2 Byte Array übergibst.
    Das sieht dann z.B. so aus:
    Code:
    void LeseTemp(uint8_t Adresse,char* Temp) {
         i2c_start_wait(Adresse+I2C_WRITE); 
          i2c_write(GETTEMP);           
          i2c_rep_start(Adresse+I2C_READ); 
          *Temp++ = i2c_readAck(); 
          *Temp = i2c_readNak(); 
          i2c_stop(); 
    }
    Im Programm sehe das etwa so aus:
    Code:
    #define SensorBoden 0x90
    #define SensorLuft 0x92
    char TempBoden[2];
    char TempLuft[2];
    
    for(;;) {
      LeseTemp(SensorBoden,TempBoden);
      LeseTemp(SensorLuft,TempLuft);
      ...
      ...
      ...
    }
    Wenn man alles in einem Array haben möchte und die Slave Adressen schön um 2 versetzt sind, könnte man anstatt der Funktion eine for Schleife nutzen etwa so:
    Code:
    #define Sensor1 0x90
    #define AnzahlSensoren 3
    ...
    ...
    char Temperaturen[AnzahlSensoren*2];
    uint8_t a;
    for (a=0;a< (AnzahlSensoren+1)*2;a+=2){
          i2c_start_wait(Sensor1+a+I2C_WRITE); 
          i2c_write(GETTEMP);           
          i2c_rep_start(Sensor1+a+I2C_READ); 
          Temperaturen[a] = i2c_readAck(); 
          Temperaturen[a+1] = i2c_readNak(); 
          i2c_stop();
    }
    Wie Du siehst, gibt es mehrere Wege nach Rom...

    Viel Spaß Sebastian

    P.S. Das zweite Beispiel gefällt mir nicht ganz, vielleicht könnte man das besser schreiben
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Hab es jetzt einfach mal so probiert wie ich gedacht hatte:

    Code:
          i2c_start_wait(I2CTHERMOb + I2C_WRITE); 
          i2c_write(GETTEMP); 
          i2c_rep_start(I2CTHERMOb + I2C_READ); 
    
          temperaturVKb = i2c_readAck(); /
          temperaturNKb = i2c_readNak();
          i2c_stop(); 
        
    		
    		
          i2c_start_wait(I2CTHERMO + I2C_WRITE); 
          i2c_write(GETTEMP); 
          i2c_rep_start(I2CTHERMO + I2C_READ); 
    
          temperaturVK = i2c_readAck();
          temperaturNK = i2c_readNak(); 
          i2c_stop();
    Allerdings bekomme ich bei dem zweiten Sensor keine richtige Temperatur ausgegeben (196°C), wenn ich beide parallel betreibe, mit dem obrigen code.
    Wenn aber nur einer angeschlossen ist (code mit nur einer Sensor Ansteuerung) liefert jeder einen richtigen Tempertur Wert.

    Einer ne idea wodran das liegen könnte?

    LG Hannes

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Funktioniert es denn wenn Du im Programm beide abfrägst, aber nur einen anschliesst, also einmal den einen und dann nur den andren, oder gehts nur wenn Du das Programm änderst ?
    Sind die Adressen an den 1621 richtig eingestellt ?
    Wie wurde verkabelt ?
    Hast Du dem 1621 vorher gesagt, das er die Temperatur messen soll, oder liest Du die Werte nur aus ?

    Solange nach dem Reset nicht gemessen wurde, kommt immer -96° raus.

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.04.2007
    Beiträge
    114
    Zitat Zitat von linux_80
    Funktioniert es denn wenn Du im Programm beide abfrägst, aber nur einen anschliesst, also einmal den einen und dann nur den andren, oder gehts nur wenn Du das Programm änderst ?
    Wenn das Programm für beide Programmiert ist aber nur einer angeschlossen ist, tut sich garnix. Also auch der angeschlossene gibt kein Signal mehr aus... (wird einfach nix ausgegeben)

    Zitat Zitat von linux_80
    Sind die Adressen an den 1621 richtig eingestellt ?
    Ja, Adresse ist einmal 0x90 und 0X92, laufen ja wenn ich sie einzeln Programmiere bzw. Messen lasse.

    Zitat Zitat von linux_80
    Wie wurde verkabelt ?
    Einfach 4 Leitungen an die Beinchen gelötet...

    Zitat Zitat von linux_80
    Solange nach dem Reset nicht gemessen wurde, kommt immer -96° raus.
    Er zeigt aber 196, nicht -96 an...

    Zitat Zitat von linux_80
    Hast Du dem 1621 vorher gesagt, das er die Temperatur messen soll, oder liest Du die Werte nur aus ?
    Weiß nicht genau was du damit meinst... Ich schiecke doch dem Sensor denn befehl zu Messen, erfasse dann den Messwert, Speichere ihn in der Variablen "temperturVK" und dann wird der bus gestopt und wieder gestartet, aber mit ner anderen Adresse... (siehe Code)

    LG Hannes

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

Labornetzteil AliExpress