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:
Kann mir dabei jemand helfen, evtl. habe ich ja noch einen Fehler im Programm?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
Und kann man das genze evtl. kürzer und vereinfachter schreiben?
Danke







Zitieren

Lesezeichen