
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
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 |