Hallo,

ich habe mehrere DS1621 am I2C-Bus, besser gesagt erst mal 2!
Der eine ist Adressiert auf &H90 und der andere auf &H91.

Nun habe ich mir aus den Sample Basic Programmen etwas zusammen gecodet, das aber anscheinend nicht funktioniert, sobald ich den 2. DS1621 auslesen will!

Hier mal der Code:
Code:
'**************** I/O PORTS ****************'
define sda port[7]
define scl port[8]
'*******************************************'
'**************** VARIABLES ****************'
define control_flags byte[1]
define i2c_nack bit[1]
define i2c_last bit[2]
define i2c_nack_count byte[2]
define i2c_byte byte[3]
define i2c_out_bit bit[24]
define i2c_in_bit bit[17]
define loop byte[4]

define temp_1 word
define temp_2 word
'*******************************************'
' *** Daten-Definition ***
define lcd_buf byte
define lcd_param byte

' *** Definition LCD-Ports ***
define lcd_port byteport[2]
define lcd_rs port[14]
define lcd_rw port[13]
define lcd_e port[15]

'*** ASCII-Codes ***
define A_ &H41
define B_ &H42
define C_ &H43
define D_ &H44
define E_ &H45
define F_ &H46
define G_ &H47
define H_ &H48
define I_ &H49
define J_ &H4A
define K_ &H4B
define L_ &H4C
define M_ &H4D
define N_ &H4E
define O_ &H4F
define P_ &H50
define Q_ &H51
define R_ &H52
define S_ &H53
define T_ &H54
define U_ &H55
define V_ &H56
define W_ &H57
define X_ &H58
define Y_ &H59
define Z_ &H5A

define LEERZ &H20
define MINUS &H2D
define NULL &H30
define GLEICH &H3D
define DOPPELPUNKT &H3A
define KOMMA &H2C
define GRAD &HDF
'**************** CONSTANTS ****************'
define ds1621_1_address &H90
define ds1621_2_address &H91
'*******************************************'
'****************** SETUP ******************'
gosub LCD_INIT
pause 10
'*******************************************'
'***************** PROGRAM *****************'
#start
gosub get_ds1621_temp1
'gosub get_ds1621_temp2
temp_2 = temp_1 + 10
if i2c_nack then goto start

gosub LCD_CLS
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = M_ : gosub LCD_WRITECHAR
lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = NULL + 1 : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = GLEICH : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
if temp_1 < 0 then lcd_param = MINUS : gosub LCD_WRITECHAR
lcd_param = NULL + abs(temp_1/10/10) : gosub LCD_WRITECHAR
lcd_param = NULL + abs((temp_1-temp_1/100*100)/10) : gosub LCD_WRITECHAR
lcd_param = KOMMA : gosub LCD_WRITECHAR
lcd_param = NULL + abs(temp_1-temp_1/10*10) : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = GRAD : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR
lcd_param = 2 : gosub LCD_GOTOLINE 
lcd_param = T_ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = M_ : gosub LCD_WRITECHAR
lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = NULL + 2 : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = GLEICH : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
if temp_2 < 0 then lcd_param = MINUS : gosub LCD_WRITECHAR
lcd_param = NULL + abs(temp_2/10/10) : gosub LCD_WRITECHAR
lcd_param = NULL + abs((temp_2-temp_2/100*100)/10) : gosub LCD_WRITECHAR
lcd_param = KOMMA : gosub LCD_WRITECHAR
lcd_param = NULL + abs(temp_2-temp_2/10*10) : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = GRAD : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR

