- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: M-Unit und DS1631-Aufloesung

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.02.2007
    Ort
    31028 Gronau
    Alter
    64
    Beiträge
    5

    M-Unit und DS1631-Aufloesung

    Hallo miteinander...

    Ich brauch ein bisschen Nachhilfe in Sachen CCBasic und Tempsensor DS1631:

    Voraussetzungen Hard und Software:
    Applikationsboard mit der Unit-M 2.0 (V2.05)
    Vorerst nur einen IIC-Bus Temp-Sensor DS1631 (sollen mal 5-6 werden)
    CCBasic von der beiliegenden CD

    Voraussetzungen >Kauz< (Andreas):
    Vor ca. 3 Jahren habe ich mit der alten M-Unit eine funktionierende Heizungssteuerung gebaut.....
    einschliesslich eines Terminalprogramms in VB5 zum Datentransfer..... leider nicht lange.
    Weil mir durch aeussere Einfluesse die Unit hops gegangen ist.
    Die erweiterten Funktionen (IIC-Bus / LCD-Display) der neuen Unit haben mich zu einem Neustart bewogen.

    Nun zu meinem Problem:
    Habe den Beispielcode fuer den IIC-Bus Temp-Sensor erfolgreich ausprobiert.

    Ich moechte die Auflösung von 0,5C auf 0,25C oder noch kleiner setzen.
    Das war dann aber nicht so erfolgreich.

    Mein Gedanke war:
    Ich schreibe mit DATA nicht den Wert 1 (1Shot) ins Configregister, sondern z.B. den Wert 13 fuer die 12-Bit Aufl”sung.(0-0-0-0-1-1-0-1)

    Die Zeile TEMP=TEMP SHR 7 ändere ich auf TEMP=TEMP SHR 4
    Bei der Ausgabe auf das LCD teile ich TEMP nicht durch 2 sondern durch 16.....
    Mit der anschliessenden Ausgabe von TEMPLO habe ich mich noch nicht befasst,
    weil die vorher genannten Aenderungen keine schluessigen Ergebnisse lieferten.

    Bei den vielen Versuchen bin ich ber die Frage > wo bekommt die Variable TEMP eigentlich den gemessenen Wert vom Sensor zugewiesen? < gestolpert.
    und warum bleiben die Bits mit der Wertigkeit 4 und 8 nicht gesetzt, wo doch Write_Status nur einmal beim Programmstart durchlaufen wird?

    Ich nehme jegliche Hilfe an, soll heissen:
    Ein geaendertes Beispielprogramm mit einer hoeheren Aufloesung zum weiteren Selbststudium,
    oder auch Erklaerungen zu den beiden Fragen.... nachlegen kann ich ja immer noch.

    (das Datenblatt zum DS1631 hat mir auch nicht weitergeholfen....
    scheinbar verstehe ich entscheidene Stellen nicht)

    Besten Dank im Voraus an alle

    Gruss Andreas

    PS: Dies ist mein erstes Posting... hab ich was falsch gemacht?.... dann ruhig meckern.


    Falls der Demo-Code nicht parat ist:
    '--------------------------
    '------ I/O PORTS ---------
    '--------------------------
    define LIGHT port[16]
    '--------------------------
    '---- SYSTEM MEMORY -------
    '--------------------------
    define TEMP word[1]
    define TEMPHI byte[1]
    define TEMPLO byte[2]
    define SCONFIG byte[3]
    define DATA byte[4]


    '--------------------------
    define DS1631 158 'IIC ADDRESS $9E
    '--------------------------
    '--- DS1631 COMMANDS ------
    '--------------------------
    define CONVERT &H51
    define STOP_CONVERT &H22
    define READ_TEMP &HAA
    define CONFIG &HAC
    define RESET &H54
    '---------------------------



    #INIT
    LIGHT=off
    '----------- EINSCHALT MELDUNG ------------------------
    print"#ON_LCD#";
    print"#INIT#";
    print"READ DS1631 TEMP";
    print"#OFF#";
    '-----------------------------------------------------
    'gosub DS1631RESET
    DATA=1:gosub DS1631WRITE_STATUS ' ONE SHOT MODE #### DATA=13 ####
    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 ### TEMP=TEMP SHR4 ###
    if (TEMP and &H0100) = &H0100 then TEMP=(TEMP or &HFE00)
    print"#ON_LCD#";"#L201#";"TEMP: ";TEMP/2;".";(TEMPLO and 1)*5;" C ";"#OFF#";
    goto LOOP
    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII IIIIIIIIIIIIIII

    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III
    'IIIII DS1631 DRIVER III
    'IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII III

    '------------------ DS1631 RESET ------------------
    #DS1631RESET
    print"#ON_IIC#";"#START#";ut DS1631ut RESETrint"#STOP#";"#OFF#";
    goto IIC_STATUS
    '------------------ DS1631 CONVERT ------------------
    #DS1631CONVERT
    print"#ON_IIC#";"#START#";ut DS1631ut CONVERTrint"#STOP#";"#OFF#";
    goto IIC_STATUS
    '----------------- GET DS1631 STATUS -----------------
    #DS1631GET_STATUS
    print"#ON_IIC#";"#START#";ut DS1631ut CONFIGrint"#STOP#";"#OFF#";
    print"#ON_IIC#";"#START#";ut DS1631+1:get DATArint"#STOP#";"#OFF#";
    goto IIC_STATUS
    '----------------- WRITE DS1631 STATUS -----------------
    #DS1631WRITE_STATUS
    print"#ON_IIC#";"#START#";ut DS1631ut CONFIGut DATArint"#STOP#";"#OFF#";
    goto IIC_STATUS
    '----------------- GET DS1631 TEMPERATURE -----------------
    #DS1631GET_TEMP
    print"#ON_IIC#";"#START#";ut DS1631ut READ_TEMPrint"#STOP#";"#OFF#";
    print"#ON_IIC#";"#START#";ut DS1631+1:get TEMPHI:get TEMPLOrint"#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 LIGHT=on else LIGHT=off
    return

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    28.02.2007
    Ort
    31028 Gronau
    Alter
    64
    Beiträge
    5

    Lösung gefunden

    Hallo in die Runde...

    da sich keiner meinem Problem annehmen wollte,
    habe ich selbst weiter gesucht und versucht:

    Herausgekommen ist eine etwas andere Vorgehensweise:
    Ich benutze nur die beiden Byte-Variablen TEMPHI und TEMPLO.

    Für den Positiven Bereich steht in TEMPHI immer die Gradzahl vor dem Komma...
    sie wird gleich so uebernommen.
    TEMPLO wird um 4Stellen nach rechts verschoben, mit 100 mal genommen
    und dann durch 16 geteilt.
    Das ergibt eine zweistellige ganze Zahl für die Nachkommastellen.
    Diese Variante funktioniert in der 9-Bit, 10-Bit, 11-Bit und 12-Bit Auflösung.

    Für die Minustemperaturen ist eine Anpassung, Umrechnung,
    oder wie man es auch nennen will nötig.

    Diese ist mit einem Gelkissen aus dem Gefrierfach bis -4,5 Grad getestet.


    Vielleicht gibt es ja doch den ein oder anderen Neuling, der auch dieses
    Problem hat.

    Wenn jemand interessiert ist, hier posten oder E-Mail an mich.

    Gruss Andreas

  3. #3
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    71
    Beiträge
    13.051
    Irgendwie war die Beteiligung an dem Thema etwas gering, man kann es hier nachsehen:
    https://www.roboternetz.de/phpBB2/to...rs.php?t=28296
    Ich finde es grundsätzlich interessant, setze allerdings den Sensor zur Zeit auch nicht ein.
    Schön dass die Lösung gefunden wurde und es ist in jedem Fall gut, sie so für weitere Anwender aufzuheben.
    Manfred

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen