-
        
+ Antworten
Ergebnis 1 bis 10 von 10

Thema: Drucksensor MS5534 mit Bascom auslesen

  1. #1
    Stephan_Gast
    Gast

    Drucksensor MS5534 mit Bascom auslesen

    Hallo zusammen,

    hat sowas schonmal jemand von euch gemacht und könnte mich mit Softwarebeispielen unterstützen ?? Hab schon in vielen Foren gefragt....bis jetzt konnnte mir niemand weiterhelfen. Leider habe ich von C kaum Ahnung...von Bascom zwar schon etwas mehr, jedoch nicht ausreichend, um die C-Beispiele von Intersema ( http://www.intersema.ch/site/technical/files/an502.pdf) in Bascom zu übertragen.
    Würde mich über eure Hilfe sehr freuen !!

    Stephan

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    Hi,

    in Bascom gibt es ein paar Befehle, die ein 3-wire Interface unterstützen.
    Wenn ich mich nicht irre, heißt dieses Interface SPI und müsste mit deinem Chip funktionieren.

    Beispiele: SPIMOVE, SPIIN, SPIOUT, SPIINIT, SPISLAVE

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  3. #3
    Stephan_Gast
    Gast
    Vielen Dank für Deine Antwort.
    SPI...das schein wohl die Möglichhkeit zu sein. Jedoch lässt mein MS5534 nur eine maximale SCLK von 500 kHz zu. kann ich diese Taktrate in Bascom einstellen. Ich verwende einen ATMega8 mit 16MHz externem Takt.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    28
    Beiträge
    1.614
    Hi

    beim SPI-HARD Modus gibt es ne Einstellung, die Clockrate heißt.
    Damit kann man den Teiler einstellen, der zwischen dem XTAL und SCLK steht.

    d.h.: wenn du nen 16 MHz Quarz hast, dann iss das 64 für deine Anwendung, 32 gibt es leider nicht (dann hättest du 500 kHz, mit 64 hast du 250kHz).

    Aber das ist warscheinlich ja für deine Anwendung egal.

    Martin
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  5. #5
    Stephan_Gast
    Gast

    Drucksensor MS5534 mit Bascom auslesen

    Hallo Martin,

    vielen Dank !!
    Das klappt soweit. Das nächste Problem ist jedoch, dass der MOSI (Dout) logisch 1 führt, wenn die SPI nichts zu tun hat. Das passt dem Drucksensor garnicht. Bei der SCKL kann ich wählen, ob diese 1 oder 0 führt, wenn sie "idle" ist.
    Hast du da noch eine Idee ???

    Stephan

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    23.09.2004
    Beiträge
    10
    Nabend,

    Werner Römer nutzt den MS5534 in einem Datenlogger. Er nutzt ebenfalls Bascom und hat den Quelltext veröffentlicht.
    http://werner.roemer.bei.t-online.de...er/inhalt.html
    Der hilft euch sicherlich weiter.

    Schönen Abend noch !!!
    Daniel

  7. #7
    Habe leider die Diskussion nicht mitbekommen und möchte nachträglich mal eine Frage stellen. Ist die Verwendung eines MS5534 inzwischen erfolgreich absolviert worden?
    Kann mir jemand ebenfalls diese Informationen über Ansprechung des Sensors mit Bascom senden?
    Leider ist die oben genannte Webpage von Werner Römer nicht mehr online. Gibt es eine Ersatzadresse?

    Grüßle
    Kai

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    35
    Beiträge
    40
    Hi,
    ich habe leider auch die Diskussion nicht mitbekommen und habe nun das selbe vor. Hat schon Jemand etwas ereicht, hat es funktioniert?
    leider existiert der Link nicht mehr kann mir bitte Jemand den Quellcode schicken in google.de finde ich nix.
    Danke

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    35
    Beiträge
    40
    Hat denn Niemand den Code oder noch einen Link der funktioniert???

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    28.06.2007
    Ort
    Blaustein
    Alter
    49
    Beiträge
    36
    Hallo,

    na schon fündig geworden mit dem BASCOM-Code ?

    Wenn nicht, probier das mal :

    Code:
    $regfile = "m644def.dat"
    $crystal = 8000000
    $hwstack = 32
    $swstack = 32
    $framesize = 40
    $prog &HFF , &HE2 , &HD9 , &HFE                                                 ' BODEN=1,8V, JTAG disabled, sonst Standard
    
    Config Clock = Soft , Gosub = Sectic
    Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0
    Config Lcd = 16 * 2 , Chipset = Dogm162v3
    
    ' Timer1, Fast-PWM (Mode 15), Prescale = 1, variable Frequenz, Tast 1:1, OC1A -> ca. 32.768Hz
    Tccr1a.7 = 0                                                                    ' COM1A1
    Tccr1a.6 = 1                                                                    ' COM1A0
    Tccr1a.1 = 1                                                                    ' WGM11
    Tccr1a.0 = 1                                                                    ' WGM10
    Tccr1b.4 = 1                                                                    ' WGM13
    Tccr1b.3 = 1                                                                    ' WGM12
    Tccr1b.2 = 0                                                                    ' CS12
    Tccr1b.1 = 0                                                                    ' CS11
    Tccr1b.0 = 1                                                                    ' CS10
    Ocr1ah = 0
    Ocr1al = 120
    
    Cursor Off Noblink
    Cls
    
    Config Portd.0 = Output
    Portd.0 = 0                                                                     ' GND MS5534
    Sclk Alias Portd.1
    Config Portd.1 = Output                                                         ' SCLK MS5534
    Dout Alias Pind.2
    Config Pind.2 = Input                                                           ' Dout MS5534
    Din Alias Portd.3
    Config Portd.3 = Output                                                         ' Din MS5534
    Mclk Alias Portd.5
    Config Portd.5 = Output                                                         ' MCLK MS5534
    Config Portd.6 = Output
    Portd.6 = 1                                                                     ' VDD MS5534
    
    Const Hoehe = 610
    
    Const Conv_start_press = &B1111010000000000
    Const Conv_start_temp = &B1111001000000000
    Const Read_cali_data_1 = &B1110101010000000
    Const Read_cali_data_2 = &B1110101100000000
    Const Read_cali_data_3 = &B1110110010000000
    Const Read_cali_data_4 = &B1110110100000000
    Const Reset_sequence = &B1010101010101010
    
    Dim V As Word                                                                   ' allgemeine Variable
    Dim W As Word                                                                   ' allgemeine Variable
    Dim Temp_integer As Integer
    Dim Temp_word As Word
    Dim Temp_single As Single
    Dim S As String * 6
    
    ' Globale Variable für originale Calibration Data aus Sensor
    Dim W1 As Word
    Dim W2 As Word
    Dim W3 As Word
    Dim W4 As Word
    
    ' Globale Variablen für umgerechneten Calibration Data
    Dim C1 As Word
    Dim C2 As Word
    Dim C3 As Word
    Dim C4 As Word
    Dim C5 As Word
    Dim C6 As Word
    
    ' Globale Variablen für Luftdruck und Temperatur aus Sensor
    Dim D1 As Word
    Dim D2 As Word
    Dim Ut1 As Single
    Dim Dt As Single
    Dim T As Single
    Dim T2 As Single
    Dim Offset As Single
    Dim Sens As Single
    Dim P As Single
    Dim P2 As Single
    Dim Pm(8) As Single
    
    ' Prototypen definieren
    Declare Sub Read_calibration_data(byval Adress As Word , Value As Word )
    
    Gosub Contrastset
    
    Locate 1 , 3 : Lcd "Test MS5534"
    Locate 2 , 3 : Lcd "by Knickohr"
    
    Enable Timer1
    Enable Interrupts
    
    'Wait 1
    'Cls
    
    ' Reset-Sequence
    Temp_word = Reset_sequence
    Shiftout Din , Sclk , Temp_word , 1 , 16 , 50
    For V = 1 To 5
       Pulseout Portd , 1 , 100
       Waitus 100
    Next V
    
    ' Calibration Data auslesen und auf Display ausgeben
    Call Read_calibration_data(read_cali_data_1 , W1)
    Call Read_calibration_data(read_cali_data_2 , W2)
    Call Read_calibration_data(read_cali_data_3 , W3)
    Call Read_calibration_data(read_cali_data_4 , W4)
    Gosub Calc_calibration_data
    
    'Cls
    
    'Locate 1 , 1 : Lcd W1
    'Locate 1 , 9 : Lcd W2
    'Locate 2 , 1 : Lcd W3
    'Locate 2 , 9 : Lcd W4
    
    'Wait 1
    'Cls
    
    'Locate 1 , 1 : Lcd C1
    'Locate 1 , 7 : Lcd C2
    'Locate 1 , 12 : Lcd C3
    'Locate 2 , 1 : Lcd C4
    'Locate 2 , 6 : Lcd C5
    'Locate 2 , 11 : Lcd C6
    
    Wait 1
    Cls
    
    Do
    
       Locate 1 , 16 : Lcd "*"
    
       ' Pressure Measurement
    
       ' Reset-Sequence
       Temp_word = Reset_sequence
       Shiftout Din , Sclk , Temp_word , 1 , 16 , 50
       For V = 1 To 5
          Pulseout Portd , 1 , 100
          Waitus 100
       Next V
    
       ' Saubere Startbedingungen schaffen
       Reset Sclk
       Reset Din
    
       ' START + Adresse + STOP + 2x warten
       Temp_word = Conv_start_press
       Shiftout Din , Sclk , Temp_word , 1 , 12 , 50
       V = 0
       Do                                                                           ' Warten auf "end of conversation"
          Incr V
          If V > 50 Then Exit Do
          Waitms 1
       Loop Until Dout = 0
       If V < 50 Then                                                               ' nur wenn kein Timeout
          Shiftin Dout , Sclk , D1 , 0 , 16 , 50
          Pulseout Portd , 1 , 100
    '      Locate 1 , 1 : Lcd D1
    '   Else
    '      Locate 1 , 1 : Lcd "Fehler Druck"
       End If
    
       ' Temperature Measurement
    
       ' Reset-Sequence
       Temp_word = Reset_sequence
       Shiftout Din , Sclk , Temp_word , 1 , 16 , 50
       For V = 1 To 5
          Pulseout Portd , 1 , 100
          Waitus 100
       Next V
    
       ' Saubere Startbedingungen schaffen
       Reset Sclk
       Reset Din
    
       ' START + Adresse + STOP + 2x warten
       Temp_word = Conv_start_temp
       Shiftout Din , Sclk , Temp_word , 1 , 12 , 50
       V = 0
       Do                                                                           ' Warten auf "end of conversation"
          Incr V
          If V > 50 Then Exit Do
          Waitms 1
       Loop Until Dout = 0
       If V < 50 Then                                                               ' nur wenn kein Timeout
          Shiftin Dout , Sclk , D2 , 0 , 16 , 50
          Pulseout Portd , 1 , 100
    '      Locate 2 , 1 : Lcd D2
    '   Else
    '      Locate 2 , 1 : Lcd "Fehler Temp"
       End If
    
       ' Temperatur berechnen
       Temp_single = 8 * C5
       Ut1 = Temp_single + 20224
       Dt = D2 - Ut1
       Temp_single = C6 + 50
       Temp_single = Temp_single * Dt
       Temp_single = Temp_single / 1024
       T = 200 + Temp_single
    
       ' Luftdruck berechnen
       Temp_single = C4 - 512
       Temp_single = Temp_single * Dt
       Temp_single = Temp_single / 4096
       Temp_word = C2 * 4
       Offset = Temp_single + Temp_word
       Temp_single = C3 * Dt
       Temp_single = Temp_single / 1024
       Temp_single = Temp_single + 24576
       Sens = C1 + Temp_single
       Temp_single = D1 - 7168
       Temp_single = Sens * Temp_single
       Temp_single = Temp_single / 16384
       Temp_single = Temp_single - Offset
       Temp_single = Temp_single * 10
       Temp_single = Temp_single / 32
       P = Temp_single + 2500
    
       ' Second-Order Temperature Compensation
       Select Case T
          Case Is < 200
             Temp_single = 200 - T
             Temp_single = Temp_single ^ 2
             Temp_word = C6 + 24
             Temp_single = Temp_single * Temp_word
             Temp_single = 11 * Temp_single
             T2 = Temp_single / 1048576
             Temp_single = P - 3500
             Temp_single = Temp_single * T2
             Temp_single = Temp_single * 3
             P2 = Temp_single / 16384
          Case Is > 450
             Temp_single = 450 - T
             Temp_single = Temp_single ^ 2
             Temp_word = C6 + 24
             Temp_single = Temp_single * Temp_word
             Temp_single = 3 * Temp_single
             T2 = Temp_single / 1048576
             Temp_single = P - 10000
             Temp_single = Temp_single * T2
             P2 = Temp_single / 8192
          Case Else
             T2 = 0
             P2 = 0
       End Select
       T = T - T2
       P = P - P2
    
       ' Mittelwertbildung über 8 Messungen
       Select Case P                                                                ' Plausibilitätsprüfung
          Case Is < 8000
             !nop
          Case Is > 11000
             !nop
          Case Else
             For V = 1 To 7
                W = V + 1
                Pm(v) = Pm(w)
             Next V
             Pm(8) = P
             If Pm(1) <> 0 Then                                                     ' allererste 7 Messung nicht mitteln
                Temp_single = 0
                For V = 1 To 8
                   Temp_single = Temp_single + Pm(v)
                Next V
                P = Temp_single / 8
             End If
       End Select
    
       ' Druckberechnung bezogen auf Meereshöhe
       Temp_single = T / 10
       Temp_single = Temp_single + 273.15
       Temp_single = 0.0065 / Temp_single
       Temp_single = Temp_single * Hoehe
       Temp_single = 1 - Temp_single
       Temp_single = Temp_single ^ 5.255
       P = P / Temp_single
    
    '   Wait 1
    '   Cls
    
    '   Locate 1 , 5 : Lcd Time$
       T = T * 10                                                                   ' 0.01° Resolution
       Temp_integer = Round(t)
       S = Str(temp_integer)
       Locate 1 , 5 : Lcd Format(s , "  0.00") ; "ßC"
       Temp_integer = Round(p)
       S = Str(temp_integer)
       Locate 2 , 3 : Lcd Format(s , "    0.0") ; "mbar"
       Locate 1 , 16 : Lcd " "
    
       Wait 1
    
    Loop
    
    End
    
    Sectic:
       !nop
       Return
    
    Contrastset:
       V = 15
       V = V And &B00001111
       V = V + &B01110000
       W = 15
       Shift W , Right , 4
       W = W + &B01010100
       _temp1 = &B00101001
       !rCall _Lcd_control
       _temp1 = V
       !rCall _Lcd_control
       _temp1 = W
       !rCall _Lcd_control
       _temp1 = &B00101000
       !rCall _Lcd_control
       Return
    
    
    Calc_calibration_data:
    
       ' C1 aus Word1 berechnen
       C1 = W1
       Shift C1 , Right , 1
    
       ' C2 aus Word3 und Word4 berechnen
       C2 = W3 And &B0000000000111111
       Shift C2 , Left , 6
       Temp_word = W4 And &B0000000000111111
       C2 = C2 + Temp_word
    
       ' C3 aus Word4 berechnen
       C3 = W4
       Shift C3 , Right , 6
    
       ' C4 aus Word3 berechnen
       C4 = W3
       Shift C4 , Right , 6
    
       ' C5 aus Word1 und Word2 berechnen
       C5 = W1 And &B0000000000000001
       Shift C5 , Left , 10
       Temp_word = W2
       Shift Temp_word , Right , 6
       C5 = C5 + Temp_word
    
       ' C6 aus Word2 berechnen
       C6 = W2 And &B0000000000111111
    
       Return
    
    Sub Read_calibration_data(byval Adress As Word , Value As Word )
    
       ' Saubere Startbedingungen schaffen
       Reset Sclk
       Reset Din
    
       ' START + Adresse + STOP + 1x warten
       Shiftout Din , Sclk , Adress , 1 , 13 , 50
       Shiftin Dout , Sclk , Value , 0 , 16 , 50
    
       ' weiteren SCLK für sauberen Abschluß
       Pulseout Portd , 1 , 100
    
    End Sub
    Warum ich aber eigentlich hier bin : Ich habe mehrere MS5534, doch
    einer tritt irgendwie aus der Reihe. Die programmierten Initialwerte
    sind ganz anders, als die der anderen und auch der Druckwert stimmt
    hinten und vorne nicht. Temperatur scheint zu passen. Hat schon mal
    jemand einen ähnlichen Fall gehabt ? Eigentlich sollte ich Intersema
    anschreiben und reklamieren. Die Sensoren sind zu teuer, um sie nur
    einfach wegzuwerfen.

    Thomas
    New Millenium Observatory
    Der Sternhimmel über Ulm
    http://www.sternhimmel-ueber-ulm.de

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •