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: DS1621 Minuswerte Kategorie: Programmierung Basic (von Henrik, Homepage - 30.01.2005 14:10)
 Als Antwort auf Re: DS1621 Minuswerte von Lorenz - 30.01.2005 13:42
Hallo,

> > willst Du die Temperaturausgabe auf 10tel Grad genau? Man kann nämlich viel einfacher die Temperatur mit einer Genauigkeit von 0,5 °C abfragen. Das ist etwas unkomplizierter. Bei negativen Temperaturen muss das  gebildet werden. Bei mir funktioniert der Code von Henrik allerdings soweit ganz gut. Allerdings scheint der Sensor manchmal sowas wie -19 °C zu liefern. Dann dauert es eine Weile und ich habe dann wieder den richtigen Wert.

Das Problem kenne ich, lieht aber nicht an der Software, sondern an der Hardware. Passiert immer
bei der ersten Messung (initialisierung) und bei schlecht entstörten 1621/1631 auch zwischendurch
bei Spikes auf der Spannungsversorgung. IdR hilft bereits ein 100nF Kondensator unmittelbar am
Sensorchip.
 
> Ja ich brauche wenn möglich auf 10tel Grad (in der Landwirtschaft Schorfwarnung).

10tel sind Dekoration. Nett anzusehen, aber in der Steuerungstechnik nicht wirklich notwendig.

> Wie geht das mit der Zweierkomplement.

Wenn ich gemein wäre, würde ich jetzt einfach sagen: Mit XOR FFh:).

So gemein bin ich dann ja dann doch nicht. Es gibt viele Möglichkeiten, u.A.
 (FFh - gelesener Wert+1).

Für die Micro habe ich ein Anwendungsprogramm geschrieben, das dies in der Funktion Readtemp()
verdeutlicht.

Suche Dir das passende raus, im Prinzip funktioniert das natürlich auch mit der V2 und hoher
Auflösung.

Grüße
Henrik



'------------------------------------------------------------------
'----------- Demonstration zur C-Control Micro --------------------
'------------------------ in Basic++ ------------------------------
'
'--- Zeigt den Einsatz von I2C Komponenten (PCF8574 Portextender, -
'--- Dallas Temperatursensor)und beinhaltet die Funktionen für    -
'--- die Ansteuerung eines LC-Displays mit Standardcontroler.     -
'--- Außerdem wird der Frequenzeingang benutzt, um ein Taktsignal -
'--- (z.B. von einem Flüssigkeitsdurchflusmesser) auszuwerten.    -
'--- Es wurde auf halbwegs sparsamen Gebrauch von Variablen ge-   -
'--- achtet. ------------------------------------------------------
'
'--- Die Demo ist "as is"  kompilierbar und lauffähig. Es müssen  -
'--- keine Libraries importiert werden, alle Deklarationen sind   -
'--- bereits vorhanden.              Henrik Reimers,  Jan. 2005   -
'                                                                 -
'-------------- http://www.henrik-reimers.de ----------------------
'------------------------------------------------------------------

OPTION CCMICRO

'-------- Globale Variablen definieren ----------------------------

DEFINE flag       BYTE[2]
DEFINE nullkomma  BIT [9]
DEFINE ackflag    BIT[10]
DEFINE minusflag  BIT[11]
DEFINE flowcheck  BIT[12]

DEFINE DEV        BYTE
DEFINE TEMP       BYTE
DEFINE DATA       BYTE
DEFINE mask       BYTE
DEFINE temperatur BYTE
DEFINE value      BYTE
DEFINE lcddata    BYTE
DEFINE POS        BYTE
DEFINE buf        BYTE
DEFINE i          BYTE
'--------------------------
DEFINE flow       BYTE

'------------------------ Konstanten -------------------------------

'Devices
CONST  pcf1 = 4Eh         'Deviceadresse des PCF8574 (ggf. anpassen)
                          'in diesem Fall alle Adressleitungen auf
                          'log. 1    
CONST ds1   = 158         'DS1621 Adresse des 1. Temperatursensor
CONST ds2   = 150         'DS1621 Adresse des 2. Temperatursensor

'ASCII Deklarationen
CONST MINUS=2Dh
CONST BLANK=20h
CONST DOT=2Eh
CONST Z0=30h
CONST Z1=31h
CONST Z2=32h
CONST Z3=33h
CONST Z4=34h
CONST Z5=35h
CONST Z6=36h
CONST Z7=37h
CONST Z8=38h
CONST Z9=39h
CONST A_=41h
CONST B_=42h
CONST C_=43h
CONST D_=44h
CONST E_=45h
CONST F_=46h
CONST G_=47h
CONST H_=48h
CONST I_=49h
CONST J_=4Ah
CONST K_=4Bh
CONST L_=4Ch
CONST M_=4Dh
CONST N_=4Eh
CONST O_=4Fh
CONST P_=50h
CONST Q_=51h
CONST R_=52h
CONST S_=53h
CONST T_=54h
CONST U_=55h
CONST V_=56h
CONST W_=57h
CONST X_=58h
CONST Y_=59h
CONST Z_=5Ah
'----------------------- Hardwaredeklarationen ---------------------
DEFINE TxD      PORT[1]
DEFINE RXD      PORT[2]
DEFINE SCL      PORT[5]
DEFINE SDA      PORT[6]
DEFINE freqport PORT[4]
'----------------------- Funktionsdeklarationen --------------------
DECLARE FUNCTION IICSEND(data REF DATA)
DECLARE FUNCTION IICREAD()
DECLARE FUNCTION ACKN()
DECLARE FUNCTION NACKN()
DECLARE FUNCTION IICSTART()
DECLARE FUNCTION IICSTOP()

DECLARE FUNCTION WRITEBYTE(dev REF dev,DATA AS BYTE)
DECLARE FUNCTION READBYTE(dev REF dev)

DECLARE FUNCTION LCD_INIT()
DECLARE FUNCTION LINE1(POS REF POS)
DECLARE FUNCTION LINE2(POS REF POS)
DECLARE FUNCTION LINE3(POS REF POS)
DECLARE FUNCTION LINE4(POS REF POS)
DECLARE FUNCTION LCD_CLR()
DECLARE FUNCTION LCD_WRITE(dev REF dev,BUF REF buf,LCDDATA REF lcddata)
DECLARE FUNCTION lcd_write_chr(lcddata REF lcddata)
DECLARE FUNCTION lcd_write_cmd(lcddata REF lcddata)

DECLARE FUNCTION READTEMP()
DECLARE FUNCTION lcd_write_temp()
DECLARE FUNCTION lcd_write_number(POS REF POS)

'--------- Initialisierungen -------------------------------------
#INIT
BAUD r9600
FREQ = 250                         'Torzeit = 5 sek
SDA = OFF
SCL = OFF
IICSTOP()                          'sicherheitshalber :-)

'--------- Hauptprogramm -----------------------------------------

lcd_init()
lcd_clr()
RXD = OFF


FOR i = 0 TO 6
temp = LOOKTAB(lcd1, i)
LCD_WRITE_chr(temp)
NEXT i

line2(1)
FOR i = 7 TO 13
temp = LOOKTAB(lcd1, i)
LCD_WRITE_chr(temp)
NEXT i

line3(1)
FOR i = 14 TO UBOUND(lcd1)
temp = LOOKTAB(lcd1, i)
LCD_WRITE_chr(temp)
NEXT i

#loop

'read1621_1
DEV=ds1

READTEMP()
line1(10)
lcd_write_temp()

PRINT value;
PRINT ",";
IF nullkomma THEN PRINT "5" else print "0"

'read1621_2
DEV=ds2

READTEMP()
line2(10)

lcd_write_temp()
PRINT value;
PRINT ",";
IF nullkomma THEN PRINT "5" else print "0"

value = FREQ
line1(27)
lcd_write_number(0)         '2 Nachkommastellen

GOTO LOOP

'------------------------------------------------------------------
'-----   Dallas 1621/1631 (und kompatible) Ausleseroutine  --------
'-----   Die Routine beschränkt sich auf 0,5°C Auflösung.  --------
'-- Ganze Grad in value, 0,5 Grad Indikatorbit in nullkomma -------
'------------------------------------------------------------------

FUNCTION READTEMP()

IICSTART()
IICSEND(dev)
IICSEND(EEh)                'Temperaturmessung anstoßen
IICSTOP

IICSTART()
IICSEND(dev)
IICSEND(AAh)                'Temperaturmessung Lesekommando
IICSTOP()

IICSTART()
IICSEND(dev+1)
IICREAD()                   'LSB holen (ganze Gradzahl)
ACKN()

minusflag = OFF
 IF data > 128 THEN
 minusflag = ON
 data = (255-data)+1
 value = data
 ELSE
 value = data
END IF

IICREAD()                   'MSB holen (0,5 Indikator)
NACKN()
IF data = 128 THEN
 nullkomma = ON
 IF minusflag THEN value = value -1
 ELSE
 nullkomma = OFF
END IF

IICSTOP()

END FUNCTION

'-------------------------------------------------------------------
'-------------- Rudimentäre I2C Funktionen -------------------------
'-------------------------------------------------------------------
FUNCTION IICSTART()
SDA=OFF
SCL=OFF
END FUNCTION
'-------------------------------------------------------------------
FUNCTION IICSTOP()
SDA=OFF
SCL=ON
SDA=ON
END FUNCTION
'-------------------------------------------------------------------
FUNCTION IICREAD()
DEACT SDA
DATA=0
MASK=80h
#INSHIFT
SCL=ON
IF SDA=ON THEN DATA=(Data OR MASK)
SCL=OFF
MASK=MASK SHR 1
IF MASK <>0 THEN GOTO INSHIFT
'---- 9. Takt für ACKN bzw. NACKN ----------------------------------

'ACHTUNG! Je nach Erfordernis (letzte Leseoperation
'bei sequenziellem lesen?) muss danach ACKN oder NACKN
'aufgerufen werden! Daher ist (N)ACKN hier NICHT
'Bestandteil der Funktion!

END FUNCTION

'------------------------------------------------------------------

FUNCTION IICSEND(data REF DATA)
 MASK=80h
 #OUTSHIFT
 SDA=(DATA AND MASK)
 SCL=ON
 SCL=OFF
 MASK=MASK SHR 1
 IF MASK<>0 THEN GOTO OUTSHIFT
'------------------------------- 9. Takt für ACKN -----------------
DEACT SDA
 SCL = ON
 SCL = OFF
 ackflag = NOT sda               'Ackn von Slave gesendet?
 SDA= OFF
END FUNCTION

'------------------------------------------------------------------
FUNCTION ACKN()
 SDA = OFF
 TOG SCL
 TOG SCL
END FUNCTION
'------------------------------------------------------------------
FUNCTION NACKN()
 SDA = ON
 TOG SCL
 TOG SCL
END FUNCTION

'-------------------------------------------------------------------
'------- PCF8574 Funktionen ----------------------------------------
'-------------------------------------------------------------------
'Datenübergabe findet in Data statt. Als Parameter wird die Port-
'addresse (beim Schreiben auch der Wert) übergeben.

'In Port schreiben
FUNCTION WRITEBYTE(dev REF dev,DATA AS BYTE)
 IICSTART()
 IICSEND(dev)
 IICSEND(DATA)
 IICSTOP
END FUNCTION
'-------------------------------------------------------------------
'Von Port lesen
FUNCTION READBYTE(dev REF dev)
 IICSTART()
 IICSEND(dev+1)
 IICREAD()
 IICSTOP()
