Christoph2
26.06.2011, 01:41
Hi,
ich ärgere mich jetzt schon seit zwei Tagen mit einem Problem herum, und finde den fehler einfach nicht.
Ich baue gerade eine Terrariumsteuerung mit einem mega32, und verwende Temperatur- und Feuchtigkeitssensoren von Hygrosens mit I2C Interface:
2 Stück Temperatursensoren: http://shop.hygrosens.com/Sensormodule-acma/Temperatur-Sensormodule/Digitaler-Ausgang-I-C/Innovatives-ASIC-Modul-zur-Temperaturmessung-acma-2.html
1 Stück Feuchtigkeitssensor: HYT241, http://www.hygrosens.com/index.php?id=3738/
Zuerst hatte ich nur die beiden Temperatursensoren angeschlossen, da hat alles funktioniert. Hab die beiden Temperaturwerte korrekt eingelesen und am Display angezeigt.
Dann kam der Feuchtigkeitssensor dazu. Ich habe die Terrariumsteuerung abgeschalten, den Feuchtigkeitssensor angeschlossen, und die Steuerung wieder eingeschlten, also nichts am Code verändert. Der Controller hat sich genau dann aufgehängt, wo er die Temperatursensorwerte einlesen hätte sollen.
Das sollte er eigentlich nicht tun oder?
Ich hab dann ein neues Unterprogramm geschrieben, in dem der Feuchtigkeitswert eingelesen wird, rübergespielt - und es hat natürlich auch nicht funktioniert, er ist wieder hängen geblieben dort wo er die Temperaturwerte einlesen sollte.
Dann hab ich das einlesen der Temperaturwerte auskommentiert, und sofort hat alles funktioniert: Feuchtigkeit wurde eingelesen und korrekt am Display angezeigt.
Ich bekomm es einfach nicht hin dass Temperatur und Feuchtigkeit gleichzeitig funktionieren...
Adressproblem ist es keines, das hab ich schon 1000 Mal nachgeprüft.
Hier ist mein Code:
HYGROSENS_I2C.C
void update_temp1()
{
uint32_t tempa, tempb;
uint8_t temphigh, templow;
i2c_start(TEMP1+I2C_READ);
temphigh = i2c_readAck();
templow = i2c_readNak();
i2c_stop();
tempa=(temphigh&0b01111111)*256;
tempb=(templow&0b11111110);
temp1=((tempa+tempb)*10)/256-320;
}
void update_temp2()
{
uint32_t tempa, tempb;
uint8_t temphigh, templow;
i2c_start(TEMP2+I2C_READ);
temphigh = i2c_readAck();
templow = i2c_readNak();
i2c_stop();
tempa=(temphigh&0b01111111)*256;
tempb=(templow&0b11111110);
temp2=((tempa+tempb)*10)/256-320;
}
void feuchte_init()
{
i2c_start(FEUCHTE1+I2C_WRITE);
i2c_stop();
}
void update_feuchte1()
{
uint8_t byte1=0, byte2=0, byte3=0, byte4=0;
i2c_start(FEUCHTE1+I2C_READ);
byte1=i2c_readAck();
byte2=i2c_readAck();
byte3=i2c_readAck();
byte4=i2c_readNak();
i2c_stop();
i2c_start(FEUCHTE1+I2C_WRITE);
i2c_stop();
feuchte1=(uint32_t)((((byte1&0b00111111)*(uint32_t)256+byte2)*(uint32_t)1000)/(uint32_t)16383);
feuchte1_temp=(uint32_t)((((byte3*(uint32_t)256+(b yte4&0b11111100))*(uint32_t)165)/(uint32_t)16383)-(uint32_t)40);
}
HYGROSENS_I2C.H
// DEFINES
#define TEMP1 0b00010010 // I2C-Adresse Temperatursensor 1
#define TEMP2 0b00010100 // I2C-Adresse Temperatursensor 2
// #define FEUCHTE1 0b00100010 // I2C-Adresse Temperatursensor 2
// VARIABLEN
volatile unsigned long temp1; // (uint32_t) Globale Variable für Temperatursensor 1 [Zehntel-°C]
volatile unsigned long temp2; // (uint32_t) Globale Variable für Temperatursensor 2 [Zehntel-°C]
volatile unsigned long feuchte1; // (uint32_t) Globale Variable für Feuchtigkeit [Zehntel-%]
volatile unsigned long feuchte1_temp; // (uint32_t) Globale Variable für die Temperatur des Feuchtesensors [Zehntel-°C]
// DEKLARATIONEN
void feuchte_init();
void update_feuchte1();
void update_temp1();
void update_temp2();
HAUPTPROGRAMM (Ausschnitt)
int main(void)
{
...
feuchte_init();
...
if(timer10ms>=100) // folgendes wird jede Sekunde wiederholt
{
timer10ms=0;
...
update_temp1();
update_temp2();
update_feuchte1();
...
// Print Temp1
lcd_gotoxy(0,2);
lcd_var32(temp1/10);
lcd_putc('.');
lcd_var32(temp1%10);
lcd_putc('ß'); // ß=° am Display
lcd_putc('C');
// Print Temp2
lcd_gotoxy(7,2);
lcd_var32(temp2/10);
lcd_putc('.');
lcd_var32(temp2%10);
lcd_putc('ß'); // ß=° am Display
lcd_putc('C');
// Feuchte anzeigen
lcd_gotoxy(15,2);
lcd_var32(feuchte1);
lcd_gotoxy(15,3);
lcd_var32(feuchte1_temp);
...
}
else;
...
}
Habt Ihr irgendeine Idee woran das liegen kann, oder was ich noch ausprobieren könnte?
LG
Christoph
EDIT: Ignoriert bitte die vielen casts und die uint32_t variablen in den Berechnungen, ich habe einfach alles versucht, große/kleine Variablen, mit/ohne Casts, etc... nichts hat etwas gebracht...
ich ärgere mich jetzt schon seit zwei Tagen mit einem Problem herum, und finde den fehler einfach nicht.
Ich baue gerade eine Terrariumsteuerung mit einem mega32, und verwende Temperatur- und Feuchtigkeitssensoren von Hygrosens mit I2C Interface:
2 Stück Temperatursensoren: http://shop.hygrosens.com/Sensormodule-acma/Temperatur-Sensormodule/Digitaler-Ausgang-I-C/Innovatives-ASIC-Modul-zur-Temperaturmessung-acma-2.html
1 Stück Feuchtigkeitssensor: HYT241, http://www.hygrosens.com/index.php?id=3738/
Zuerst hatte ich nur die beiden Temperatursensoren angeschlossen, da hat alles funktioniert. Hab die beiden Temperaturwerte korrekt eingelesen und am Display angezeigt.
Dann kam der Feuchtigkeitssensor dazu. Ich habe die Terrariumsteuerung abgeschalten, den Feuchtigkeitssensor angeschlossen, und die Steuerung wieder eingeschlten, also nichts am Code verändert. Der Controller hat sich genau dann aufgehängt, wo er die Temperatursensorwerte einlesen hätte sollen.
Das sollte er eigentlich nicht tun oder?
Ich hab dann ein neues Unterprogramm geschrieben, in dem der Feuchtigkeitswert eingelesen wird, rübergespielt - und es hat natürlich auch nicht funktioniert, er ist wieder hängen geblieben dort wo er die Temperaturwerte einlesen sollte.
Dann hab ich das einlesen der Temperaturwerte auskommentiert, und sofort hat alles funktioniert: Feuchtigkeit wurde eingelesen und korrekt am Display angezeigt.
Ich bekomm es einfach nicht hin dass Temperatur und Feuchtigkeit gleichzeitig funktionieren...
Adressproblem ist es keines, das hab ich schon 1000 Mal nachgeprüft.
Hier ist mein Code:
HYGROSENS_I2C.C
void update_temp1()
{
uint32_t tempa, tempb;
uint8_t temphigh, templow;
i2c_start(TEMP1+I2C_READ);
temphigh = i2c_readAck();
templow = i2c_readNak();
i2c_stop();
tempa=(temphigh&0b01111111)*256;
tempb=(templow&0b11111110);
temp1=((tempa+tempb)*10)/256-320;
}
void update_temp2()
{
uint32_t tempa, tempb;
uint8_t temphigh, templow;
i2c_start(TEMP2+I2C_READ);
temphigh = i2c_readAck();
templow = i2c_readNak();
i2c_stop();
tempa=(temphigh&0b01111111)*256;
tempb=(templow&0b11111110);
temp2=((tempa+tempb)*10)/256-320;
}
void feuchte_init()
{
i2c_start(FEUCHTE1+I2C_WRITE);
i2c_stop();
}
void update_feuchte1()
{
uint8_t byte1=0, byte2=0, byte3=0, byte4=0;
i2c_start(FEUCHTE1+I2C_READ);
byte1=i2c_readAck();
byte2=i2c_readAck();
byte3=i2c_readAck();
byte4=i2c_readNak();
i2c_stop();
i2c_start(FEUCHTE1+I2C_WRITE);
i2c_stop();
feuchte1=(uint32_t)((((byte1&0b00111111)*(uint32_t)256+byte2)*(uint32_t)1000)/(uint32_t)16383);
feuchte1_temp=(uint32_t)((((byte3*(uint32_t)256+(b yte4&0b11111100))*(uint32_t)165)/(uint32_t)16383)-(uint32_t)40);
}
HYGROSENS_I2C.H
// DEFINES
#define TEMP1 0b00010010 // I2C-Adresse Temperatursensor 1
#define TEMP2 0b00010100 // I2C-Adresse Temperatursensor 2
// #define FEUCHTE1 0b00100010 // I2C-Adresse Temperatursensor 2
// VARIABLEN
volatile unsigned long temp1; // (uint32_t) Globale Variable für Temperatursensor 1 [Zehntel-°C]
volatile unsigned long temp2; // (uint32_t) Globale Variable für Temperatursensor 2 [Zehntel-°C]
volatile unsigned long feuchte1; // (uint32_t) Globale Variable für Feuchtigkeit [Zehntel-%]
volatile unsigned long feuchte1_temp; // (uint32_t) Globale Variable für die Temperatur des Feuchtesensors [Zehntel-°C]
// DEKLARATIONEN
void feuchte_init();
void update_feuchte1();
void update_temp1();
void update_temp2();
HAUPTPROGRAMM (Ausschnitt)
int main(void)
{
...
feuchte_init();
...
if(timer10ms>=100) // folgendes wird jede Sekunde wiederholt
{
timer10ms=0;
...
update_temp1();
update_temp2();
update_feuchte1();
...
// Print Temp1
lcd_gotoxy(0,2);
lcd_var32(temp1/10);
lcd_putc('.');
lcd_var32(temp1%10);
lcd_putc('ß'); // ß=° am Display
lcd_putc('C');
// Print Temp2
lcd_gotoxy(7,2);
lcd_var32(temp2/10);
lcd_putc('.');
lcd_var32(temp2%10);
lcd_putc('ß'); // ß=° am Display
lcd_putc('C');
// Feuchte anzeigen
lcd_gotoxy(15,2);
lcd_var32(feuchte1);
lcd_gotoxy(15,3);
lcd_var32(feuchte1_temp);
...
}
else;
...
}
Habt Ihr irgendeine Idee woran das liegen kann, oder was ich noch ausprobieren könnte?
LG
Christoph
EDIT: Ignoriert bitte die vielen casts und die uint32_t variablen in den Berechnungen, ich habe einfach alles versucht, große/kleine Variablen, mit/ohne Casts, etc... nichts hat etwas gebracht...