Forum: Mikrocontroller und Digitale Elektronik MSP430 und MS5534 - Kommunikationsproblem


von Tobias W. (wib)


Lesenswert?

Hallo Leute,

ich bin mit meiner Kommunikation jetzt schon was weiter gekommen, und 
zwar scheint das Senden zu klappen, allerdings liegt beim MS5534 der 
DOUT durchgehend auf High, was ja nicht ganz Sinn der Sache ist. An MCLK 
liegen die geforderten 32,768 KHz an. Über DIN läuft ein Signal (mit 
Oszilloskop kontrolliert). Auf SCLK gibt es auch Signale.

Nur leider bekomme ich wie gesagt keine vernünftige Antwort.
Kann mir jemand helfen und hat nen Tipp wodran das liegen könnte?

Quelltext hängt an, gesteuert wird es über die letzte Methode 
read_absdruck().
MSP430 läuft mit 8MHz, WaitOnePulse() sollte ca. 200ns warten ( siehe 
Datenblatt http://www.intersema.ch/site/technical/files/ms5534.pdf )

Habs nach dem Beispiel hier aufgebaut: 
http://www.intersema.ch/site/technical/files/an502.pdf

Hoffe jemand kann mir helfen, stehe aufm Schlauch ;)

von Tobias W. (wib)


Angehängte Dateien:

Lesenswert?

Quelltext vergessen ^^

von magTobis (Gast)


Lesenswert?

lieber tobi, ich habe eine lösung für dich, die wäre, frag einfach 
deinen nachbar!! ;-)

von Tobias W. (wib)


Lesenswert?

Nein ;) erst wenn ich gleich zu genervt davon bin ;)
Jetzt such ich erst weiter...

von Stefan (Gast)


Lesenswert?

Ich hab mir das Datenblatt und Deinen Code mal überflogen...
Ich denke, Du hast da was missverstanden!
Die 200ns sind die Anstiegs- und Abfallzeiten der Taktflanken, keine 
Wartezeiten!
Dein MCLK muss im Bereich 30kHz - 35kHz liegen und das Tastverhältnis 
muss um die 50% betragen.
Bei 32,768kHz wären das also jeweils rund 15µs für High-/Low-Pegel 
Deines Taktsignals. Wenn Du also Deinen Takt generierst, musst Du 
zwischen den Flankenwechseln von Low nach High (und umgekehrt) jeweils 
15µs warten und nicht 200ns!

von Stefan (Gast)


Lesenswert?

Ja nee... vergiss es, falsch gelesen! ;-)
SCLK natürlich!!!
SCLK darf max. 500kHz sein. Wären dann aber bei 50% Tastverhältnis 
trotzdem 1µs statt 200ns.

von Tobias W. (wib)


Lesenswert?

Danke für die Hilfe, MCLK liegt auf 32,768KHz, passt also.
Da der MSP ja mit 8MHz läuft lasse ich ihn jetzt 8 Takte warten, was der 
1us entsprechen sollte oder?
Leider ändert das jedoch nichts, die Frage ist auch warum das SCLK 
Signal so anders aussieht als die Daten auf DIN...

von Stefan (Gast)


Lesenswert?

>warum das SCLK Signal so anders aussieht als die Daten auf DIN
Wie sieht's denn aus?
Kannst ein Bild oder 'ne Skizze posten?

Deine Wait-Funktion:
1
void WaitOnePulse(void)
2
{
3
    for (int i = 0; i < 2; i++);
4
}
schreit förmlich danach, dass der Compiler die wegen Nutzlosigkeit 
komplett weg-optimiert. Ich vermute mal, Du hast null Delay!

Wenn Du genau 8 Taktzyklen Delay brauchst, versuch's mal mit 8 NOP's.
Nicht schön, aber effektiv!

von Stefan (Gast)


Lesenswert?

Also noch mal so als Anregung:

1.)
SCLK darf maximal 500kHz betragen (und das auch nur bei 3,6V) !!!
Es steht Dir frei für SCLK auch eine wesentlich kleinere Frequenz zu 
wählen, was ich Dir -zumindest zum Testen- auch dringend empfehlen 
würde, um Fehler wegen zu hohem SCLK auszuschließen.

2.)
1
for (int i = 0; i < 9; i++)
2
{
3
  _NOP();
4
}
macht keine 8TZ Delay, sondern mehr, wegen Overhead der Schleife ;-)
Aber bei größeren Delay-Zeiten wird das vernachlässigbar(er)

von Tobias W. (wib)


Lesenswert?

Optimierungen sind deaktiviert, habs jetzt trotzdem mal mit NOPs 
gemacht:
1
void WaitOnePulse(void)
2
{
3
    for (int i = 0; i < 8; i++)
4
      asm("NOP");
5
}

plus Bild ausm Oszi...

http://zujasr40.multipic.de/

..001 zeigt 32KHz
..002 zeigt DIN
..003 zeigt DOUT
..004 zeigt SCLK

von Msp 4. (msp430_crew)


Lesenswert?

Hi!
Wie sieht denn Deine main aus? Was sendest Du dem Sensor?
Bewegt sich die Ausgangsdatenleitung überhaupt nicht?
Wie sieht die Beschaltung des MS5534 aus? Hast Du die Ports richtig 
definiert?

von Tobias W. (wib)


Lesenswert?

In der main rufe ich nur read_absdruck(); auf, vorher werden die Ports 
nat. gesetzt als Ausgang etc.

Der Sensor ist so angeschlossen 
http://zmwr3hoj.multipic.de/unbenannt.bmp.jpg

In der Main mache ich vorher folgendes:
1
P2DIR = 0x0B;               // P2.0, P2.1, P2.3 als Ausgang (AbsDruckSens)
2
P2SEL = 0x01;               // P2.0 als ACLK

Dann kommt der Funktionsaufruf read_absdruck();

Das ist eigentlich alles, läuft in nem größeren Programm, das funzt 
auch, nur das Auslesen klappt nicht so ;)

Außerdem hier nochma die #defines
1
// Absolutdrucksensor Datenuebertragung
2
#define SDI BIT1
3
#define SDO BIT2
4
#define SCK BIT3
5
#define PRESSURE 1
6
#define TEMPERATURE 0
7
8
#define HIGH 1
9
#define LOW 0

von Stefan (Gast)


Lesenswert?

DIN und SCLK-Leitung vertauscht?
Deine Daten an DIN (Bild2) sind mit 22,22kHz fast doppelt so schnell, 
wie SCLK (Bild4) mit 10,8kHz. Das kann so nicht sein!

Ausserdem läuft Dein MSP niemals mit 8MHz, denn Dein SCLK (vermutlich 
DIN ;-))
läuft mit 22,22kHz, was einer Wartezeit in WaitOnePulse() von etwa 22µs 
entspricht, was wiederum 180TZ @ 8MHz wären!

von Tobias W. (wib)


Lesenswert?

Stimmt, die Pins waren vertauscht ^^ Danke für den Hinweis.
Jetzt kommen Werte an, ich schau mal ob die passen und melde mich gleich 
nochmal.

von Tobias W. (wib)


Lesenswert?

Scheint zu funktionieren :)
Er gibt plausible Werte aus!
Danke für die Hilfe, ich hab 2 Schaltpläne vertauscht und dort waren die 
Pins ebenfalls einmal vertauscht ;)

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.