print"****************"
print"Temp1 = "
if temp_1 < 0 then print"-";
print temp_1
print abs(temp_1/10);",";abs(temp_1-temp_1/10*10);"ºC"
print"****************"
print"Temp2 = "
if temp_2 < 0 then print"-";
print temp_2
print abs(temp_2/10);",";abs(temp_2-temp_2/10*10);"ºC"
print"****************"
pause 200
goto start
'*******************************************'
'*************** SUBROUTINES ***************'
#get_ds1621_temp1
#ds1621_1_start_convert
gosub start_i2c
i2c_byte = ds1621_1_address : gosub write_byte_i2c
i2c_byte = &hee : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack_count > 6 then goto no_ack_from_ds1621_1
if i2c_nack then goto ds1621_1_start_convert
#ds1621_1_check_conversion_done
gosub start_i2c
i2c_byte = ds1621_1_address : gosub write_byte_i2c
i2c_byte = &hac : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack then goto ds1621_1_pass_check_conversion_done
gosub start_i2c
i2c_byte = ds1621_1_address+1 : gosub write_byte_i2c
gosub read_last_byte_i2c
gosub stop_i2c
#ds1621_1_pass_check_conversion_done
if i2c_nack_count > 9 then goto no_ack_from_ds1621_1
if i2c_nack then goto ds1621_1_check_conversion_done
if (i2c_byte and 1) = 1 then if (i2c_byte and 128) = 0 then goto ds1621_1_check_conversion_done
#ds1621_1_read_temp
gosub start_i2c
i2c_byte = ds1621_1_address : gosub write_byte_i2c
i2c_byte = &haa : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack then goto pass_ds1621_1_read_temp
gosub start_i2c
i2c_byte = ds1621_1_address+1 : gosub write_byte_i2c
gosub read_byte_i2c : if i2c_byte > 127 then temp_1 = (&hff00 + i2c_byte) * 10 else temp_1 = i2c_byte * 10
gosub read_last_byte_i2c : if (i2c_byte and 128) = 128 then temp_1 = temp_1 + 5
gosub stop_i2c
#pass_ds1621_1_read_temp
if i2c_nack_count > 9 then goto no_ack_from_ds1621_1
if i2c_nack then goto ds1621_1_read_temp
if temp_1 = - 600 then goto ds1621_1_start_convert
return

#get_ds1621_temp2
#ds1621_2_start_convert
gosub start_i2c
i2c_byte = ds1621_2_address : gosub write_byte_i2c
i2c_byte = &hee : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack_count > 6 then goto no_ack_from_ds1621_2
if i2c_nack then goto ds1621_2_start_convert
#ds1621_2_check_conversion_done
gosub start_i2c
i2c_byte = ds1621_2_address : gosub write_byte_i2c
i2c_byte = &hac : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack then goto ds1621_2_pass_check_conversion_done
gosub start_i2c
i2c_byte = ds1621_2_address+1 : gosub write_byte_i2c
gosub read_last_byte_i2c
gosub stop_i2c
#ds1621_2_pass_check_conversion_done
if i2c_nack_count > 9 then goto no_ack_from_ds1621_2
if i2c_nack then goto ds1621_2_check_conversion_done
if (i2c_byte and 1) = 1 then if (i2c_byte and 128) = 0 then goto ds1621_2_check_conversion_done
#ds1621_2_read_temp
gosub start_i2c
i2c_byte = ds1621_2_address : gosub write_byte_i2c
i2c_byte = &haa : gosub write_byte_i2c
gosub stop_i2c
if i2c_nack then goto pass_ds1621_1_read_temp
gosub start_i2c
i2c_byte = ds1621_2_address+1 : gosub write_byte_i2c
gosub read_byte_i2c : if i2c_byte > 127 then temp_2 = (&hff00 + i2c_byte) * 10 else temp_2 = i2c_byte * 10
gosub read_last_byte_i2c : if (i2c_byte and 128) = 128 then temp_2 = temp_2 + 5
gosub stop_i2c
#pass_ds1621_2_read_temp
if i2c_nack_count > 9 then goto no_ack_from_ds1621_2
if i2c_nack then goto ds1621_2_read_temp
if temp_2 = - 600 then goto ds1621_2_start_convert
return

#start_i2c
sda = 0 : scl = 0
return

#stop_i2c
sda = 0 : deact scl : deact sda
return

#write_byte_i2c
for loop = 1 to 8
sda = i2c_out_bit
deact scl
#write_byte_i2c_clock_stretch
if not scl then goto write_byte_i2c_clock_stretch
scl = 0
i2c_byte = i2c_byte shl 1
next
deact sda
deact scl
#write_byte_i2c_ack_clock_stretch
if not scl then goto write_byte_i2c_ack_clock_stretch
i2c_nack = sda
scl = 0
if i2c_nack then goto i2c_error
i2c_nack_count = 0
return
#i2c_error
i2c_nack_count = i2c_nack_count + 1
goto stop_i2c

