Hello,
I translated a CCBasic program I wrote into a Bascom 8051 program.
The CCBasic version works pervectly, I have not been able to test the Bascom 8051 version yet.
I think with a few modifications the Bascom 8051 program should work on a AVR.
Greetings,
Windt H.J.
Code:'***************************************' '* WINDT SYSTEMS *' '* DS1621 v1.0 for 89S8252 Flash Board *' '* 2006 / H.J. WINDT *' '***************************************' '----------------------------------------------------------------------------------------------------' 'This software for the 89S8252 will read the DS1621 9 bit Temperature' '-55°C to +125°C in 0.5°C increments and display the data on a terminal program as T = xxx,x°C.' 'The temperature is read as -550 to 1250, the last digit is actually the digit behind the comma,' 'example 1: temp_c = -15 is actually -1,5°C' 'example 2: temp_c = 250 is actually 25,0°C.' 'Communication with the DS1621 is via the I2C bus.' 'Feel free to use and share this software!' 'DS1621 -->> DALLAS SEMICONDUCTOR Digital Thermometer and Thermostat' '----------------------------------------------------------------------------------------------------' '********************************* PORTS *********************************' Config Sda = P1.0 Config Scl = P1.1 '*************************************************************************' '******************************* VARIABLES *******************************' Dim I2c_byte As Byte Dim Loops1 As Byte Dim Temp1 As Integer Dim Temp2 As Integer Dim Temp_c As Integer '*************************************************************************' '******************************* CONSTANTS *******************************' Const Ds1621_i2c_address = &H0 Const Ds1621_i2c_r_address = &H1 '*************************************************************************' '********************************* SETUP *********************************' Config I2cdelay = 800 '*************************************************************************' '******************************** PROGRAM ********************************' Temp_c_loop: Gosub Get_ds1621_temperature Temp1 = Temp_c / 10 'calculate hundreds tens ones from temp_c' Temp1 = Abs(temp1) Temp2 = Temp_c / 10 'calculate 1/10th from temp_c' Temp2 = Temp2 * 10 Temp2 = Temp_c - Temp2 Temp2 = Abs(temp2) Print "T = "; 'display T = ' If Temp_c < 0 Then Print "-"; 'display "-" if temp_c < 0' Print Temp1 ; "," ; Temp2 ; "°C" 'display temperature as xxx,x°C' 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 I2c_byte , Ack If I2c_byte > 127 Then Temp_c = &HFF00 + I2c_byte Else Temp_c = I2c_byte Temp_c = Temp_c * 10 I2crbyte I2c_byte , Nack Temp1 = I2c_byte And 128 If Temp1 = 128 Then Temp_c = Temp_c + 5 I2cstop Next Return '*************************************************************************' '********************************* DATA **********************************' '*************************************************************************'







Zitieren

Lesezeichen