Lieber Besucher, herzlich willkommen bei: LedStyles.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.
Aber zumindest nicht die Temperatur, sonst würde er sich ja ändern.|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 |
i2c_master_init();
while (1) {
// Temperatur holen
i2c_master_start();
i2c_master_read(0);
temp = i2c_master_read(1);
i2c_master_stop();
temp >>= 1;
[...]
|
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 |
i2c_master_init();
while (1) {
// Temperatur holen
i2c_master_start();
i2c_master_write(145); // Adresse senden, entspricht 0b10010001, alternativ 159 fuer 0b10011111
temp = i2c_master_read(0); // mit ACK, den Wert merken
temp2 = i2c_master_read(1); // mit NACK, den wert kann man verwerfen, wenn das LSB nicht interessiert
i2c_master_stop();
// temp >>= 1; <-- dies ist nicht notwendig, da nur das high-byte der Temperatur verwendet wird
[...]
|
|
|
Quellcode |
1 2 3 4 5 6 |
#define I2C_DDR DDRC // Register für die I2C Kommunikation #define I2C_DDR_REG_BIT DDC7 // #define I2C_PORT PORTC // I2C Port definition #define SCL PC6 // Port B Pin 1 #define SDA PC7 // Port B Pin 2 |
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 |
#define I2C_DDR DDRC // Register für die I2C Kommunikation #define I2C_DDR_REG_BIT DDC3 // #define I2C_PORT PORTC // I2C Port definition #define SCL PC4 #define SDA PC3 #define SDA_LESE_PIN PINC #define SDA_LESE_BIT SDA |
|
|
Quellcode |
1 2 3 4 5 |
i2c_master_start(); i2c_master_write(TEMP_ADDR); // TEMP_ADDR = 0b10010001 temp = i2c_master_read(0); temp2 = i2c_master_read(1); i2c_master_stop(); |
).|
|
Quellcode |
1 2 3 4 5 6 7 8 9 |
O 5V | R 2,5kOhm | |-- 10mV/K | LM335 | O GND |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Organized« (24. April 2012, 11:04)
Zitat
If the user has a fixed voltage source connected to the AREF pin, the user may not use the other reference voltage options in the application, as they will be shorted to the external voltage. If no external voltage is applied to the AREF pin, the user may switch between AVCC and 2.56V as reference selection. The first ADC conversion result after switching reference voltage source may be inaccurate, and the user is advised to discard this result.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Organized« (24. April 2012, 14:50)
Habe jetzt schon viel danach gesucht, aber leider finde ich keinen Artikel, Forumsbeitrag, o.ä. darüber.Assembler ist für mich genau so kryptisch wie Hieroglyphen, damit kann ich nichts anfangen.

|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
// ADC gemittelt auslesen
uint16_t readADC()
{
uint16_t erg;
uint8_t adlow, adhigh, tmp = 0, tmp1 = 0, tmp2 = 0, tmp3 = 0, messungen = 0, quit = 0;
while (quit != 1) {
ADCSRA |= (1 << ADSC); // ADC starten
while (ADCSRA & (1 << ADSC)); // Warten, bis beendet
adlow = ADCL;
adhigh = ADCH;
asm volatile ("add %[tmp1], %[adlow]" : [tmp1] "+r" (tmp1), [adlow] "+r" (adlow));
asm volatile ("adc %[tmp2], %[adhigh]" : [tmp2] "+r" (tmp2), [adhigh] "+r" (adhigh));
asm volatile ("adc %[tmp3], %[tmp1]" : [tmp3] "+r" (tmp3), [tmp1] "+r" (tmp1));
messungen++;
if (messungen == 255) // bei 256 Durchläufen
quit = 1; // abbrechen
}
if (tmp1 > 128) { // wenn größer als 128 muss aufgerundet werden
// Die folgenden beiden Zeilen erzeugen einen Fehler, deshalb erst mal weg gelassen
//asm volatile ("subi %[tmp2], low(-1)" : [tmp2] "+r" (tmp2));
//asm volatile ("sbci %[tmp3], high(-1)" : [tmp3] "+r" (tmp3));
}
adlow = tmp2;
adhigh = tmp3;
return adlow | (adhigh << 8);
}
|
|
|
Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
uint16_t readADC()
{
uint32_t sum = 0;
uint16_t i = 0;
uint8_t adlow, adhigh;
for (i = 0; i <= 255; i++) {
ADCSRA |= (1 << ADSC); // ADC starten
while (ADCSRA & (1 << ADSC)); // Warten, bis beendet
adlow = ADCL;
adhigh = ADCH;
sum += ADCL + (ADCH << 8);
}
return (uint16_t) (sum >> 8);
}
|
Falls das noch interessant ist: Den IC direkt in Wasser zu tauchen ist keine gute Idee, aber man kann den in einen Schlauch (nicht zu großer Durchmesser, Schrumpfschlauch eignet sich hervorragend) stecken, den Schlauch umklappen, so dass die die beiden Enden nebeneinander liegen und der Sensor dicht am Knick. Die Schlauchenden mit etwas Draht oder einem Kabelbinder zusammentüddeln, damit damit der Schlauch nicht wieder aufklappt und das Ganze dann in das Wasserglas stellen. Die Schlauchenden natürlich über der Wasseroberfläche. So ist das Ganze erstmal wasserdicht oder zumindest wassergeschützt und die thermische Kopplung eigentlich auch ausreichend. Außerdem kann man den Schlauch nachher wieder verwenden.Kann ich den IC in Wasser halten? Dann könnte ich es genau kalibrieren: Glas mit Wasser, IC und normales Termometer rein. Dann so lange am Poti spielen, bis die Werte überein stimmen.