#read_byte_i2c
i2c_last = 0
#get_i2c_byte
deact sda
for loop = 1 to 8
deact scl
#read_byte_i2c_clock_stretch
if not scl then goto read_byte_i2c_clock_stretch
i2c_in_bit = sda
scl = 0
if loop < 8 then i2c_byte = i2c_byte shl 1
next
if i2c_last then deact sda else sda = 0
deact scl
#read_byte_i2c_ack_clock_stretch
if not scl then goto read_byte_i2c_ack_clock_stretch
scl = 0
return

#read_last_byte_i2c
i2c_last = 1
goto get_i2c_byte
'*******************************************'
'******* INITIALIZATION SUBROUTINES ********'

'*******************************************'
'****************** DATA *******************'

'*******************************************'
'************* ERROR MESSAGES **************'
#no_ack_from_ds1621_1
gosub LCD_CLS
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = NULL + 2 : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = N_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR
lcd_param = H_ : gosub LCD_WRITECHAR
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = NULL + 1 : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = F_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = U_ : gosub LCD_WRITECHAR
lcd_param = N_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR

print"*******************"
print"* E-I2C ERROR:    *"
print"* Chip1 not found *"
print"*******************"
pause 300
return

#no_ack_from_ds1621_2
gosub LCD_CLS
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = NULL + 2 : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = E_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = R_ : gosub LCD_WRITECHAR
lcd_param = 2 : gosub LCD_GOTOLINE
lcd_param = N_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = C_ : gosub LCD_WRITECHAR
lcd_param = H_ : gosub LCD_WRITECHAR
lcd_param = I_ : gosub LCD_WRITECHAR
lcd_param = P_ : gosub LCD_WRITECHAR
lcd_param = NULL + 2 : gosub LCD_WRITECHAR
lcd_param = LEERZ : gosub LCD_WRITECHAR
lcd_param = F_ : gosub LCD_WRITECHAR
lcd_param = O_ : gosub LCD_WRITECHAR
lcd_param = U_ : gosub LCD_WRITECHAR
lcd_param = N_ : gosub LCD_WRITECHAR
lcd_param = D_ : gosub LCD_WRITECHAR

print"*******************"
print"* E-I2C ERROR:    *"
print"* Chip2 not found *"
print"*******************"
pause 300
return
'*******************************************'

'LCD Subroutinen
'*** LCD_Interface ***
'( muss in jedes Programm mit LCD-Ausgabe eingefuegt werden)

#LCD_INIT

' alle ports 0
  lcd_port = OFF

' 8-Bit-Modus aktivieren
  lcd_param=&H38 : gosub LCD_WRITECMD

' mit 8-Bit-Command in 4-Bit-Modus umschalten
  lcd_port=&B00000010
  tog lcd_e
  tog lcd_e

' ab jetzt 4-Bit-Modus
  lcd_param = &H28 : gosub LCD_WRITECMD
  lcd_param = &H0C : gosub LCD_WRITECMD

' Display loeschen
#LCD_CLS
  lcd_param = &H02 : gosub LCD_WRITECMD
  lcd_param = &H01 : gosub LCD_WRITECMD
return

' Zeilenwechsel
#LCD_GOTOLINE
  if lcd_param = 1 then lcd_param = &H80
  if lcd_param = 2 then lcd_param = &HC0
  goto LCD_WRITECMD

' LCD-Kommando
#LCD_WRITECMD
  lcd_buf = OFF
  goto LCD_WRITE

' Zeichenausgabe
#LCD_WRITECHAR
  lcd_buf = &B00100000

' Kommando oder Zeichen an Display senden
#LCD_WRITE
  lcd_port = lcd_buf or (lcd_param shr 4) ' Hi-Nibble
  tog lcd_e
  tog lcd_e
  lcd_port = lcd_buf or (lcd_param and &H0F)  ' Lo-Nibble
  tog lcd_e
  tog lcd_e
return
Kann mir dabei jemand helfen, evtl. habe ich ja noch einen Fehler im Programm?

Und kann man das genze evtl. kürzer und vereinfachter schreiben?

Danke