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: am einfachsten iic_fühler programmieren Kategorie: Programmierung Basic (von Lorenz - 26.08.2005 19:51)
 Als Antwort auf Re: am einfachsten iic_fühler programmieren von Henrik - 26.08.2005 12:14

>
> > ich hab mir das Beispiel von der CD mal angesehen so funktioniert es tadellos nur bei minus Graden hängt es sich auf warum?
>
> Diese Demo berücksichtigt Minusgrade einfach nicht.
>
> Du könntest mal mein Beispiel ausprobieren:
>
>
> '----------- Beispiel für C-Control1 Version 2x -------------------
> '
> '--- Nützliche Funktionen für die Auswertung des Temperatursensors-
> '-------------------------- DS1621 --------------------------------
> '
> 'Dieses Demoprogramm unterstützt die erweiterte Genauigkeit des
> 'IC. Gerundet wird auf 10tel Grad Celsius. Theoretisch kann
> 'eine Auflösung von 0,07 Grad Celsius erreicht werden, in der
> 'Praxis ist das aber unsinnig.
> 'Es wird nun auch der negative Temperaturbereich ausgewertet.
> 'Dies frisst ein paar Byte Programmspeicher und ein Variablenbit,
> 'daher sollte man, wenn keine Minusgrade zu erwarten sind, die
> 'vereinfachte Lösung wählen.
>
> 'Henrik Reimers Jan. 2005              http://www.henrik-reimers.de
> '-------------------------------------------------------------------
>
>
> '---- Variablen definieren-----------------------------------------
>
> DEFINE value          AS    WORD
> DEFINE temperatur     AS    WORD
> DEFINE temp           AS    BYTE
> DEFINE data           AS    BYTE
> DEFINE counter        AS    BYTE
> DEFINE slope          AS    BYTE
> DEFINE dev            AS    BYTE
> DEFINE minusflag      AS    BIT
> '---- Funktionsdeklarationen --------------------------------------
>
> DECLARE FUNCTION readtemp()
>
> '------------------------------------------------------------------
>
> #INIT
> '*** entbehrlich wenn die Pullups nicht eingeschaltet werden müssen
>
> CONFIG.INIT                            'auf Config Register umleiten
> CONFIG.GET TEMP                        'den aktuellen Wert lesen
> temp = temp OR 30h
> CONFIG.PUT TEMP                        'Bits setzten und zurück schreiben
> CONFIG.OFF                             'Umleitung abschalten
>
> 'sollte immer sofort erfolgen, bevor I2C benutzt wird
>
> LCD.INIT
> LCD.PRINT "1621 TEST"
> PAUSE 100
> LCD.OFF
>
> '--------- HAUPTPROGRAMM -----------------------------------------
>
> #main
>
> #main1
> dev = 144            'Alle Useraddresseingänge auf 0 - ggf.
>                      'anpassen.
> readtemp()           'ruft die readroutine für ds1621 auf
>
> LCD.INIT SWITCHONLY
> LCD.clr
> LCD.POS 1,4
> IF minusflag THEN LCD.PRINT "-"
> LCD.POS 1, 5
> LCD.PRINT value/10 & "," & value mod 10 & " ßC "
> LCD.OFF
>
> GOTO main1
>
> '---- Funktionen -------------------------------------------------
>
> FUNCTION readtemp()
>
> IIC.INIT
>
> IIC.start
> IIC.SEND DEV
> IIC.SEND EEh           'temperaturmessung anstoßen
> IIC.STOP
>
> PAUSE 10
>
> IIC.start
> IIC.SEND dev
> IIC.SEND 22h            'temperaturmessung stoppen
> IIC.stop
>
> '---------------------------
>
> IIC.start
> IIC.SEND DEV
> IIC.SEND AAh            'temperaturmessung Lesekommando
> IIC.stop
>
> IIC.start
> IIC.SEND (DEV+1)        'lowtemperaturbyte auslesen
> IIC.GET value
>
> minusflag = OFF
> IF value > 128 THEN
>  minusflag = ON
>  value = (255-value)+1
> END IF
> temperatur = value
>
> IIC.stop
> '------------------------------
> IIC.start
> IIC.SEND DEV
> IIC.SEND A8h           'Counter Lesekommando
> IIC.stop
>
> IIC.start
> IIC.SEND (dev+1)       'Counter auslesen
> IIC.GET value
> counter = value
> IIC.stop
> '-----------------------------
>
> IIC.start
> IIC.SEND DEV
> IIC.SEND A9h           'Slope Lesekommando
> IIC.stop
>
> IIC.start
> IIC.SEND (DEV+1)       'Slope auslesen
> IIC.GET value
> slope = value
> IIC.stop
>
> IIC.OFF
> IF minusflag THEN
> value=((temperatur * 100 - 25)-((slope-counter)*100/slope*100)/100)/10
> ELSE
> value=((temperatur * 100 - 25)+((slope-counter)*100/slope*100)/100)/10
> END IF
>
> END FUNCTION
>
>
> Grüße
> Henrik

Ich haben das Programm von Henrik im Winter bei minusgrade getestet.Und siehe da  die anzeige waren auch bei null und minus Grade richtig.
Als es Funkt.

Gruß Lorenz

 Antwort schreiben

Bisherige Antworten: