PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drucksensor MS5534 mit Atmega8 ansteuern



Robotik
19.05.2008, 22:48
Hi,

ich möchte den Drucksensor MS5534 an einen Atmega8 betreiben doch irgendwie weigert der sich ^^. Da der Sensor nur mit max 3,6V betrieben werden darf und der Atmega8 5V benötigt habe ich die 4 Leitungen durche einen Optokoppler (PC817) getrennt und jeder hat seine Spannung, beide sind mit Masse verbunden. "Sclk" und "Dout" (am Atmega8) habe ich mit einem Oszi überbrüft oder um genauer zu sein ein Programm auf dem PC was die Sounkarte als eingang benutzt. Die Signale stimmen mit denen im Datenblatt überein. Die Beiden Signale habe ich auch auf der anderen Seite des Optokoppler (zum Sensor) überprüft um einen Defekt auszuschließen. Was ich nicht überprüfen kann ist "MCLK" da das Programm nur bis 20kHz darstellen kann. "Mclk" erstelle ich mit dem Timer1 und lasse ihn einfach laufen da er das selbständig kann ohne das Main Programm zu unterbrechen. Um auszuschließen das "Mclk" eine falsche Frequenz ist habe ich mir von ELV den Geschwindigkeitssensor VAT 300 GS gekauft. Das ist der selbe Sensor in verbindung mit einem Atmega8L der für 3,6V ist. (Leider kann ich mit dem Signal, was der Atmega8L sendet, nix anfangen) Der Atmega8L generiert "Mclk" für den Sensor und ich greife den einfach ab um den selben bei meinem Sensor zu benutzen.

http://www.elv-downloads.de/service/manuals/VAT300GS/VAT300GS_KM_G_040413.pdf
http://www.amsys.de/sheets/amsys.de.ms5534c(e).pdf



'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 8000000 $baud = 9600 'Baudrate zum PC

Ddrb.2 = 1 'ausgang
Ddrb.3 = 0 'eingang
Portb.3 = 0 'pullup widerstand aus
Ddrb.4 = 1 'ausgang

'
Dout Alias Portb.2 ' DOUT = DIN MS5534
Din Alias Portb.3 ' DIN = DOUT MS5534
Sclk Alias Portb.4 ' SCLK = Sclk MS5534
'
Reset Dout
Reset Sclk

Dim Dat_00 As Byte ' Zwischenspeicher Daten
Dim Dat_01 As Byte

'Taktsignal
'===========================
Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang
'
Tccr1a = &B01000000 'Pin OC1A/PB1 togglen, kein PWM
Tccr1b = &B00001001 'Timer-Reset bei Compare, Clock/1
'
Compare1a = 250 'Vergleichswert setzen (OCR1AH+OCR1AL)





Do

Wait 1

Print "Start ";

'=== D1
Set Dout
Delay

'Bit 0
Set Sclk
Delay
Reset Sclk
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
'Delay

Reset Dout
Delay

'Bit 4
Set Sclk
Delay
Reset Sclk
'Delay

Set Dout
Delay

'Bit 5
Set Sclk
Delay
Reset Sclk
'Delay

Reset Dout
Delay

'Bit 6
Set Sclk
Delay
Reset Sclk
Delay
'Bit 7
Set Sclk
Delay
Reset Sclk
Delay
'Bit 8
Set Sclk
Delay
Reset Sclk
Delay
'Bit 9
Set Sclk
Delay
Reset Sclk
Delay

'2 Takte bis conversion
Set Sclk
Delay
Reset Sclk
Delay
Set Sclk
Delay
Reset Sclk
Delay


Waitms 40

If Portb.3 = 0 Then Print "ok ";


'Daten empfangen ersten 8 Bit
Dat_00 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_00.0 = Din
Rotate Dat_00 , Left , 1
Delay

'Daten empfangen zweiten 8 Bit
Dat_01 = 0
'Bit 7
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 6
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 5
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 4
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 3
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 2
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 1
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay
'Bit 0
Set Sclk
Delay
Reset Sclk
Dat_01.0 = Din
Rotate Dat_01 , Left , 1
Delay

'letzter Tankt
Set Sclk
Delay
Reset Sclk
Delay


Print Dat_00;
Print Dat_01;

Wait 1
Loop
End


Um das ganze erst einmal einfach an zu gehen, wollte ich nur D1 auslesen was im Datenblatt Fig.6a zeigt. Wie man sieht soll "Dout" von 1 auf 0 wechseln und wieder zurück wenn es die Setup Bits bekommt. Aber der Ausgang am Sensor "Dout" (verbunden am Atmega8 mit "Din") ist und bleibt auf 0 und ist auch nicht wie zu sehen wenn es nix zu tun gibt auf 1.
Den Sensor habe ich schon mit dem auf der Platine von ELV gewechselt und da funktioniert er, also ist er nicht defekt.

Ich bin nu leider am Ende meines Latein, kann mir wer helfen Bitte ;)

Dirk
21.05.2008, 16:36
Hallo Robotik,

der MS5534 wird ja mit einer synchronen seriellen Schnittstelle ausgelesen.

Das kann mit deiner Software nicht klappen.

Du erzeugst zwar einen Takt (PWM), aber dein Hauptprogramm versucht ohne Beziehung zum Takt, die Bits zu lesen.

Du brauchst eine ISR, die auf eine Flanke des Takts reagiert und dann das Bit vom Sensor einliest. Das geht leider nur ein bißchen komplizierter.

Wie sieht's auf der Hardwareseite aus? Wie erzeugst du den Master Clock Takt? Wie ist deine komplette Beschaltung?

Gruß Dirk

Robotik
22.05.2008, 12:08
Hi Dirk,

nu hab ich mir extra die Mühe gemacht um sehr genau zu beschreiben was ich wie gemacht habe und Du liest es garnicht genau *grins* ;)

Also "Mclk" erzeuge ich durch Timer1, steht auch im Code nur der Vergleichswert von 250 ist falsch. Es muss 122 hin das ergibt dann ziehmlich genau was über 32kHz.
Was Du über den Takt für den Datenaustausch gesagt hast ist nicht ganz richtig. Die Flanke benutzt nur der Sensor um darauf zureagieren, da ich den Takt "Sclk" auch selber erzeuge im Main Programm mit dem Datensignal, kann ich sie genau so generieren das die Signalwechsel immer vor der jeweiligen Flanke erfolgen. Ich habe beide Signale mit dem Oszi synchron überprüft und sie stimmen genau mit dem Datenblatt überein.
Les bitte nochmal meinen Text von oben da steht die Beschaltung drin.

Gruß Robotik

Dirk
22.05.2008, 20:22
Hallo Robotik,

ich habe jetzt noch einmal deine Clock-Generierung angesehen:
Sie sieht so aus wie im Datenblatt Fig 6a. Allerdings ist diese Art der Impulserzeugung auch nicht ideal und zeitaufwändig im Code nachzuverfolgen. Im Prinzip könnte das aber so funktionieren.

Trotzdem mögliche Probleme:
1. Hardwareaufbau. Insb. muss wohl das Mclk sehr sauber (jitterfrei) sein.
2. Ich würde mich an das Datenblatt S. 12 halten und vor der 1. Wandlung die Reset-Sequenz (Fig 6e) senden.

Gruß Dirk

Robotik
22.05.2008, 21:35
Hi Dirk,

Das der Code nicht das wahre ist ist klar, das sollte auch nur erstmal nen test sein ob ich den Sensor ansprechen kann. Ich hab mir das mit dem "Mclk" Takt schon gedacht das der vieleicht nicht richtig ist. Aber auf der Platine die ich von ELV habe, ist ein Atmega8L drauf der den Sensor anspricht und der erzeugt auch denn Takt "Mclk" aber scheinbar nicht über Timer1, da dann der "Mclk" Pin am Sensor mit OC1A oder OC1B verbunden sein müsste da nur diese Pins das signal abgeben können.
Um dem ganzen aber aus dem Weg zu gehen habe ich den Takt "Mclk" von dem Atmega8L einfach abgegriffen und in meinen Sensor geschickt, aber es ändert sich nix.
Ich hab mal den Code geändert und nur die Reset Funktion erstellt, da müsste am Ende der Sensor auf Hi gehn und nicht mehr Low Pegel führen. Aber auch das funktioniert nicht :(



'----------------------------------------------------------
$regfile = "m8def.dat" 'ATmega8-Deklarationen
$crystal = 8000000 '3686400 'Quarz: 3,6864 MHz
$baud = 9600 'Baudrate zum PC: 38400 Baud
'


'=== Variablen
' MS5534 Definition
Ddrb.2 = 1 'ausgang
Ddrc.0 = 0 'eingang
Portc.0 = 0 'pullup widerstand aus
Ddrb.4 = 1 'ausgang



_ms5534_mclk Alias Portb.1 ' => MS5534 Pin 5
_ms5534_din Alias Portb.2 ' => MS5534 Pin 4
_ms5534_dout Alias Pinc.0 ' => MS5534 Pin 3
_ms5534_sclk Alias Portb.4 ' => MS5534 Pin 2


Dim _ms5534_d1 As Word
Dim _ms5534_d2 As Word

Const _ms5534_delay = 3


'Taktsignal
'===========================
Ddrb.1 = 1 'Pin PB1/OC1A ist Ausgang
'
Tccr1a = &B01000000 'Pin OC1A/PB1 togglen, kein PWM
Tccr1b = &B00001001 'Timer-Reset bei Compare, Clock/1

Compare1a = 122 'Vergleichswert setzen (OCR1AH+OCR1AL)





Do

Print "Reset ";
Wait 1

'=== Reset
Waitus 100
_ms5534_sclk = 0
_ms5534_d1 = &B1010101010101010
_ms5534_d2 = &B0000000000000000
Shiftout _ms5534_din , _ms5534_sclk , _ms5534_d1 , 0 , 16 , _ms5534_delay
Shiftout _ms5534_din , _ms5534_sclk , _ms5534_d2 , 0 , 5 , _ms5534_delay



If Pinb.3 = 1 Then Print "Hi ";
If Pinb.3 = 0 Then Print "Low ";


Loop
End


Der Link für die Platine und die Beschaltung von ELV ist oben, da siehst wie die das gemacht haben aber halt leider ohne Code ;).

Gruß Robotik

Dirk
23.05.2008, 19:51
@Robotik:
Leider habe ich den MS5534C nicht, so dass ich nicht weiter helfen kann.

Wenn die Software-Seite so ok ist, bleibt nur ein Hardware-Problem.
Wie sieht's mit den Optokopplern aus?
Ersetze sie doch für Din und SCLK nur durch zwei Spannungsteiler, die den uC-Highpegel auf 3,3V für den Sensor reduzieren.
Dout des Sensors kannst du direkt mit dem uC verbinden: Er müßte 3,3V als high erkennen.

Sonst weiß ich auch nicht weiter: Sorry.

Gruß Dirk

Robotik
23.05.2008, 23:10
Hi Dirk,

bin schon dabei gewesen Spannungsteiler ein zu bauen. Hab es aber noch nicht fertig bekommen und bin nun erstmal fürs Weekend vereist. Ich meld mich am Mo oder Dienstag wieder. Ich wünsch Dir ein schönes Wochenende und danke für deine Hilfe.

Gruß Robotik

Robotik
05.06.2008, 21:12
Hi Dirk,

hat leider etwas länger gedauert, man verdirbt sich halt die ganze Freizeit mit arbeiten ^^. Also die Schaltung funktioniert jetzt es lag an dem Optokoppler, warum ist mir zwar nicht ganz klar aber egal.

Gruß Robotik

Dirk
05.06.2008, 21:27
Hallo Robotik,

danke für die Rückmeldung. Ist ja ein guter Erfolg. Am Ende zählt nur das Ergebnis! O:)

... es lag an dem Optokoppler, warum ist mir zwar nicht ganz klar aber egal.
Stimmt, ist egal. Aber ich wäre nicht ich, wenn ich nicht noch eine Vermutung loslassen müßte:
Kann es sein, dass der Optokoppler logisch INVERTIERT hat? Jedenfalls tut er das ja in der Standardschaltung (Eingang high = Ausgangstransistor in Emitterschaltung durchgeschaltet, also low).
... aber ich weiß ja gar nicht, wie du den beschaltet hast, also: Reine sinnfreie Glaskugel-Leserei.

Gruß Dirk

Robotik
05.06.2008, 21:46
Hi Dirk,

mich würd schon interessieren wieso der schuld ist weil laut Datenblatt müsste der doch funktionieren. Verwendet hatte ich den Optokoppler (PC817), ich hab 1k vor die Anode der Dioden gemacht und die Kathode an Masse. An die Emitter 3,6V angelegt und die Kollectoren an die Eingänge des MS5534 angeschlossen. Laut Überprüfung mit dem Oszi auf dem PC, lag exakt das selbe Signal nach dem Optokoppler an.

Gruß Robotik

Dirk
06.06.2008, 19:27
Laut Überprüfung mit dem Oszi auf dem PC, lag exakt das selbe Signal nach dem Optokoppler an.
Bei einem 1-Kanal Oszi, den man nacheinander an Eingang und Ausgang des Optokopplers hängt, würde man ja anhand der Signalform eine Invertierung nicht zwangsläufig erkennen ...

Aber: Das ist ja banal.
Ne, ich weiß auch nicht, was da bei dir los war.

Aber: Emitter an 3,6V und Kollektor an Eingänge? Das dürfte eigentlich nicht geklappt haben.
Emitter müßte an GND, Kollektor an Eingang, dann noch ein Pullup an +3,6V. Dann invertiert der Optokoppler je nach Eingangsbeschaltung.
Oder: Kollektor an +3,6V, Emitter an Eingang Sensor und Pulldown-Widerstand an GND. Da wird nicht invertiert.

Gruß Dirk