- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 7 von 7

Thema: LM75 auslesen... was ist falsch

  1. #1
    zwanzischmark
    Gast

    LM75 auslesen... was ist falsch

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo,

    ich habe einen LM75 Temperatursensor und ein Programm was eigentlich für einen PCF8574 etwas angepasst. Sollte ja von der Idee kein Problem sein, aber es funktioniert nicht wirklich. Vielleicht kann jemand von euch mal drüberschauen, oder mir sagen ob das Program was ich umgeformt hat im ursprung überhaupt funktioniert. Hier ist das Programm:

    Code:
    DEFINE PCFDaten byte
    define Zaehler byte
    define N byte
    define SDA port[9]
    define SCL port[10]
    
    SDA = ON
    SCL = ON
    
    #schleife
        gosub I2C_start
        pcfdaten = 144
        gosub I2C_schreiben
        pcfdaten = 0
        gosub I2C_schreiben
        gosub I2C_stop
        gosub I2C_start
        pcfdaten = 145
        gosub I2C_schreiben
        gosub I2C_lesen
        Print "-";
        gosub I2C_lesen
        print
        gosub NoAcknoledgement
        gosub I2C_stop
        pause 500
    GoTo schleife         
    
    #I2C_start
      SDA = OFF
      SCL = OFF
      Return
    
    #I2C_stop
      SDA = OFF
      SCL = ON
      SDA = ON
      Return
    
    #I2C_schreiben
      For N = 1 To 8
        SDA = OFF
        if (pcfdaten AND 128) = 128 then SDA = ON
        pulse SCL
        pcfdaten = pcfdaten shl 1 '1 Bit nach links
      Next
      pulse SCL          
      Return
    
    #I2C_lesen
      pcfdaten = 0
      deact SDA           ' SDA = Eingang
      For N = 1 To 8
        pcfdaten = pcfdaten shl 1 '1 Bit nach links
        SCL = ON
        If SDA Then pcfdaten = pcfdaten + 1
        if SDA then Print 1; Else Print 0;
        SCL = OFF
      Next
      Return
    
    #acknowlege
      SDA = 0
      pulse SCL
      Return
    
    #NoAcknoledgement
      SDA = 1
      pulse SCL
      Return
    
    END
    danke schonmal für die hilfe =)

    Paul

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277

    Re: LM75 auslesen... was ist falsch

    Hallo,

    Zitat Zitat von zwanzischmark
    Hallo,
    ich habe einen LM75 Temperatursensor und ein Programm was eigentlich für einen PCF8574 etwas angepasst.
    So wird das nix. Passe mal das untenstehende Programm an Deine Bedürfnisse an. Ist von mir zwar für die Micro und den DS 1621/1631 geschrieben, das macht aber in Bezug auf den Sensor keinen Unterschied.
    Die SDA/SCL Ports müssen natürlich zurechtgebogen werden
    Ach so, es wird Basic++ benutzt, was ich nur jedem empfehlen kann.

    Code:
    'Test für I2C mit Dallas Temperatursensor
    '
    '
    '---- Variablen definieren-----------------------------------------
    
    option ccmicro
    
    
    define DEV        byte
    define TEMP       byte
    define DATA       byte
    define mask       byte
    define temperatur byte
    define value      byte
    define nullkomma  byte
    define flow       byte
    define i          byte
    define j          byte
    
    define TxD      port[1]
    define RxD      port[2]
    define test_ad    ad[2]
    define taster   port[3]
    define freqport port[4]
    define SCL      port[5]
    define SDA      port[6]
    
    declare FUNCTION IICSEND(d ref DATA)
    declare FUNCTION IICREAD()
    declare function ACKN()
    declare FUNCTION IICSTART()
    declare FUNCTION IICSTOP()
    declare FUNCTION NACKN()
    declare FUNCTION Verzoegerung()
    
    declare function READTEMP()
    
    #INIT
    baud r9600
    freq = 150                         'Torzeit = 3 sek
    SDA = off
    SCL = off
    
    IICSTOP()
    
    put 0
    pause 300
    print
    print"Micro-Test - 2 sek warten"
    pause 200
    
    '--------- HAUPTPROGRAMM -----------------------------------------
    
    #main
    
    '#read1621_1
    DEV=158
    READTEMP()
    print value; & ",";
    if nullkomma = 128 then print "5" else print "0"
    verzoegerung()
    flow = freq
    print flow
    deact rxd
    j = test_ad
    print j
    
    goto main
    '----------------------------
    
    function READTEMP()
    
    IICSTART()
    IICSEND(dev)
    IICSEND(EEh)                'Temperaturmessung anstoßen
    IICSTOP
    
    IICSTART()
    IICSEND(dev)
    IICSEND(AAh)                'Temperaturmessung Lesekommando
    IICSTOP()
    
    IICSTART()
    IICSEND(dev+1)
    IICREAD()                   'LSB holen
    ACKN()
    value = data
    
    IICREAD()                   'MSB holen
    NACKN()
    nullkomma = data
    
    IICSTOP()
    
    END FUNCTION
    
    
    
    FUNCTION IICSTART()
    
    SDA=off
    SCL=off
    END FUNCTION
    '-------------------------------------------
    FUNCTION IICSTOP()
    
    SDA=off
    SCL=on
    SDA=on
    END FUNCTION
    '-------------------------------------------
    FUNCTION IICREAD()
    deact SDA
    DATA=0
    MASK=80h
    #INSHIFT
    SCL=on
    if SDA=on then DATA=(DATA or MASK)
    SCL=off
    MASK=MASK shr 1
    if MASK <>0 then goto INSHIFT
    
    
    '---- 9. Takt für ACKN bzw. NACKN ---------
    
    'ACHTUNG! Je nach Erfordernis (letzte Leseoperation
    'bei sequenziellem lesen?) muss danach ACKN oder NACKN
    'aufgerufen werden! Daher ist (N)ACKN hier NICHT
    'Bestandteil der Funktion!
    
    END FUNCTION
    
    '------------------------------------------
    
    FUNCTION IICSEND(d ref DATA)
    MASK=80h
    #OUTSHIFT
    SDA=(DATA and MASK)
    SCL=on
    SCL=off
    MASK=MASK shr 1
    if MASK<>0 then goto OUTSHIFT
    '---- 9. Takt für ACKN  -------------------
    deact SDA
    SCL = on
    SCL = off
    i = not SDA                         'ackn?
    SDA= off
    
    end function
    '------------------------------------------
    
    function ACKN()
     SDA = OFF
     TOG SCL
     TOG SCL
    END FUNCTION
    
    function NACKN()
     SDA = ON
     TOG SCL
     TOG SCL
    END FUNCTION
    
    '-------------------------------------------------------------------
    FUNCTION Verzoegerung()
    for i = 1 to 128
        for j = 1 to 255
        next j
    next i
    END FUNCTION
    '-------------------------------------------------------------------
    end
    Für die M-Unit V2 finden sich weitere Beispiele auf meinen Seiten.
    http://www.henrik-reimers.de/control/

    Viele Grüße
    Henrik

  3. #3
    zwanzischmark
    Gast
    hi,

    ich hab mal deine funktionen zum lesen und schreiben übernommen, der Rest ist ja ohnehin gleich. Beim LM75 kann ja sofort gelesen werden ohne das vorher ein aufruf zum lesen gesendet werden muss. Leider hat sich nichts geändert. Ich bekomme mehr oder weniger wilde zahlen raus. Hat jemand ne idee?

    Paul

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von zwanzischmark
    hi,

    ich hab mal deine funktionen zum lesen und schreiben übernommen, der Rest ist ja ohnehin gleich. Beim LM75 kann ja sofort gelesen werden ohne das vorher ein aufruf zum lesen gesendet werden muss. Leider hat sich nichts geändert. Ich bekomme mehr oder weniger wilde zahlen raus. Hat jemand ne idee?
    Upps, der LM75 unterscheidet sich in der Ansteuerung ja doch deutlich vom 1621/31. Habe mir gerade das Datenblatt abngesehen.



    #schleife
    gosub I2C_start
    pcfdaten = 144
    gosub I2C_schreiben
    pcfdaten = 0
    gosub I2C_schreiben
    gosub I2C_stop '-----<------ lass' das mal weg
    gosub I2C_start '-----<------ hier kommt ein reapeated start zum Zuge
    pcfdaten = 145
    gosub I2C_schreiben
    gosub I2C_lesen

    'hier möchtest du doch vermutlich das MSB ausgeben, also
    print pcfdaten


    Print "-";
    gosub I2C_lesen
    'nun möchtest du das LSB augeben also wieder
    print pcfdaten

    print
    gosub NoAcknoledgement
    gosub I2C_stop
    pause 500
    GoTo schleife


    Es ist etwas schwierig, in unvollständigen, schlecht kommentierten Listings auf Fehlersuche zu gehen.

    Güße
    Henrik

  5. #5
    zwanzischmark
    Gast
    OK ich poste nochmal den abgeänderten Code. Habe versucht das was von mir ist zu kommentieren.
    Ich hab jetzt ausserdem mal alles unötige weggelassen, weil der LM75 ja im Templesemodus startet müsste ja eigentlich Leseadresse Senden + 2x Lesen ausreichen. Ich hab mir auch schon mehrere andere Codes die nicht für die C-Control sind angesehen, aber leider werde ich daraus auch nicht schlauer. Ich bekomme als Ausgabe einfach wild wechselde Zahlen

    Code:
    DEFINE Daten byte
    define Zaehler byte
    define N byte
    define i byte
    define Mask byte
    define SDA port[15]
    define SCL port[16]
    
    SDA = OFF
    SCL = OFF
    gosub I2C_stop
    
    #schleife
        gosub I2C_start
        Daten = 145              'Adresse(zum Lesen) schreiben
        gosub I2C_schreiben
        gosub I2C_lesen          'MSB Lesen
        gosub acknowlege
        print Daten;             'MSB Ausgeben
        Print "-";               '"MSB-LSB" (nur zum testen)
    
        gosub I2C_lesen          'LSB lesen
        gosub NoAcknoledgement
        print Daten;             'LSB ausgeben (schon klar das die Ausgabe
        print                    'von LSB nicht richtig ist aber ich teste ja nur)
        gosub I2C_stop
        pause 200
    GoTo schleife
    
    #I2C_start
      SDA = OFF
      SCL = OFF
      Return
    
    #I2C_stop
      SDA = OFF
      SCL = ON
      SDA = ON
      Return
    
    #I2C_schreiben
      Mask = &H80
      #OUTSHIFT
      SDA=(Daten and Mask)
      SCL = ON
      SCL = OFF
      Mask = Mask shr 1
      if Mask <> 0 then goto OUTSHIFT
      '---- 9. Takt für ACKN -------------------
      deact SDA
      SCL = ON
      SCL = OFF
      i = not SDA 'ackn?
      SDA= OFF
    Return
    
    #I2C_lesen
      deact SDA
      Daten = 0
      Mask = &H80
      #INSHIFT
      SCL = ON
      if SDA = ON then Daten = (Daten or Mask)
      SCL = OFF
      Mask = Mask shr 1
      if Mask <> 0 then goto INSHIFT
    Return
    
    #acknowlege
      SDA = OFF
      TOG SCL
      TOG SCL
    Return
    
    #NoAcknoledgement
      SDA = ON
      TOG SCL
      TOG SCL
    Return
    
    END

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Hallo,

    kurz und knapp:

    am Programm kann es nun nach menschlichem Ermessen nun nicht mehr liegen.

    Bleiben die üblichen anderen Verdächtigen:

    Adresseinstellung in Übereinstimmung mit der Hardware?

    Wird der Chip angesprochen? (ACK nach dem ersten Schreibbefehl abfragen und nachsehen ob ein ACK gesendet wurde).


    Allfällige sonstige Lötfehler (bei LM75 mit seiner Winzbauart nicht ungewöhnlich).

    Grüße
    Henrik, dem nun auch nicht mehr einfällt.

  7. #7
    zwanzischmark
    Gast
    hi,

    danke für die Hilfe, aber ich griegs nicht hin...

    Adresse sollte mit A0,A1,A2 an GND mit 145 zum lesen richtig sein

    Angelötet ist das ding auch richtig (kann sein das es davon auch kaputt is!?!)

    und das mit dem ACK war ja in deinem Programm schon drin das gibt mir 255 nach dem Adresse schreiben aus. Komischerweise grieg ich mitlerweile als Temp jetzt nur noch 0 raus...

Berechtigungen

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

Solar Speicher und Akkus Tests