Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

I2C-PC-Interface-Software Kategorie: I²C-Bus (von Christoph Fuest - 29.09.2005 13:59)


Hallo!

Ich habe hier das I2c-PC-Interface aus dem cctools-Shop. Das funktioniert ganz prächtig unter Windows
mit dem Comm-Control unter VisualBasic. Da mein Serverchen, der das Ding bekommen soll, aber
unter Linux läuft, dachte ich mir: Schreib ich einfach mal in C nach. Also habe ich folgendes geschrieben:

#include
#include
#include
#include


#define true -1
#define false 0

#define DELAY 0.0001


int fd=0; //Dateihandle
int status=0; //Für ioctl


unsigned char dtr(unsigned char state) {
    status=0;
    ioctl(fd, TIOCMGET, &status);
    if (state!=0)
        status &= TIOCM_DTR;
    else
        status &= ~TIOCM_DTR;

    ioctl(fd, TIOCMGET, &status);
    //wait(DELAY);
}

unsigned char rts(unsigned char state) {
    status=0;
    ioctl(fd, TIOCMGET, &status);
    if (state!=0)
        status &= TIOCM_RTS;
    else
        status &= ~TIOCM_RTS;

    ioctl(fd, TIOCMGET, &status);
    //wait(DELAY);
}

unsigned char cts() {
    ioctl(fd, TIOCMGET, &status);
    //wait(DELAY);
    if ((status & TIOCM_CTS) > 0)
        return -1;
    else
        return 0;
}

unsigned char send(unsigned char data) {
    unsigned char result;

    rts(data & 0x80);
    dtr(true);
    dtr(false);

    rts(data & 0x40);
    dtr(true);
    dtr(false);

    rts(data & 0x20);
    dtr(true);
    dtr(false);

    rts(data & 0x10);
    dtr(true);
    dtr(false);

    rts(data & 0x8);
    dtr(true);
    dtr(false);

    rts(data & 0x4);
    dtr(true);
    dtr(false);

    rts(data & 0x2);
    dtr(true);
    dtr(false);

    rts(data & 0x1);
    dtr(true);
    dtr(false);

    rts(true);
    dtr(true);
    result=~cts();
    dtr(false);

    return result;
}

/*
int receive(int ackn) {
    int result=0;

    rts(true);
    dtr(true);
    if (cts()) result=128;
    dtr(false);

    dtr(true);
    if (cts()) result+=64;
    dtr(false);

    dtr(true);
    if (cts()) result+=32;
    dtr(false);

    dtr(true);
    if (cts()) result+=16;
    dtr(false);

    dtr(true);
    if (cts()) result+=8;
    dtr(false);

    dtr(true);
    if (cts()) result+=4;
    dtr(false);

    dtr(true);
    if (cts()) result+=2;
    dtr(false);

    dtr(true);
    if (cts()) result+=1;
    dtr(false);

    rts(ackn);
    dtr(true);
    dtr(false);

    return result;
}
*/


unsigned char i2c_start(unsigned char addr) {
    dtr(true);
    rts(true);
    rts(false);
    dtr(false);
    rts(true);
    return send(addr);
}

unsigned char i2c_stop() {
    rts(false);
    dtr(true);
    rts(true);
}

unsigned char setpcf(unsigned char addr, unsigned char state) {
    i2c_start(addr);
    send(state);
    i2c_stop();
}


int main(int argc, char** argv) {
    unsigned addr;
    unsigned state;

    if (argc != 3) {
        printf("Falsche ParameterzahlnSyntax:n  %s addr staten", argv[0]);
        return 1;
    }

    if ((fd=open("/dev/ttyS0", O_RDWR)) < 0) {
        printf("Fehler beim Oeffnen der Schnittstelle...n");
        return 1;
    }

    sscanf(argv[1],"%d",&addr);
    sscanf(argv[2],"%d",&state);

    addr=addr*2+64;

    printf("Verwende Adresse %d...n", addr);

    setpcf(addr,state);


    close(fd);
}


Dann rufe ich das ganze so wie's gedacht ist mit ./a.out 6 255 bzw. ./a.out 6 0 auf, um alle Relais auf
der Relaisplatine (Adresse 6=64+2*6=76) stimmt. Die receive-Funktion habe ich mal auskommentiert,
die brauche ich ja hierfür nicht. Was mache ich falsch? Muss ich da evtl. noch warten, weil's zu schnell
läuft oder was?

Mit freundlichen Grü�en,

Christoph


    Antwort schreiben


Antworten:

Re: I2C-PC-Interface-Software (von André H. - 8.10.2005 18:39)
    Re: I2C-PC-Interface-Software (von Christoph Fuest - 10.10.2005 18:20)
        Re: I2C-PC-Interface-Software (von JackFrost - 10.10.2005 21:56)
            Danke, probiere ich aus (von Christoph Fuest - 16.10.2005 21:27)