Hallo,
schreib einfach eine Function der Du die SlaveAdresse des gewünschten Sensors mitgibst.
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 0xEEMuss ich diese funktionen für jeden Sensor einzeln eingeben? Also beispielweise für Sensor mit Adressierung A0=1, A1=0, A2=0:Code:i2c_start_wait(I2CTHERMO + I2C_WRITE); i2c_write(GETTEMP); i2c_rep_start(I2CTHERMO + I2C_READ); temperaturVK = i2c_readAck(); temperaturNK = i2c_readNak(); i2c_stop();
Code:#define GETTEMP2 0xAA #define I2CTHERMO2 0x92 #define STARTCONVERT2 0xEELG HannesCode:i2c_start_wait(I2CTHERMO2 + I2C_WRITE); i2c_write(GETTEMP2); i2c_rep_start(I2CTHERMO2 + I2C_READ); temperaturVK2 = i2c_readAck(); temperaturNK2 = i2c_readNak(); i2c_stop();
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...Zitat von linux_80
Das Program sieht im prinzip so aus:
Und will einen 2. Sensor hinzufügenCode:#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; }
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.
Ja, aber genau das war ja meine frage, wie man das macht^^
Code:#define GETTEMP 0xAA #define I2CTHERMO1 0x90 #define I2CTHERMO2 0x92 #define STARTCONVERT 0xEEetwa so?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();
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
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:
Im Programm sehe das etwa 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(); }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 SensorBoden 0x90 #define SensorLuft 0x92 char TempBoden[2]; char TempLuft[2]; for(;;) { LeseTemp(SensorBoden,TempBoden); LeseTemp(SensorLuft,TempLuft); ... ... ... }Wie Du siehst, gibt es mehrere Wege nach Rom...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(); }
Viel Spaß Sebastian
P.S. Das zweite Beispiel gefällt mir nicht ganz, vielleicht könnte man das besser schreiben
Linus TorvaldSoftware is like s e x: its better when its free.
Hab es jetzt einfach mal so probiert wie ich gedacht hatte:
Allerdings bekomme ich bei dem zweiten Sensor keine richtige Temperatur ausgegeben (196°C), wenn ich beide parallel betreibe, mit dem obrigen code.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();
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
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.
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 von linux_80
Ja, Adresse ist einmal 0x90 und 0X92, laufen ja wenn ich sie einzeln Programmiere bzw. Messen lasse.Zitat von linux_80
Einfach 4 Leitungen an die Beinchen gelötet...Zitat von linux_80
Er zeigt aber 196, nicht -96 an...Zitat von linux_80
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)Zitat von linux_80
LG Hannes
Lesezeichen