Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: What is wrong with DS1631 Reading ? Kategorie: C-Control I V1.2/2.0 (von DIE HARD - 19.10.2005 14:33)
 Als Antwort auf What is wrong with DS1631 Reading ? von Daniel - 19.10.2005 9:11

> I'm desperately trying to read I2C DS1631 (Conrad 198298). What is wrong in my program below ?? TEMP is always Zero.

Hi......
yes, and I desperately tried to find out why.
This is the reason:

define TEMP        word[1]    
define TEMPHI      byte[6]      !!!!!!!!
define TEMPLO      byte[7]     !!!!!!!

The word TEMP is base for the calculation. This calculation is done with
HBYTE and LOBYTE of TEMP seperately.
Therefore TEMPHI and TEMPLO have to be assigned as byte[1] and byte[2]

Below you find a running version of your program.
Use this one for further development, because i changed some more details.
e.g added a delay, and changed some delays to smaller values for speed up.

ciao.....

 




define EXTPORT     byteport[10] 'LCD sur PCF8574

define Led         port[4]
'define SDA         port[9]
'define SCL         port[10]

'--------------------------
'---- SYSTEM MEMORY -------
'--------------------------

define DS1631      158  'I2C ADDRESS $9E

'------------------------------
define TEMP        word[1]
define TEMPHI      byte[1]
define TEMPLO      byte[2]
define SCONFIG     byte[3]
define DATA        byte[4]
define DELAY       byte[5]
'--- LCD-I2C INTERFACE  -------
define OUTBYTE     byte[6]
define LCD         byte[7]
define BUF         byte[8]
'------------------------------
'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
define CONVERT          &H51
define STOP_CONVERT     &H22
define READ_TEMP        &HAA
define CONFIG           &HAC
define RESET            &H54
'---------------------------

'SDA = on : SCL =on
print"#ON_LCD#";
print"#INIT#";
print"READ DS1631 TEMP";
print"#OFF#";


gosub lcd_init 'initialisation LCD
'goto show'**********************************************
'-----------------------------------------------------

gosub DS1631RESET
DATA = 1 : gosub DS1631WRITE_STATUS  ' ONE SHOT MODE
pause 10
data = 0

'-------------------------------------------------------------
'-----            LOOP READING TEMPERATURE                 ---
'-------------------------------------------------------------
#LOOP
gosub DS1631CONVERT
#WAIT_READY
gosub DS1631GET_STATUS
if (DATA and &H80)=0 then goto WAIT_READY
gosub DS1631GET_TEMP
TEMP=TEMP SHR 7
if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)

'print temp
'-------------------------------------------------------------
'-----            AFFICHAGE TEMPERATURE                 ---
'-------------------------------------------------------------
#show
gosub LCD_CLR
   'temp=100

  TEMP = TEMP / 2
  LCD = 1 : gosub L1_GOTOPOS    'LINE 1 POS 1
  LCD = 84   : gosub WCAR 'T
  LCD = 101  : gosub WCAR 'e
  LCD = 109  : gosub WCAR 'm
  LCD = 112  : gosub WCAR 'p
  LCD = 46   : gosub WCAR '.
  LCD = 32   : gosub WCAR 'space
 
  LCD = (Temp / 100) + 48 : gosub WCAR
  LCD = ((Temp - ((Temp / 100) * 100)) / 10) + 48 : gosub WCAR
  LCD = (Temp - ((Temp / 10) * 10)) + 48 : gosub WCAR
  LCD = &H2E : gosub WCAR   '.

  LCD = ((TEMPLO and 1)*5) + 48 : gosub WCAR

  LCD = 223 : gosub WCAR '°
  LCD = 67 : gosub WCAR 'C
  LCD = 32 : gosub WCAR 'space

Pause 20
goto LOOP
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII





'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'IIIII             DS1631  DRIVER                 III
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII

'------------------   DS1631 RESET  ------------------
#DS1631RESET
print"#ON_IIC#";"#START#";:put DS1631:put RESET:print"#STOP#";"#OFF#";
goto IIC_STATUS
'------------------   DS1631 CONVERT ------------------
#DS1631CONVERT
print"#ON_IIC#";"#START#";:put DS1631:put CONVERT:print"#STOP#";"#OFF#";
goto IIC_STATUS
'----------------- GET DS1631 STATUS -----------------
#DS1631GET_STATUS
print"#ON_IIC#";"#START#";:put DS1631:put CONFIG:print"#STOP#";"#OFF#";
print"#ON_IIC#";"#START#";:put DS1631+1:get DATA:print"#STOP#";"#OFF#";
goto IIC_STATUS
'----------------- WRITE DS1631 STATUS -----------------
#DS1631WRITE_STATUS
print"#ON_IIC#";"#START#";:put DS1631:put CONFIG:put DATA:print"#STOP#";"#OFF#";
goto IIC_STATUS
'----------------- GET DS1631 TEMPERATURE -----------------
#DS1631GET_TEMP
print"#ON_IIC#";"#START#";:put DS1631:put READ_TEMP:print"#STOP#";"#OFF#";
print"#ON_IIC#";"#START#";:put DS1631+1:get TEMPHI:get TEMPLO:print"#STOP#";"#OFF#";
goto IIC_STATUS
'-----------------------------------------------------
'----- CONFIG REGISTER ABFRAGE UND ERROR CLEAR -------
'-----------------------------------------------------
#IIC_STATUS
print"#ON_CONFIG#";        'UMLEITUNG ZUM CONFIG MODULE
get SCONFIG                 'CONFIG REGISTER LESEN
put (SCONFIG and &B10111111)'IIC ERROR FLAG IN CONFIG LÖSCHEN
print"#OFF#";
if (SCONFIG and &B01000000)>0 then Led=on else Led=off
return
'-----------------------------------------------------





'-------------------------------------------------------
'--- PCF 8574 LCD DRIVER AT ADDR 7 / EXT BYTEPORT 10 ---
'-------------------------------------------------------
#LCD_INIT
EXTPORT=0
LCD=&H38:gosub LCD_WRITECMD
EXTPORT= &B00000010:EXTPORT= &B01000010:EXTPORT= &B00000010:
LCD=&H28:gosub LCD_WRITECMD:LCD=&H0C:gosub LCD_WRITECMD
#LCD_CLR
LCD=&H02:gosub LCD_WRITECMD:LCD=&H01:gosub LCD_WRITECMD:pause 5:return
#L1_GOTOPOS
LCD=LCD +&H7F:goto LCD_WRITECMD
#L2_GOTOPOS
LCD=LCD +&HBF:goto LCD_WRITECMD
#LCD_WRITECMD
BUF = off:goto LCD_WRITE
#WCAR
BUF = &B00100000
#LCD_WRITE
'--------- ------WRITE HI NIBBLE ------------------------
OUTBYTE=BUF or (LCD shr 4)
EXTPORT=OUTBYTE or &B01000000:EXTPORT=OUTBYTE and &B10111111
'--------------- WRITE LO NIBBLE ------------------------
OUTBYTE=BUF or (LCD and &H0F)
EXTPORT=OUTBYTE or &B01000000:EXTPORT=OUTBYTE and &B10111111
'--------------- SOME LCDs NEED SOME DELAY HERE ---------
FOR DELAY=0 TO 255
NEXT
return
'-------------------------------------------------------

 Antwort schreiben

Bisherige Antworten:

Re: What is wrong with DS1631 Reading ? (von Daniel - 22.10.2005 14:36)