Forum: Mikrocontroller und Digitale Elektronik Hygrosens TEMOD-I2C unter Linux (OpenWRT)


von Emil B. (joky)


Lesenswert?

Hallo Leute,

ich benutze einen Linux-Router (TL-MR3020), um gewisse einfache 
Steuerungen zu realisieren und diese über W-Lan fernzusteuern.

Ich wollte nun ein Hygrosens TEMOD-I2C Modul in Betrieb nehmen. Die 
Kommunikation über I2C dürfte soweit funktionieren (2 MOSFET zur 
Pegelwandlung, am Oszi sehe ich relativ saubere Rechteck-Signale). Mit 
dem Programm "i2cdetect" finde ich auch das Modul unter der Adresse 
0x52, doch dieses Modul auszulesen bereitet mir einige Schwierigkeiten:
1
# i2cdump  -y 0 0x52 w
2
     0,8  1,9  2,a  3,b  4,c  5,d  6,e  7,f
3
00: a11c a11c a11c a11c a11c a11c a11c a11c
4
08: a11c a11c a11c a11c a11c a11c a11c a11c
5
10: a11c a11c a11c a11c a11c a11c a11c a11c
6
18: a11c a11c a11c a11c a11c a11c a11c a11c
7
20: a11c a11c a11c a11c a11c a11c a11c a11c
8
28: a11c a11c a11c a11c a11c a11c a11c a11c
9
30: a11c a11c a11c a11c a11c a11c a11c a11c
10
38: a11c a11c a11c a11c a11c a11c a11c a11c
11
40: a11c a11c a11c a11c a11c a11c a11c a11c
12
48: a11c a11c a11c a11c a11c a11c a11c a11c
13
50: a11c a11c a11c a11c a11c a11c a11c a11c
14
58: a11c a11c a11c a11c a11c a11c a11c a11c
15
60: a11c a11c a11c a11c a11c a11c a11c a11c
16
68: a11c a11c a11c a11c a11c a11c a11c a11c
17
70: a11c a11c a11c a11c a11c a11c a11c a11c
18
78: a11c a11c a11c a11c a11c a11c a11c a11c
19
80: XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
20
21
22
# i2cget -y 0 0x52 0 w
23
0xa11c


Dieser Wert wird ändert sich jedesmal, wenn ich das Modul an die 5V 
hänge (etwa 0x950d, 0xcf3b, 0x3f10, ). Ab dem Zeitpunkt, zu dem ich 
diesen Wert abhole, ändert sich auch die analoge Ausgangsspannung (0-5V) 
nicht mehr.

Der analoge Wert stimmt, doch der digitale Wert schwankt sehr stark. 
Weiters kann ich mir aus den Datenblättern keinen Reim daraus machen, 
wie man ohne dem USB-Modul von Hygrosens eine neue AD-Wandlung anstoßen 
kann,..


Kann mir jemand weiterhelfen - auch wenn es hier nicht um einen 
konventionellen Mikrocontroller geht?

Besten Dank im Voraus!!

von spess53 (Gast)


Lesenswert?

Hi

>Mit dem Programm "i2cdetect" finde ich auch das Modul unter der Adresse
>0x52, doch dieses Modul auszulesen bereitet mir einige Schwierigkeiten:

Das Datenblatt sagt aber:

'Die Adresse des Bausteins ist default 0x78'

MfG Spess

von Emil B. (joky)


Lesenswert?

Ja, aber dennoch antwortet das Modul doch unter der Adresse 0x52!?

Die Programme aus dem lm-lensors Paket funktionieren leider nur bis zur 
0x77, daher werde werde ich mal versuchen, die Dinger mit einem selbst 
geschriebenen C-Programm unter der Adresse 0x78 anzusprechen, entweder 
auf einem AVR oder wieder auf einem Linux-Board,.. was schneller geht.

Danke vorerst!

von Emil B. (joky)


Lesenswert?

Hallo!
ich habe nun einen simplen C-Code zum Testen gebastelt:
1
#include <glib.h>
2
#include <glib/gprintf.h>
3
#include <errno.h>
4
#include <string.h>
5
#include <stdio.h>
6
#include <stdlib.h>
7
#include <unistd.h>
8
#include <linux/i2c-dev.h>
9
#include <sys/ioctl.h>
10
#include <sys/types.h>
11
#include <sys/stat.h>
12
#include <fcntl.h>
13
14
void main(void) {
15
    int file;
16
    int len;
17
    char filename[40];
18
    const gchar *buffer;
19
    int addr = 0x78;        // The I2C address of the ADC
20
21
    sprintf(filename,"/dev/i2c-0");
22
    if ((file = open(filename,O_RDWR)) < 0) {
23
        perror("Failed to open the bus.");
24
        /* ERROR HANDLING; you can check errno to see what went wrong */
25
        exit(1);
26
    }
27
28
    if (ioctl(file,I2C_SLAVE,addr) < 0) {
29
        perror("Failed to acquire bus access and/or talk to slave.\n");
30
        /* ERROR HANDLING; you can check errno to see what went wrong */
31
        exit(1);
32
    }
33
34
    char buf[10] = {0};
35
36
    // Using I2C Read
37
    len=read(file,buf,2);
38
39
    if (len != 2) {
40
        /* ERROR HANDLING: i2c transaction failed */
41
        printf("Failed to read from the i2c bus: Error %02d, len:  %02d\n", errno, len);
42
        perror("Failed to read from the i2c bus");
43
    } else {
44
        printf("Len: %d, Byte 0: %x, Byte 1: %x\n",len, buf[0], buf[1]);
45
    }
46
47
}

Ein paar mal antwortet das Modul auch, meist gibts jedoch nur einen 
Fehler:
1
# ./test.o
2
Failed to read from the i2c bus: Error 06, len:  -1
3
Failed to read from the i2c bus: No such device or address
4
# ./test.o
5
Len: 2, Byte 0: ffffffff, Byte 1: ffffffff
6
Channel 8 Data:  0.000000

Der Bus an sich dürfte funktionieren, zwei PCF8574P kann ich ohne 
Probleme abfragen,...


Liebe Grüße!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.