- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Projekt PCF8591

  1. #11
    Erfahrener Benutzer Robotik Visionär Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    37
    Beiträge
    5.082
    Anzeige

    Praxistest und DIY Projekte
    Zeig einmal dein Programm. Dann kann man helfen.

    MfG Hannes

  2. #12
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    Code:
    #include "asuro.h"
    #include "i2c.h"
    #include "myasuro.h"
    #define pcf8591_address 0x90           // I2C Adresse des PCF8574
    
    
    //liest einen ADC Wert vom PCF8591
    unsigned char read_pcf8591_adc(unsigned char adc)
    {
        unsigned char ret;
        unsigned char byte = 0;
    
        ret = StartI2C(pcf8591_address+WriteI2C);  // Sende Start Condition
        if (ret == 0)
    
        ret = WriteI2C(adc);                // Senden des Control Bytes startet die A/D Wandlung
          StopI2C();                            // Sende Stop Condition, Bus freigeben
        Sleep(10);                             // Warten bis A/D Wandlung benedet (mind. 90µs)
        ret = StartI2C(pcf8591_address+ReadI2C);  // Sende Start Condition
    
        if (ret == 0)
        {
           // Mehrmaliges Lesen um alte A/D Werte zu ignorieren
           byte = ReadI2C(1);      // Lese Byte + acknowledge
           byte = ReadI2C(0);      // Lese Byte + no acknowledge
        }
        else ret = 3;
        StopI2C();                           // Sende Stop Condition, Bus freigeben
        return byte;
    }
    
    int main(void)
    {
        unsigned char rled;
        unsigned char lled;
        Init();
        InitI2C();
        FrontLED(ON);
        while(1)
        {
        rled = read_pcf8591_adc(0);
        lled = read_pcf8591_adc(1);
        SerPrint("\r\n Port 1: ");
        SerWrite(rled,3);
        SerPrint("\r\n Port 2: ");
        SerWrite(lled,3);
        Msleep(500);
       }
        return 0;
    }

  3. #13
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Vielleicht hast du SDA und SCL vom I2C Bus vertauscht. Laut der myasuro.h muss SDA mit ADC2 und SCL mit ADC3 verbunden werden.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    Geht das im Programm einfach zu ändern?

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    Laut meiner myasuro.h ist es anders rum.
    Code:
    /* I2C Bus Definitionen */
    
    //#define MY_I2C_SDA     PC3
    //#define MY_I2C_SCL     PC2
    
    /* Fuer das LCD Modul aus dem Asuro Buch gilt folgende Pinbelegung */
    #define MY_I2C_SDA     PC3
    #define MY_I2C_SCL     PC2
    Ich habe aber auch schon nachgesehen und meiner Meinung nach stimmt der Anschluss. Ich habe aber auch die myasuro.h geändert und mein Prog neu erstellt und es werden auch keine richtigen Daten und auch keine Änderrungen übertragen.
    Muss ich eigentlich die originalen Pulldown Widerstände auf der Asuroplatine entfernen, oder kann man diese eingelötet lassen? (diese 20kOhm)

  6. #16
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Die 20kOhm PullDown sind bei meinem Asuro auch drin. Die stören nicht weiter.
    Normalerweise muss die AsuroLib neu übersetzt werden, wenn Werte in der myasuro.h geändert werden. Vielleicht hilft das ja. Ansonsten würde ich die read_pcf8591_adc Funktion so ändern, das der Rückgabewert im Fehlerfall eindeutig ist. Z.B. so:
    Code:
      if(ret) byte = 0xFF;
      return byte;
    Was hast du mit den nicht benutzten A/D Eingängen gemacht? Nicht benutze Eingänge müssen laut Datenblatt auf GND gelegt werden.

  7. #17
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    Bis jetzt sind die zwei noch offenen Eingänge nicht belegt. Es soll aber noch ein US-Modul aus dem Buch "Mehr Spaß mit ASURO" auf einen Eingang gelegt werden.

  8. #18
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    Ist der Befehl eigentlich dazu geeignet den byte Wert zu senden?
    SerWrite(rled,3);
    Oder hat jemand einen besseren?

  9. #19
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Ups, deine Ausgabe Funktion habe ich mir ja gar nicht so richtig angeschaut.
    Code:
    PrintInt(rled)
    Sollte man hier verwenden, nicht SerWrite. Dann sollte es auch endlich funktionieren.

  10. #20
    Neuer Benutzer Öfters hier
    Registriert seit
    28.08.2009
    Beiträge
    16
    So ich habe den Code geändert und die 2 offenen Eingänge auf Masse gezogen. Über das Terminal bekomme ich immer den Wert 255 gesendet, obwohl sich die Spannung an den Eingänger ändert.
    Wer hat da ne Idee?
    Code:
    #include "asuro.h"
    #include "i2c.h"
    #include "myasuro.h"
    #define pcf8591_address 0x90           // I2C Adresse des PCF8574
    
    
    //liest einen ADC Wert vom PCF8591
    unsigned char read_pcf8591_adc(unsigned char adc)
    {
        unsigned char ret;
        unsigned char byte = 0;
    
        ret = StartI2C(pcf8591_address+WriteI2C);  // Sende Start Condition
        if (ret == 0)
    
        ret = WriteI2C(adc);                // Senden des Control Bytes startet die A/D Wandlung
          StopI2C();                            // Sende Stop Condition, Bus freigeben
        Sleep(10);                             // Warten bis A/D Wandlung benedet (mind. 90µs)
        ret = StartI2C(pcf8591_address+ReadI2C);  // Sende Start Condition
    
        if (ret == 0)
        {
           // Mehrmaliges Lesen um alte A/D Werte zu ignorieren
           byte = ReadI2C(1);      // Lese Byte + acknowledge
           byte = ReadI2C(0);      // Lese Byte + no acknowledge
        }
        else ret = 3;
        if(ret) byte = 0xEE;
        StopI2C();                           // Sende Stop Condition, Bus freigeben
        return byte;
    }
    
    int main(void)
    {
        unsigned int rled;
        unsigned char lled;
        Init();
        InitI2C();
        FrontLED(ON);
        while(1)
        {
        rled = read_pcf8591_adc(0);
        lled = read_pcf8591_adc(1);
        SerPrint("\r\n Port 1: ");
        PrintInt(rled);
        SerPrint("\r\n Port 2: ");
        PrintInt(lled);
        Msleep(500);
       }
        return 0;
    }

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress