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 

 What is wrong with DS1631 Reading ? Kategorie: C-Control I V1.2/2.0 (von Daniel - 19.10.2005 9:11)
Daniel nutzt:  CC1-M-Unit V1.2/2.0
I'm desperately trying to read I2C DS1631 (Conrad 198298). What is wrong in my program below ?? TEMP is always Zero.

'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'IIIIIII  DEMO ZUM BASIC-COMPUTER UNIT M 1.2/2.0 (by DIE HARD)  IIIII
'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
'--------------------------------------------------------------------
' Beispiel zum BASIC-COMPUTER    mit dem Programmer/Application-Board
'--------------------------------------------------------------------
' ANWENDUNG:         IIC_BUS - TEMPERATURSENSOR (198298)
'                    TEMPERATUR DS1631 AM IIC-BUS-BUS ABFRAGEN
'              CControl Unit M2 Version 2.02
'              LCD on Byteport[10]
'--------------------------------------------------------------------
' Eine kleine DEMO welchedie TEMPERATUR eines DS1631 am IIC-BUS abfragt

' Beschreibung:
' Der DS1631 wird angesprochen indem zunächst die START-Bedingung und
' danach die ADRESSE zusammen mit dem READ/WRITE-Bit gesendet wird.
' Die Adresse besteht aus einem festen, nicht veränderbaren Anteil und
' einem vom Benutzer wählbaren Teil (drei Jumper). Das letzte Bit
' legt fest ob eine READ (Eingabe) oder WRITE (Ausgabe) über den PCF 8574
' erfolgt
' Es ist nur die Schreibadresse als Konstante definiert, die Leseadresse
' berechnet der Treiber zu Schreibadresse+1
' In diesem Beispiel hat der DS1631 die Adresse 7 (alle Bits auf HI)
' d.h. alle Jumper müssen abgezogen sein.
' Damit ergibt sich für eine READ-Operation folgender Wert:
'
' 1 0 0 1 1 1 1 1       READ-Operation ADR 159
' I------I-----I-I
' FIX ADR  ADR  R/W
'
' Für eine WRITE-Operation ist das letzte Bit LO und es ergibt sich
' folgender Wert:
'
' 1 0 0 1 1 1 1 0       WRITE-Operation ADR 158
' I------I-----I-I
' FIX ADR  ADR  R/W
'-----------------------------------------------------------------------
'Programm:
'Das Unterprogramm DS1631GET_TEMP liefert in TEMP einen 9 Bit-Wert,
'der allerdings linksbündig verschoben ist. Für eine richtige Anzeige
'ist eine entsprechende Korrektur notwendig. Diese 9 Bit liefern eine
'Auflösung von 0.5 Grad.
'Das Programm liset den DS 1631 im "ONE SHOT" Modus, d.h. der Sensor ist
'nur während der Temperaturwandlung/Übertragung Strom (1mA). Sonst beträgt
'die Stromaufnahme des Sensor selbst < 1uA
'Die Demo ist im neg. Temperaturbereich nicht getestet.
'------------------------------------------------------------------------

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]


'--- LCD-I2C INTERFACE  -------
define OUTBYTE     byte[3]
define LCD         byte[4]
define BUF         byte[5]
'------------------------------

define TEMPHI      byte[6]
define TEMPLO      byte[7]
define SCONFIG     byte[8]
define DATA        byte[9]


'--------------------------
'--- DS1631 COMMANDS ------
'--------------------------
define CONVERT          &H51
define STOP_CONVERT     &H22
define READ_TEMP        &HAA
define CONFIG           &HAC
define RESET            &H54
'---------------------------

'SDA = on : SCL =on

gosub lcd_init 'initialisation LCD
'-----------------------------------------------------

'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

'if TEMPHI>=128 then goto NEGTEMP     'ancienne version
'TEMP=TEMP shr 7 : goto show

'#NEGTEMP TEMP=(TEMP shr 7)or &HFE


TEMP=TEMP SHR 7
if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)


'-------------------------------------------------------------
'-----            AFFICHAGE TEMPERATURE                 ---
'-------------------------------------------------------------
#show
gosub LCD_CLR


  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 100
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 '&H38 = 2 lignes ++
  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 20 : return
#L1_GOTOPOS
  LCD = LCD + 127 : goto LCD_WRITECMD
#L2_GOTOPOS
  LCD = LCD + 191 : goto LCD_WRITECMD
#L3_GOTOPOS
  LCD = LCD + 147 : goto LCD_WRITECMD
#L4_GOTOPOS
  LCD = LCD + 211 : 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
return
'===========================================================


 Antwort schreiben

Bisherige Antworten:

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