- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Drucksensor MS5534 mit Atmega8 ansteuern

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40

    Drucksensor MS5534 mit Atmega8 ansteuern

    Anzeige

    Powerstation Test
    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 Atmega 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/...M_G_040413.pdf
    http://www.amsys.de/sheets/amsys.de.ms5534c(e).pdf

    Code:
    '----------------------------------------------------------
    $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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40
    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

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40
    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

    Code:
    '----------------------------------------------------------
    $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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    @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

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40
    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

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40
    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

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hallo Robotik,

    danke für die Rückmeldung. Ist ja ein guter Erfolg. Am Ende zählt nur das Ergebnis!
    ... 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

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    18.05.2004
    Ort
    bei Dresden
    Alter
    43
    Beiträge
    40
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen