Forum: Mikrocontroller und Digitale Elektronik I2C timing problem


von Markus M. (mmax)


Angehängte Dateien:

Lesenswert?

Guten Morgen,

Ich versuche mit meinem TI Launchpad (MSP430G2553) den Drucksensor 
MS5611-01BA03 auszulesen. Das funktioniert auch recht gut, doch wenn ich 
die Kommunikation beschleunigen will, kommt nix mehr beim Master an.

Grundsätzlich startet man eine Messung, muss laut Datenblatt mindestens 
9.4ms warten und kann dann das Ergebnis auslesen. In meinem Fall muss 
ich aber knappe 100ms warten um Daten zu bekommen. Nachdem bei anderen 
Beispielen im Netz auch nicht so lang gewartet wird, wirds wohl an 
meinem Programm liegen.

Ausschnitt vom auslesen:
1
    i2cSetupTx( MS5611_ADDR_CSB_LOW );
2
    i2cTransmit( command, 1 );
3
    
4
    // Wait to finish conversion, 0.096 sec@1MHz, ~100ms (should be max 9.4ms)
5
    __delay_cycles(6000);
6
    // __delay_cycles(5500); // damit funktionierts nicht mehr
7
    
8
    // ADC read sequence
9
    i2cSetupTx( MS5611_ADDR_CSB_LOW );
10
    i2cTransmit( MS5611_CMD_ADC_READ, 1 );
11
    
12
    // Receive 3 byte answer from MS5611-01BA
13
    i2cSetupRx( MS5611_ADDR_CSB_LOW );
14
    i2cReceive( rxb, 3 );

Setz ich das __delay_cycles auf unter 6000, bleigt der Empfangsbuffer 
rxb leer. Ich verwende einen fertigen I2C Code (siehe Anhang) und denke 
mal, dass es daran liegen wird ... aber woran genau?

Bin für jede Hilfe, jeden Tip dankbar ... komm nämlich nicht mehr 
weiter.

Danke,
Max

von Tomas K. (Firma: tktronic) (tktronic)


Lesenswert?

1. mess doch mal die tatsächliche zeit, die dein delay() aufruf verbrät 
?

2. wie hoch ist die bitrate deiner I2C ?

3. wie ist der sensor konfiguriert ?


wenn du einen i2c trace machst und anschaust siehst du es evtl. selbst 
sofort. falls nicht, den trace mal posten.
falls du nicht weisst womit:

Beitrag "kennt jemand Logic Analyser von saleae.com"

gruss, tom.

von Markus M. (mmax)


Lesenswert?

Tomas Kuckenburg schrieb:
> 1. mess doch mal die tatsächliche zeit, die dein delay() aufruf verbrät

Stimmt, jetzt wo du fragst. Ich hab das total mit den 16us meines Timer 
interrupts verwechselt. Das delay() verzögert ja genau um einen Zyklus 
und das sind bei 1MHz Takt, 6ms ... das passt wär dann eh schneller als 
vermutet.

Mein Problem ist ja dass ich ganz schnell z.B. drei Messungen 
hintereinander machen und die dann mitteln will. Und im Moment komm ich 
nur auf max 5 Messungen pro Sekunde. Das ist zu langsam aber dann geht 
die Zeit wohl wo anders drauf.

> 2. wie hoch ist die bitrate deiner I2C ?

Laut i2cSetupTx() müssten es 1/12 vom Takt (SMCLK) sein.

> 3. wie ist der sensor konfiguriert ?

Da kann man nicht viel konfigurieren.

Ja eine logic Analyzer hab ich noch nicht, werd ich mir aber sicher 
zulegen. Da ich demnächst in China bin, will ich mir da einen günstigen 
besorgen. Mein Budget is leider begrenzt, tu ja auch nur ein bisserl 
herumbasteln.

Der wirds wahrscheinlich werden:
http://www.aliexpress.com/item/Saleae-Logic16-saleae16-USB-Logic-Analyzer-100M-16CH-support-1-15-official-version-and-1-16/690226600.html

Danke,
Max

von Markus M. (mmax)


Angehängte Dateien:

Lesenswert?

Stimmt, das Auslesen des Sensors ist eh schnell genug ... wird wohl an 
der seriellen Übertragung an den Computer liegen. Mache ich nämlich 3 
Messungen direkt hintereinander, werde ich nicht langsamer.

Also hier mal eine Grafikt der Druckes über 245 Samples mit einem Sample 
pro Sekunde, gemittelt über drei Samples.

Schaut schon mal nicht so schlecht aus.

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.