END FUNCTION
'-------------------------------------------------------------------
'-------------- LCD Funktionen für die Micro -----------------------
'-------------------------------------------------------------------
FUNCTION lcd_write_chr(lcddata REF lcddata)
 lcd_write(pcf1, 20h, lcddata)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION lcd_write_cmd(lcddata REF lcddata)
 lcd_write(pcf1, 0, lcddata)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LCD_WRITE(dev REF dev, BUF REF buf, LCDDATA REF lcddata)
DEFINE OUTBYTE AS BYTE
'--------- ------WRITE HI NIBBLE -----------
OUTBYTE=BUF OR (LCDDATA SHR 4)
OUTBYTE=OUTBYTE OR 01000000b
WRITEBYTE (dev,OUTBYTE)
OUTBYTE=OUTBYTE AND 10111111b
WRITEBYTE (dev,OUTBYTE)
'--------------- WRITE LO NIBBLE -----------
OUTBYTE=BUF OR (LCDDATA AND 0Fh)
OUTBYTE=OUTBYTE OR 01000000b
WRITEBYTE (dev,OUTBYTE)
OUTBYTE=OUTBYTE AND 10111111b
WRITEBYTE (dev,OUTBYTE)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LCD_CLR()
 LCD_WRITE(pcf1,0,02h)
 LCD_WRITE(pcf1,0,01h)
 PAUSE 1
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LCD_INIT()
 WRITEBYTE(pcf1,0)
 LCD_WRITE(pcf1,0,38h)
 WRITEBYTE(pcf1,00000010b)
 WRITEBYTE(pcf1,01000010b)
 WRITEBYTE(pcf1,00000010b)
 LCD_WRITE(pcf1,0,28h)
 LCD_WRITE(pcf1,0,0Ch)
 LCD_CLR()
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LINE1(POS REF POS)
 LCD_WRITE(pcf1,0,7Fh+POS)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LINE2(POS REF POS)
 LCD_WRITE(pcf1,0,BFh+POS)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LINE3(POS REF POS)
 LCD_WRITE(pcf1,0,8Fh+POS)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION LINE4(POS REF POS)
 LCD_WRITE(pcf1,0,CFh+POS)
END FUNCTION
'-------------------------------------------------------------------
FUNCTION lcd_write_temp()
 IF minusflag THEN lcddata = minus ELSE lcddata = blank
 lcd_write_chr(lcddata)

 lcddata = value/10
 lcddata = lcddata + 30h
 lcd_write_chr(lcddata)
 lcddata = value MOD 10
 lcddata = lcddata + 30h
 lcd_write_chr(lcddata)
 lcd_write_chr(2Ch)
 IF nullkomma THEN lcd_write_chr(35h) ELSE lcd_write_chr(30h)

END FUNCTION
'-------------------------------------------------------------------
FUNCTION lcd_write_number(POS REF POS)

 IF value > 99 THEN lcddata=((value/100) MOD 100)+30h ELSE lcddata=30h
 lcd_write_chr(lcddata)
 IF POS = 2 THEN lcd_write_chr(2Ch)  'Komma ausgeben?
 IF value > 9 THEN LCDData=((value/10) MOD 10)+30h ELSE LCDData=30h
 lcd_write_chr(lcddata)
 IF POS = 1 THEN lcd_write_chr(2Ch)  'Komma ausgeben?
 LCDData=(value MOD 10)+30h
 lcd_write_chr(lcddata)

END FUNCTION
'-------------------------------------------------------------------
TABLE lcd1
S_ E_ N_ S_ blank Z1 3Ah
S_ E_ N_ S_ blank Z2 3Ah
F_ L_ O_ W_ blank P_ 3Ah
END TABLE
'-------------------------------------------------------------------
END


Meine Homepage: http://www.henrik-reimers.de/control/

 Antwort schreiben

Bisherige Antworten: