Forum: Mikrocontroller und Digitale Elektronik Probleme mit PCF8591 an PIC32


von Jürgen O. (eggae)


Angehängte Dateien:

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.

von Carsten M. (ccp1con)


Lesenswert?

Einfachste Erklärung, die I2C Adresse stimmt nicht.
Auf welche ist denn der PCF hard wired?

von Chris B. (chrisb20)


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.

von Jürgen O. (eggae)


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ß

von Chris B. (chrisb20)


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ß

von Jürgen O. (eggae)


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ß

von Chris B. (chrisb20)


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ß

von Chris B. (chrisb20)


Lesenswert?

Es geht doch!!!
Gestern hab ich noch ein weiteres Board bekommen, da hab ich das ganze 
jetzt mal drauf gespielt und dort gemessen und es läuft.
Ich seh wie der Bus versucht den Slave anzusprechen.

Danke für deine Hilfe, hat mich einen ganzen Schritt weitergebracht.

Gruß

von Jürgen O. (eggae)


Lesenswert?

Das freut mich, dass es bei dir nun auch endlich geht.
Das mit dem PIC32 ist doch nicht ganz so einfach, wie man denkt ;-)
(zumindest wenn man "blöde" Fehler macht, wie ich auch)

von Chris B. (chrisb20)


Lesenswert?

Ja ist schon etwas anders wie die PIC 10/12/16/18er Reihen.

Jetzt muss dann nur noch alles zusammen funktionieren, nochmal vielen 
Dank für deine Hilfe und Unterstützung.

Gruß

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.