I2C nur maximal 70kHz an PIC 16F818

OP #2385739
Lesenswert?

Hallo

Ich möchte einen PIC 16F818 als I2C Master verwenden um einen 
Temperatursensor TMP100 zu betreiben.

Ich verwende den internen Oscilator mit 8Mhz.

CCS 4.122 Testversion

Mein Problem:
Ich kann mit dem Oszilloskop nur eine Busgeschwindigkeit von ca. 70 kHz 
messen. Dabei sollten es im "slow" schon 100 kHz sein. Umstellen auf 
"fast" bringt keine Veränderung.

Jemand eine Idee was ich falsch mache oder vergessen habe?

Bin noch recht neu in diesem Gebiet und brauche nachdem ich zwei Tage 
mit Fehler- bzw Web-Suche verbracht habe eure Hilfe.

Schon mal vielen Dank im Vorraus.
Angehängte Dateien:
Gast #2385852
Lesenswert?

Hi!

Ich kenne den µC nicht, daher kann ich zum Code nichts sagen.
Aber:
Wie groß sind dein Pullup Widerstände an SDA und SCL?
Versuch mal in der main Daten zu übertragen, nicht nur start und stop.
Gast #2386025
Lesenswert?

Hast du ein Oszi?
Kannst du mal Bilder von dem Signalverlauf zeigen?

1,8k und 15pf gibt ein tau von ca. 27ns. Das sind 37MHz. Das müsste also 
reichen. (Ich weiß, dass die Rechnung so nur sehr grob ist. Da das 
Ergebnis aber weit von den 100 kHz weg ist, kann man das 
vernachlässigen).

Hast du noch Kondensatoren im parallel zu SCL oder SDA? Kommen keine 
Daten zurück oder gibt es erst gar keine Ausgabe?

Gruß
PP
Gast #2386032
Lesenswert?

Achso, die Ausgabe ist nur 70 kHz...
Dann ist es wohl ein Softwarefehler.

Muss in die Main nicht noch ein I2C Init?
Mach mal nach dem Senden des Startbits, der Daten und des Stopbits 
jeweils ne Pause von 1ms.

Gruß
PP
OP #2386051
Lesenswert?

Also über das init hab ich in der Hilfe nichts gefunden.
So sieht mein Main nun auch:
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_oscillator(OSC_8MHZ);
   int Temp;


   while(true){
      i2c_start();
      delay_ms(1);
      i2c_write(0b01001111);
      delay_ms(1);
      Temp = i2c_read();
      delay_ms(1);
      i2c_stop();
   }
}

Das ergebnis ist wie folgt (Gemessen an SCL):
Einige rechteckige Pulse die sich auf dem Osziloskop überschneiden. Dann 
eine Pause von ca 900µs dann wieder von Anfang
Angehängte Dateien:
Gast #2386088
Lesenswert?

Benjamin K. schrieb:
> Hier der single-shot, hab die zeiteinstellung minimal verändert.
>
> Aber warum verändert sich denn SCL? Der takt müsste doch immer der
> gleiche sein, oder?

Da hast du Recht. Außerdem müsste SCL in der Pause auf High bleiben.
Sorry, da bin ich mit meinem Latein am Ende.
Gast #2386204
Lesenswert?

Häh? bist Du dir sicher?
Im Datenblatt steht ein sog. Firmeware Controlled Master Mode.

Was mich eher stuzig macht, sind die Delays von je 1ms. Bist Du Dir 
sicher, das Du dir den Bus nicht selbst ausbremst? Schau mal, ob das 
nicht noch irgendwelche Delays sind.

Und... wiso ist Dir denn die Busgeschwindigkeit so wichtig, wenn Du in 
Deinem SourceCode schon 3mal eine ms wartest???
Gast #2386306
Lesenswert?

Benjamin K. schrieb:
> Firmeware Controlled Master Mode ist ja per software.

10.3.2 MASTER MODE OPERATION
Master mode operation is supported in firmware using
interrupt generation on the detection of the Start and
Stop conditions.

(PIC16F818/819 Data Sheet)

Das bedeutet das du in der Software lediglich die Conditions abfangen 
mußt, den Rest steuert die SSP selsttätig.

Mit anderen Worten:

Das ganze zeitaufwendige bitgefiddle und geschiebe entfällt, lediglich 
ein paar Bus Statis muß die Software per Interrupt behandeln. Das muß du 
ja so der so wenn das näcshte Datentelegramm gesendet werden soll. Es 
ist halt ein wenig zeitkritisch, das entfällt bei ner vollen Master 
Implementierung.
Gast #2386320
Lesenswert?

Benjamin K. schrieb:
> Hier der single-shot, hab die zeiteinstellung minimal verändert.
>
> Aber warum verändert sich denn SCL? Der takt müsste doch immer der
> gleiche sein, oder?

Das hängt vom Slave ab,  z.B. bei clock stretching (s. I2C specs wobei 
der slave die SCL Leitung pullt). Clockdauer ist wenn ich das richtig 
sehe 5ms ~ 200kHz. Woher hast du die 70 khz?

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