Temperaturmessung mit dem LM75 und IO-Warrior

Dies ist mein erster Versuch, mit dem IO-Warrior etwas über den I²C-Bus anzusteuern. Daher wähle ich ein Bauteil aus, welches unkompliziert anzusteuern und auf die Schnelle zu beschaffen ist. Meine Wahl fällt auf einen Temperatursensor LM75 aus der Bastelkiste.

Die Hardware...

LM75 mit Adapter von SO8 auf DIL8 LM75 mit Adapter von SO8 auf DIL8
Leider gibt es den LM75 nur im SO8 Gehäuse. Doch ein Adapter für DIL ist schnell und billig herzustellen: Einfach mit kurzen Drähtchen in einen übrigen DIL-8 Sockel einlöten (ich hatte keinen DIL-8 Sockel mehr, also habe ich einfach einen DIL-14 Sockel passend abgeschnitten...)

... und die Programmierung

Zu Testzwecken hackte ich schnell ein paar Zeilen Code zusammen, um das Temperaturregister zu lesen. Dies ist die einfachste Variante, den LM75 anzusteuern, da lediglich 2 Bytes über den I²C gelesen werden müssen.

uint8_t buf[9];
uint8_t i2c_addr = 0x48;       /* LM75 auf Adresse 1001000 (A0-A2 = GND) */
buf[0]=0x01;                   /* Special function 01 = I²C */
buf[1]=0x01;                   /* Aktivieren */
ioctl(fd_if1, IOW_WRITE, &buf);
buf[0]=0x03;                   /* Befehl I²C Lesen */
buf[1]=2;                      /* Länge 2 bytes */
buf[2]=(i2c_addr<<1)|0x01;
ioctl(fd_if1, IOW_WRITE, &buf);
read(fd_if1, buf, 2);
printf("LM75 misst %d.%d°C\n", buf[0], (buf[1]&0x80)?5:0);

Meine Erkenntnisse nutzte ich dann, entsprechende Funktionen meiner libiow hinzuzufügen. Dadurch wird die Ansteuerung wesentlich einfacher:

uint8_t buf[2];
uint8_t i2c_addr=0x48;         /* LM75 auf Adresse 1001000 (A0-A2 = GND) */
iowh h;                        /* IO-Warrior device handle */
iow_i2c_enable(h);
iow_i2c_read(h, i2c_addr, buf, 2);
printf("LM75 misst %d.%d°C\n", buf[0], (buf[1]&0x80)?5:0);

Der obige Code ist nur ein minimalistischer Auszug, das vollständige Codebeispiel mit setzen der TOS und THYST Register gibts zum runterladen: i2c_lm75.c

Achtung, es wird zwingend meine libiow Version 0.9 oder neuer benötigt.
Ältere Versionen funktionieren aufgrund einer anderen (falschen) Interpretation der I²C Adresse nicht