- Akku Tests und Balkonkraftwerk Speicher         
Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte
Ergebnis 41 bis 50 von 55

Thema: DS1621 auslesen

  1. #41
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Drifter2006,
    ja, das hatte ich vergessen.
    Ich habe auch einen Fehler in Deiner Korrektur gefunden. Temp_1 gibt es nicht, es muß Temp1 heißen. Aber jetzt klappt wieder alles. Ich wollte mal ein Innen/Außentermometer bauen, da ist natürlich das Minuszeichen wichtig.

    Jedenfalls war es für Deinen ersten Versuch garnicht mal so schlecht.

    Gruß Peter

  2. #42
    Benutzer Stammmitglied
    Registriert seit
    28.08.2006
    Beiträge
    48
    Hello peter02,

    Zitat Zitat von peter02
    Ich habe auch einen Fehler in Deiner Korrektur gefunden. Temp_1 gibt es nicht, es muß Temp1 heißen. Aber jetzt klappt wieder alles.
    I’m glad you mentioned this!!
    This is also wrong, it should be "Temp_c", oops, my fault.
    I also found one more error in your modification and corrected it otherwise -0,0 could be displayed.
    Here is the corrected version:

    Code:
    '********************************* PORTS *********************************'
    $regfile = "M32def.dat" ' chip
    $crystal = 16000000 ' frequenz
    $baud = 9600 ' baud rate
    
    $hwstack = 32 ' default use 32 for the hardware stack
    $swstack = 10 ' default use 10 for the SW stack
    $framesize = 40 ' default use 40 for the frame space
    
    
    Config Scl = Portc.0 ' we need to provide the SCL pin name
    Config Sda = Portc.1 ' we need to provide the SDA pin name
    
    Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4
    Config Lcd = 16 * 2
    Config Portb = Output
    Config Lcdbus = 4
    
    '*************************************************************************'
    '******************************* VARIABLES *******************************'
    Dim ___lcdno As Bit
    Dim I2c_byte As Byte
    Dim Loops1 As Byte
    Dim Count As Byte
    Dim Slope As Byte
    Dim Temp1 As Integer
    Dim Temp2 As Integer
    Dim Temp_c As Integer
    '*************************************************************************'
    '******************************* CONSTANTS *******************************'
    Const Ds1621_i2c_address = 144
    Const Ds1621_i2c_r_address = 145
    '*************************************************************************'
    '********************************* SETUP *********************************'
    Config I2cdelay = 80
    '*************************************************************************'
    '******************************** PROGRAM ********************************'
    
    Cls
    Cursor Off Noblink 'hide cursor
    Temp_c_loop:
    Gosub Get_ds1621_temperature
    
    Temp1 = Temp_c / 10                                         'get hundreds tens ones xxx,'
    Temp1 = Abs(temp1)
    
    Temp2 = Temp_c / 10                                         'get 1/10 ,x'
    Temp2 = Temp2 * 10
    Temp2 = Temp_c - Temp2
    Temp2 = Abs(temp2)
    
    Locate 1 , 1
    If Temp_c < 0 Then Lcd "-";                                 'print "-" if temp_c is negative'
    Lcd Temp1 ; "." ; Temp2 ; " C Wohnraum     "                'print xxx.x C Wohnraum'
    Wait 1
    Goto Temp_c_loop
    
    '*************************************************************************'
    '****************************** SUBROUTINES ******************************'
    Get_ds1621_temperature:
    
    For Loops1 = 1 To 2
    Ds1621_start_convert:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HEE
    I2cstop
    
    Ds1621_check_conversion_done:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HAC
    I2cstop
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte I2c_byte , Nack
    I2cstop
    Temp1 = I2c_byte And 1
    Temp2 = I2c_byte And 128
    If Temp1 = 1 Then If Temp2 = 128 Then Goto Ds1621_check_conversion_done
    
    Ds1621_read_temp:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HAA
    I2cstop
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    
    I2crbyte Temp_c , Nack
    If Temp_c > 127 Then Temp_c = Temp_c + &HFF00
    Temp_c = Temp_c * 100
    
    Ds1621_read_count:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HA8
    I2cstop
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte Count , Nack
    I2cstop
    
    Ds1621_read_slope:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HA9
    I2cstop
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte Slope , Nack
    I2cstop
    
    Temp1 = Count * 100
    Temp2 = Slope * 100
    
    Temp2 = Temp2 - Temp1
    Temp1 = Temp2 / Slope
    
    Temp_c = Temp_c - 25
    Temp_c = Temp_c + Temp1
    
    Temp_c = Temp_c / 10            'get rid of last digit   xxxxx becomes xxxx'
    I2cstop
    Next
    Return
    
    '*************************************************************************'
    Success and greetings,
    Drifter2006

  3. #43
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Hallo Drifter2006,

    danke, das hatte ich gar nicht bemerkt. Hätte ich warscheinlich gesehen, wenn der Außenfühler angeschlossen ist.
    Heute oder morgen kommt noch ein zweiter DS1621 dazu. Weißt du wie ich die "Jumper" setzen muß? Jetzt haben wir ja 144 und 145 genommen weil alle drei Addresseingänge auf Masse sind.
    Die Angaben in dem Datenblatt verstehe ich nicht.

    Gruß Peter

  4. #44
    Benutzer Stammmitglied
    Registriert seit
    28.08.2006
    Beiträge
    48
    Zitat Zitat von peter02
    Hallo Drifter2006,

    danke, das hatte ich gar nicht bemerkt. Hätte ich warscheinlich gesehen, wenn der Außenfühler angeschlossen ist.
    Heute oder morgen kommt noch ein zweiter DS1621 dazu. Weißt du wie ich die "Jumper" setzen muß? Jetzt haben wir ja 144 und 145 genommen weil alle drei Addresseingänge auf Masse sind.
    Die Angaben in dem Datenblatt verstehe ich nicht.

    Gruß Peter
    Hello,

    Pins 5, 6 and 7 are the I2C address selection pins and must be connected to Vcc or GND .
    The program uses address 144, this means that pins 5,6 and 7 must be connected to GND.

    To connect a 2nd DS1621 you need a different address which can be adjusted with these pins.
    Example: for the 2nd DS1621 connect pin5 to GND, pin 6 to GND and pin 7 to Vcc.
    This will adjust the 2nd DS1621 address to 146.

    I2C Write address of the DS1621:
    [1] [0] [0] [1] [A2 pin 5] [A1 pin 6] [A0 pin 7] [0]

    As you can see: connecting pin 5,6 and 7 to GND will create I2C address 10010000 -> 144
    144 is now the write address and 145 is the read address

    Connecting pin 5 and 6 to GND and pin 7 to Vcc will create I2C address 10010010 -> 146
    146 is now the Write address and 147 is now the Read address.

    The Read address is always the Write address + 1

    Greetings,
    Drifter2006

  5. #45
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Hallo Drifter2006,

    danke, das hört sich ja einfach an. Ich konnte es aus dem Datenblatt nicht ersehen.
    Du schreibst "As you can see: connecting pin 5,6 and 7 to GND will create I2C address 10010000 -> 144 " Frage: wie kann ich es sehen? Kann man den I2C Bus nach vorhandenen Devices scannen?

    Kannst Du das Programm auf einen zweiten DS1621 erweitern? Er soll in der zweiten LCD Zeile die Aussentemperatur anzeigen.

    Gruß Peter

  6. #46
    Benutzer Stammmitglied
    Registriert seit
    26.03.2005
    Ort
    Burghausen
    Alter
    41
    Beiträge
    38
    Mahlzeit,

    ich steh auch vor dem problem das ich entweder 0 oder 255 ausgegeben bekomme, hab schon mit den ganzen sachen die hier stehen rumprobiert, ich komme aber immer wieder auf die oben genannten werte. Kann ich den DS1621 irgendwie testen ob er überhaupt funktioniert?

    Gruss ZB

  7. #47
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Hallo ZB,
    nur in einer funktionierenden Schaltung.

    Ich habe meinen DS1621 folgendermaßen angeschlossen:

    Pin1 SDA
    Pin2 SCL
    Pin4 GND
    Pin8 VDD
    Pin7 GND A0
    Pin6 GND A1
    Pin5 GND A2

    dazu passend:

    Device = 144
    Deviceread = 145

    Die hier vorgestellten Programme klappen.
    Eine kurze Plus/Minus Vertauschung zerstört den DS1621.

    Gruß Peter

  8. #48
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Hallo zusammen,
    leider meldet sich Drifter2006 nicht mehr.
    Vielleicht kann sonst noch jemand helfen.

    Ich habe noch ein Problem mit dem DS1621:
    Bei Temperaturen um die 10 Grad scheint sich die Temperaturanzeige nur noch in 1 Grad Schritten zu bewegen. Die Stelle hinter dem Komma steht fest.

    Bei ca. 20 Grad ist alles OK.

    Es scheint noch ein Fehler in der Berechnung zu sein.


    Gruß Peter

  9. #49
    Benutzer Stammmitglied
    Registriert seit
    28.08.2006
    Beiträge
    48
    Hello peter02,
    Sorry for taking so long, I was having some PC problems that needed sorting out.
    I’m not completely sure about your problem; it could be that you have the I2C bus frequency too high.
    Try slowing down the frequency ex. Config I2Cdelay = 10000.
    Greetings,
    Drifter2006

  10. #50
    Neuer Benutzer Öfters hier
    Registriert seit
    16.10.2006
    Ort
    Essen
    Beiträge
    26
    Hallo Drifter2006,
    schön das du wieder da bist. Ich hoffe du kannst deine PC Probleme schnell lösen.

    Ich habe "unsere" Schaltung als Innen / Aussen Termometer erweitert.
    Config Twi = 100000 habe ich schon recht lange drin - ohne kommen zuviele Messfehler.
    Aber was ich meine: Die innentemperatur liegt so zwischen 19 und 24 C.
    Aussen haben wir zwischen 8 und 13 C. Innen ist alles OK.

    Aussen hat man den Eindruck, dass die Temperatur nur in 1 C Schritten wechselt. z.B. wenn es kälter wird von 10,1 direkt auf 9,1. Kann es sein, dass die Berechnung einen Fehler enthält??

    Hier mal meine letzte Version:

    '********************************* PORTS *********************************'
    $regfile = "M32def.dat" ' chip
    $crystal = 16000000 ' frequenz
    $baud = 19200 ' baud rate

    $hwstack = 32 ' default use 32 for the hardware stack
    $swstack = 10 ' default use 10 for the SW stack
    $framesize = 40 ' default use 40 for the frame space
    $lib "I2C_TWI.LBX"

    Config Scl = Portc.0 ' we need to provide the SCL pin name
    Config Sda = Portc.1 ' we need to provide the SDA pin name
    Config Twi = 100000 ' wanted clock frequency
    'Twbr = 12 'bit rate register 'will set TWBR and TWSR
    'Twsr = 0 'pre scaler bits

    Config Lcdpin = Pin , Db4 = Portb.3 , Db5 = Portb.2 , Db6 = Portb.1 , Db7 = Portb.0 , E = Portb.5 , Rs = Portb.7 ' Pinbelegung "LCD-Port)"
    Config Lcd = 20 * 4a , Chipset = Ks077 ' LCD 204 DIP 20x4
    'Config Lcd = 16 * 2 , Chipset = Dogm163v5 , Contrast = &H702 ' EA DOGM162W-A
    Config Portb = Output
    Config Lcdbus = 4

    Config Portc.6 = Output 'Toggle bei jeder Messung die LED C.6
    Config Portc.7 = Output 'Temperatur unter 0 °C LED C.7

    '************************************************* ************************'
    '******************************* VARIABLES *******************************'
    Dim ___lcdno As Bit
    Dim I2c_byte As Byte
    Dim Loops1 As Byte
    Dim Count As Byte
    Dim Slope As Byte
    Dim Temp1 As Integer
    Dim Temp2 As Integer
    Dim Temp3 As Integer
    Dim Temp_cor As Integer
    Dim Temp3_s As String * 16
    Dim Temp_c As Integer
    Dim Ds1621_i2c_address As Integer
    Dim Ds1621_i2c_r_address As Integer
    '************************************************* ************************'
    Config I2cdelay = 800
    Initlcd
    Deflcdchar 1 , 3 , 3 , 32 , 32 , 32 , 32 , 32 , 32 ' replace ? with number (0-7)
    Cls
    Cursor Off Noblink 'hide cursor
    '************************************************* ************************'
    '******************************** PROGRAM ********************************'

    '***** Innen
    Temp_c_loop:
    Ds1621_i2c_address = 144
    Ds1621_i2c_r_address = 145
    Temp_cor = 0
    Gosub Get_ds1621_temperature

    Print "oben"
    Print "Temp1" ; " " ; Temp1 ; " " ; "Temp2" ; " " ; Temp2 ; " " ; "Temp3" ; " " ; Temp3 ; " " ; "Temp_c" ; " " ; Temp_c 'Test auf das Terminal
    Print " "

    Temp1 = Temp_c / 10 'get hundreds tens ones xxx,'
    Temp1 = Abs(temp1)

    Temp2 = Temp_c / 10 'get 1/10 ,x'
    Temp2 = Temp2 * 10
    Temp2 = Temp_c - Temp2
    Temp2 = Abs(temp2)
    Temp3 = Temp1 * 10
    Temp3 = Temp3 + Temp2
    Temp3 = Temp3 + Temp_cor ' fuer den Korrekturfaktor
    Temp3_s = Str(temp3) ' der Formatbefehl erfordert einen String

    Toggle Portc.6 'Toggle bei jeder Messung

    Locate 1 , 1
    If Temp_c < 0 Then Lcd "-"; 'print "-" if temp_c is negative'
    Locate 1 , 2
    Lcd Format(temp3_s , "00.0") ; Chr(1) ; "C Innen" 'print xxx.x C Wohnraum'

    Print "unten"
    Print "Temp1" ; " " ; Temp1 ; " " ; "Temp2" ; " " ; Temp2 ; " " ; "Temp3" ; " " ; Temp3 ; " " ; "Temp_c" ; " " ; Temp_c 'Test auf das Terminal
    Print " "

    Wait 1
    'Goto Temp_c_loop ' nur bei einer Temperatur


    '***** Aussen
    'Temp_c_loop:
    Ds1621_i2c_address = 146
    Ds1621_i2c_r_address = 147
    Temp_cor = 0
    Gosub Get_ds1621_temperature

    Temp1 = Temp_c / 10 'get hundreds tens ones xxx,'
    Temp1 = Abs(temp1)

    Temp2 = Temp_c / 10 'get 1/10 ,x'
    Temp2 = Temp2 * 10
    Temp2 = Temp_c - Temp2
    Temp2 = Abs(temp2)
    Temp3 = Temp1 * 10
    Temp3 = Temp3 + Temp2 ' fuer den Korrekturfaktor
    Temp3_s = Str(temp3) ' der Formatbefehl erfordert einen String

    Locate 2 , 1
    If Temp_c < 0 Then Lcd "-"; 'print "-" if temp_c is negative'

    Locate 2 , 2
    If Temp1 < 10 Then
    Lcd " " ; Format(temp3_s , "0.0") ; Chr(1) ; "C Aussen" ' unter 10 C print x.x C Aussen'
    Else ' über 10 C print xx.x C Aussen'
    Lcd Format(temp3_s , "00.0") ; Chr(1) ; "C Aussen"
    End If

    'Print "Temp1" ; " " ; Temp1 ; " " ; "Temp2" ; " " ; Temp2 ; " " ; "Temp3" ; " " ; Temp3 'Test auf das Terminal

    Wait 1
    Goto Temp_c_loop

    '************************************************* ************************'
    '****************************** SUBROUTINES ******************************'
    Get_ds1621_temperature:

    For Loops1 = 1 To 2
    Ds1621_start_convert:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HEE
    I2cstop
    Waitms 25

    Ds1621_check_conversion_done:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HAC
    I2cstop
    Waitms 25
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte I2c_byte , Nack
    I2cstop
    Waitms 25
    Temp1 = I2c_byte And 1
    Temp2 = I2c_byte And 128
    If Temp1 = 1 Then If Temp2 = 128 Then Goto Ds1621_check_conversion_done

    Ds1621_read_temp:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HAA
    I2cstop
    Waitms 25
    I2cstart
    I2cwbyte Ds1621_i2c_r_address

    I2crbyte Temp_c , Nack
    If Temp_c > 127 Then Temp_c = Temp_c + &HFF00
    Temp_c = Temp_c * 100

    Ds1621_read_count:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HA8
    I2cstop
    Waitms 25
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte Count , Nack
    I2cstop
    Waitms 25

    Ds1621_read_slope:
    I2cstart
    I2cwbyte Ds1621_i2c_address
    I2cwbyte &HA9
    I2cstop
    Waitms 25
    I2cstart
    I2cwbyte Ds1621_i2c_r_address
    I2crbyte Slope , Nack
    I2cstop
    Waitms 25

    Temp1 = Count * 100
    Temp2 = Slope * 100

    Temp2 = Temp2 - Temp1
    Temp1 = Temp2 / Slope

    Temp_c = Temp_c - 25
    Temp_c = Temp_c + Temp1

    Temp_c = Temp_c / 10 'get rid of last digit xxxxx becomes xxxx'
    I2cstop
    Next
    Return

    '************************************************* ************************'

    Gruß Peter

Seite 5 von 6 ErsteErste ... 3456 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test