Probleme mit PCF8591 an PIC32

OP #3217151
Lesenswert?

Hallo,

ich versuche seit einiger Zeit den PCF8591 mit einem PIC32 zum laufen zu 
bringen.
Ich möchte gerne die angelegte Spannung (1V) am AD-Eingang über die I2C 
Schnittstelle auslesen.
Jedoch bekomme ich bei jeder Wandlung nur den Wert 0xFF zurück.

Pull-Ups an SCL und SDA sind vorhanden.

Im Anhang ein Oszi-Bild der Datenübertragung.

Hier der Code für das Auslesen der Daten:
1
unsigned char extadc_get_voltage(unsigned char adress, unsigned char channel)
2
{
3
    unsigned int i = 350;
4
  unsigned char ad_value = 0;
5
        I2CStart(I2C1);
6
        IdleI2C1();
7
        MasterWriteI2C1(adress);
8
        IdleI2C1();
9
        MasterWriteI2C1(0x40 | channel);
10
        IdleI2C1();
11
        StopI2C1();
12
        IdleI2C1();
13
       do
14
           i--;
15
       while(i);
16
        StartI2C1();
17
        IdleI2C1();
18
  MasterWriteI2C1(adress | 0x01);
19
        IdleI2C1();
20
        ad_value = MasterReadI2C1();
21
        IdleI2C1();
22
        AckI2C1();
23
        IdleI2C1();
24
        ad_value = MasterReadI2C1();
25
        IdleI2C1();
26
        NotAckI2C1();
27
        IdleI2C1();
28
        I2CStop(I2C1);
29
        IdleI2C1();
30
  return ad_value;
31
}

Mit der Do-While Schleife wird eine Wartezeit von ca. 90µs für die 
Wandlung realisiert.

Ich hoffe Ihr könnt mir helfen, warum ich nur den Wert 0xFF als Antwort 
bekomme.
Angehängte Dateien:
#3300672
Lesenswert?

Ich bin gerade auch dabei die I2C Schnittstelle bei einem PIC32 in gang 
zu bekommen.
Hab momentan noch ein paar Probleme damit, da du sie ja scheinbar in 
gang bekommen hast könntest du mir dein Programm zusenden?

Ich komm momentan mit meinem Versuch einfach nicht weiter und weiß auch 
nicht woran es liegt.

Danke schon mal im Vorraus.
OP #3305774
Lesenswert?

Hallo,

ich habe das Problem gelöst.

Hier der Code:
1
unsigned char extadc_get_voltage(unsigned char adress, unsigned char channel)
2
{
3
    unsigned int i = 350;
4
    unsigned char ad_value = 0;
5
    StartI2C1();
6
    IdleI2C1();
7
    MasterWriteI2C1(adress);
8
    IdleI2C1();
9
    MasterWriteI2C1(0x40 | channel);
10
    IdleI2C1();
11
    MasterWriteI2C1(0x00);
12
    IdleI2C1();
13
    StopI2C1();
14
    IdleI2C1();
15
    do
16
        i--;
17
    while(i);
18
    StartI2C1();
19
    IdleI2C1();
20
    MasterWriteI2C1(adress | 0x01);
21
    IdleI2C1();
22
    ad_value = MasterReadI2C1();
23
    AckI2C1();
24
    IdleI2C1();
25
    ad_value = MasterReadI2C1();
26
    NotAckI2C1();
27
    IdleI2C1();
28
    StopI2C1();
29
    IdleI2C1();
30
    return ad_value;
31
}

Ich habe auch meine Pull-Ups von 3,3k auf 1k reduziert, was sehr viel 
bewirkt hat ;-)

Ich hoffe die Funktion hilft dir weiter dein Problem zu finden. Mein 
gesamtes Programm kann ich dir leider nicht senden.

Gruß
#3307849
Lesenswert?

Hallo,

alles klar vielen Dank für deine Antwort.
Kannst du mir noch sagen was du mit channel übergibst?
Ich denke mir das es eine spezielle übergabe an den Slave ist oder?

Was noch interessant zu wissen wäre ist, wie hast du die Schnittstelle 
initialisiert und in welche Richtung hast du die Port Pins eingestellt 
Input oder Output?

Ich denke das hier momentan noch mein Hauptproblem liegen wird.

Danke und Gruß
OP #3308551
Lesenswert?

Hallo,

der PCF8591 hat 4 verschiedene Kanäle, welche ich mit channel seperat 
ansprechen kann.

Hier die Initialisierung:
1
//Initialisierung des PICs
2
#define SYS_FREQ (12000000L)
3
#define PBCLK       SYS_FREQ/4
4
#define Fsck        375000
5
#define BRG_VAL     (PBCLK/2/Fsck)
6

7
//
8
OpenI2C1( I2C_EN, 100000);

Mehr Einstellungen habe ich für die I²C Schnitstelle nicht vorgenommen.

Ich hoffe das hilft dir.

Aber wenn du dein Problem ein wenig genauer beschreibst, können wir dir 
auch besser helfen.

Gruß
#3308740
Lesenswert?

Hallo.

Ich hab jetzt mal mein Programm so wie du geschrieben, hab meine Adresse 
und das Databyte noch geändert aber ansonsten so wie deins.

Mein Problem ist das ich keine Kommunikation zum Slave herstellen kann.
Ich hab auch den Bus mit dem Oszi gemessen ob sich da etwas tut, aber da 
hab ich nur die 3,3V von den Pull-Up Widerstände.

Die Pull-Up Widerstände haben einen Wert von 4,7k.
Du hast geschrieben das du deine gegen 1k ausgetauscht, lief es dann 
besser?
Bzw. lief es bei dir von anfang an (wenn die Slaveadresse gepasst 
hätte)?

Was auch noch sein könnte das es an meiner Berechnung der BaudRate 
liegt.
Du hast bei dir auf dem Board scheinbar einen 12 MHZ Quarz verbaut oder?
Ich habe bei mir einen 8MHz Quarz drauf.

Gruß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren