1Wire Temperaturmessung für PI-Regelung

Bonze

Neues Mitglied
16. Jan. 2010
516
0
0
Altenkirchen (Pfalz)
Sprachen
  1. BascomAVR
da die teile auf sich warten lassen hab ich mal nefangen den code zusammenzubauen für die temp messung,. allerdings bin ich mir da noch nicht so sicher bzw hab die einzelnen anweisungen noch nichtverstanden , warum ich zum beispiel 1wwrite &H44 machen muss z.b.

Code:
    '1-wire Geräte auslesen
    Wait 1
     If Err = 0 Then Idsensor1(8) = 1wsearchfirst()
     Else Print Err                                         'bei fehler fehler ausgeben
     End If
    Next
    Wait 1
     If Err = 0 Then Idsensor2(8) = 1wsearchnext()          'Sensorabfrage
     Else Print Err                                         'bei fehler fehler ausgeben
     End If
    Next
    'Temperatur auslesen
    1wreset
    If Err = 1 Then Print Err                               'bei fehler Fehler ausgaben
    Else

       1wwrite &H44                                         'read rom command
       Waitus 200
       1wverify Idsensor1(1)                                ' Gerät mit der SerienNr. aus Ar() auswählen
       Idsensor1(8) = 1wread(8)                             'lese gerät aus und schreibes in array idsensor1
       1wwrite &HBE                                         ' Temperatur auslesen
       Temp1(1) = 1wread(9)                                 ' Daten in ein Array lesen

        For I = 1 To 9
            Print Hex(temp1(i));
        Next
       Waitus 200
       1wverify Idsensor2(1)                                ' Gerät mit der SerienNr. aus Ar() auswählen
       Idsensor2(8) = 1wread(8)                             'lese gerät aus und schreibes in array idsensor1
       1wwrite &HBE                                         ' Temperatur auslesen
       Temp2(1) = 1wread(9)                                 ' Daten in ein Array lesen

        For I = 1 To 9
            Print Hex(temp1(i));
        Next

    End If
 
Hallo,

bzw hab die einzelnen anweisungen noch nichtverstanden , warum ich zum beispiel 1wwrite &H44 machen muss z.b.
Gaaaannnnnnz einfach :D
Da man mehrere von den DS18S20 an einem 1Wire-Bus betreiben kann muß
man sie ja irgendwie adressieren können. Das macht man normalerweise
über die 64Bit-Seriennummer. Wenn man aber nur einen am Bus hängen hat
dann kann man sich die Adressierung sparen und schickt statt dessen den
Befehl &h44 (SKIP ROM). Es wird also die Adressierung über die 64Bit-ROM-ID
übersprungen. Wenn man aber doch mehrere an den Bus hat dann melden sich
alle angeschlossenen. Das gibt dann Datensalat :D

Gruß
Dino
 
hab die einzelnen anweisungen noch nichtverstanden , warum ich zum beispiel 1wwrite &H44 machen muss z.b.

Hallo Bonze!

Du solltest dir einfach ein paar Mal das Datenblatt zum Sensor ansehen.
Allerdings wirkt es auf den ersten Blick etwas "unverständlich". ;)

Wenn du dir aber deinen Programmcode ansiehst und dann das Datenblatt daneben legst, dann wird relativ schnell ein Schuh draus. :)

So wirst du auch verstehen, warum du z.B. ein &H44 (44h) senden musst.
Dies leitet z.B. die "Temperaturmesung" ein.
Es wird also über den Bus das Kommando 44 Hex gesendet....
Dies empfängt der Sensor und leitet daraufhin die Messung ein.

Schau dir mal die folgenden zwei Bespiele an (aus dem Datenblatt des DS18S20):
1wre_3.gif

und

1wre_2.gif

Hier kannst du den Ablauf in zwei verschiedenen Varianten sehen.

In beiden Beispielen wird kein spezieller Sensor angesprochen....
Darum wird auch das &HCC (CCh) über den Bus gesendet.
Solltest du allerdings mehr als einen Sensor am Bus betreiben kannst du zwar erst mit dem &HCC die Rom-Daten überspringen und dann ein &H44 senden (Temp.-Messung).... so würden alle Sensoren den Befehl erhalten die Tempraturmessung durchzuführen.....
Abfragen musst du sie dann aber einzeln! Dann kannst du z.B. kein &HCC verwenden!
Dafür gibt es den Befehl &H55, der die anschließende Seriennummer des Sensors zur Folge hat.
Danach weiß auch der eine bestimmte Sensor, dass nur er gemeint ist!


Wie du danach die Temperatur (auf 0,1°C) berechnen kannst, zeigt dir dieser Ausschnitt aus dem Datenblatt:
1wre_Berechnung_18S20.gif

Nun weißt du auch, warum im Beispiel 2 die Werte T-h und T-L benöigt werden. ;)
Ohne "Count Remain" und "Count per °C" wäre das nicht möglich. ;)
Es gibt daher in den unendlichen Weiten des Internets auch eine Menge Beispiele, die nur eine Temperaturberechnung auf 0,5°C zulassen.... weil sie diese beiden Werte nicht berücksichtigen.

Eine Bitte habe ich aber noch....
Schau unbedingt ganz genau auf den Typ seines DS1820 !!!
Es gibt in der Temperaturberechnung einige Unterschiede zwischen dem DS18S20 und dem DS18B20 !

Ich hoffe, du hast erst einmal einen Einblick in die Technik bekommen.
Sollten dir nun noch einige Fragezeichen über dem Kopf schweben dann kann ich nur sagen: Das Meiste klärt sich bei den ersten praktischen Versuchen von selbst! ;)

Viel Erfolg und Spaß dabei,
Cassio


PS: Zum Schluss, nun noch ein Beispiel für einen DS18S20 in BASCOM:

Code:
1wreset
1wwrite &HCC
1wwrite &H44

Do
   Temp = 1wread()                ' Ende der Temperaturmessung abwarten
Loop Until Temp = &HFF

1wreset
1wwrite &HCC
1wwrite &HBE

For I1w = 1 To 9
Scratch(i1w) = 1wread()
Next

Temp = Scratch(2)
Shift Temp , Left , 8

Temp = Temp + Scratch(1)
Temp1 = Temp
Temp1 = Temp1 / 2
Ist_temp = Scratch(8) - Scratch(7)
Ist_temp = Ist_temp / Scratch(8)
Ist_temp = Ist_temp + Temp1
Ist_temp = Ist_temp - 0.25
 
Hi Bonze,

Du solltest dir einfach ein paar Mal das Datenblatt zum Sensor ansehen.
Allerdings wirkt es auf den ersten Blick etwas "unverständlich". ;)

Wenn du dir aber deinen Programmcode ansiehst und dann das Datenblatt daneben legst, dann wird relativ schnell ein Schuh draus. :)
hoppla, das hätte ich bei meiner Antwort wohl auch machen sollen ;)
Hab ich doch zuviel aus der Erinnerung gemacht und &h44 mit &hCC
verwechselt :rolleyes:

schickt statt dessen den
Befehl &h44 (SKIP ROM). Es wird also die Adressierung über die 64Bit-ROM-ID
übersprungen. Wenn man aber doch mehrere an den Bus hat dann melden sich
alle angeschlossenen. Das gibt dann Datensalat :D
tja ... den Datensalat gabs da wohl bei mir :eek:

So wirst du auch verstehen, warum du z.B. ein &H44 (44h) senden musst.
Dies leitet z.B. die "Temperaturmesung" ein.
Es wird also über den Bus das Kommando 44 Hex gesendet....
Dies empfängt der Sensor und leitet daraufhin die Messung ein.
oder so ... Also am besten mal ins Datenblatt schauen ;)

Gruß
Dino
 
also wäre der ablauf zur messung folgende

Code:
suche erstes gerät
speichere rom in in 8bytes
suche zweites gerät
speichere rom in in 8bytes

'Temp. Messung anstoßen
1wreset     '1wirebus resetten
1write &H44 'temp convertieren

wait 400ms

1wverify seriennnummer'bestimmtes gerät mit der seriennummer ansprechen
1wwrite &HE4 'daten ins scratchopad schreiben 4Eh
1write &HEB  'Scratchpad auslesen

Temperatur verarbeiten
 
Hallo !

Ja, so in der Art würde das dann ablaufen. ;)

Schau in der BASCOM-Hilfe einfach mal den Befehlen:

1wirecount()

1wsearchfirst()

1wsearchnext()

Diese Befehle benötigste du aber nur, wenn du später mehrere Sensoren auf einem Bus betreiben möchtest.


Deine Wartepause von "Waitms 400" würde ich nicht unbedingt verwenden!
Die Kovertierung der Temperatur kann unterschiedlich lang sein.
Das ist auch der Grund, warum ich immer die kleine DO-LOOP Schleife verwende:
Code:
Do 
Temp = 1wread() ' Ende der Temperaturmessung abwarten 
Loop Until Temp = &HFF

So kannst du sicher sein, dass die "Temparaturmessung" auch wirklich beendet war.

Ich denke, es lernt sich sich einfacher, wenn deine Artikel zum Testen eingetroffen sind.
Wenn du dann noch mehr fragen zu dem Thema hast, solltest du aber einen neuen Thread aufmachen.... sonst findet man die Erlärungen später so schlecht wieder. ;)

Gruß,
Cassio
 
ich betreibe dann 2 sensoren auf dem bus, werd mich dann mal an den code versuchen, sollt ich ne funktion schreiben ? welche mir die temp auslesen , die ich dann halt pro sensor 1 mal aufrufe?
 
Hi,

sollt ich ne funktion schreiben ? welche mir die temp auslesen , die ich dann halt pro sensor 1 mal aufrufe?
würde ich vorschlagen.
Versuch dein Programm modular aufzubauen. Also Programmbausteine
machen die bestimmte Aufgaben erfüllen und so aufgebaut sind das man
sie ohne große Arbeiten in anderen Programmen wiederverwenden kann.
Das spart zukünftig Arbeit und hilft dir dabei den Überblick zu behalten.
Außerdem kann man dadurch bei Problemen sehr schnell Teile des Programms
abschalten in dem man einfach die Sprungbefehle in diese Subroutinen
ausmarkert (mit Bemerkungszeichen davor).

Also zB eine Funktion/Subroutine für die Abfrage der Temperatursensoren,
eine für die Ausgabe auf dem LCD, eine für die Initialisierung der Ports, ...
Dann steht im Hauptprogramm nur noch ganz vorne deine Einstellungen für
Prozessortyp, Takt, ... und dahinter zB
GOSUB port_init
GOSUB lcd_init
GOSUB 1wire_init
GOSUB timer_init
DO ' Hauptschleife
... irgendwas was er hier noch machen soll
LOOP ' Ende der Hauptschleife

hinter der Hauptschleife mach man dann (optisch getrennt über einen
größeren Zwischenraum oder mehrere Zeilen mit ##### oder **** oder so)
die Subroutinen für port_init , ... deine Interrupt-Serviceroutinen, ...

Also im Großen und Ganzen ... versuch deinem Programm Struktur und eine
gewisse Modularität zu geben. Das erhöht die Lesbarkeit und das Tempo
eventuelle Fehler zu finden.

Gruß
Dino
 
noch ne kleine frage,
die temperatursensoren haben doch ne 64Bit Rom Adresse oder? das sind doch 8Byte
oder nicht? 1 Byte = 8Bit ? d.h. 32 zahlenwerte?
also mit
2^0
2^1
2^2
2^3

d.h. heisst doch das ich ein array bräuchte um die 64bit zu speichern bzw mehrere rom adressen
array (adresse1, adresse 2) as word?
array(1) = adresse 1
array(2) = adresse 2

oder bin ich total daneben? (mit den zhalen das verwirrt mich, ich kenne die darstellung nur ohne diese zahl, wie es bei php, also bei c ist.
EDIT:
ah ok hab mich eben selbst verwirrt
8-BIT FAMILY CODE (22h)
steht da ja, aber , falls ich die adressen der beiden 1wire sensoren in ein array schreiben wollte, wie geh ich da vor?
 
Hallo,

noch ne kleine frage,
die temperatursensoren haben doch ne 64Bit Rom Adresse oder? das sind doch 8Byte oder nicht?
Aus dem Datenblatt ...
Each Device has a Unique 64-Bit Serial Code
Stored in an On-Board ROM
64Bit = 8Bit+8Bit+8Bit+8Bit+8Bit+8Bit+8Bit+8Bit = 8Byte

1 Byte = 8Bit ? d.h. 32 zahlenwerte?
also mit
2^0
2^1
2^2
2^3
2^0 = 1
2^1 = 2
2^2 = 4
2^3 = 8
2^4 = 16
2^BitNr = Wertigkeit
2^BitAnzahl = Anzahl der möglichen Werte
Also sind 2^7 = 128 Also ist bei einem Byte (Bit0, Bit1, ...) Bit7 die
Wertigkeit 128
Bei 8 Bit (2^8) gibt es maximal 256 mögliche Werte (0,1,2,...,254,255)

d.h. heisst doch das ich ein array bräuchte um die 64bit zu speichern bzw mehrere rom adressen
array (adresse1, adresse 2) as word?
array(1) = adresse 1
array(2) = adresse 2

oder bin ich total daneben? (mit den zhalen das verwirrt mich, ich kenne die darstellung nur ohne diese zahl, wie es bei php, also bei c ist.
Also da die 64Bit-Seriennummer/ID des Chips ein wenig aufgeteilt ist ...

8-Bit (1Byte) CRC / 48-Bit (6Byte) Seriennummer / 8-Bit (1Byte) FamilyCode

würde ich das in einem 2-Dimensionalen Array speichern. Ich weiß nicht so
recht wie das in Bascom gemacht wird ... Ich nehme mal so an ...

DIM OneWireSN (5, 8) as Byte
OneWireSN (1,1) = CRC Device1
OneWireSN (1,2) = AddrByte1 Device1
...
OneWireSN (1,7) = AddrByte6 Device1
OneWireSN (1,8) = FamilyCode Device1
OneWireSN (2,1) = CRC Device2

So könnte es gehen ... sieh dir das aber sicherheitshalber nochmal an.

EDIT:
ah ok hab mich eben selbst verwirrt
8-BIT FAMILY CODE (22h)
steht da ja, aber , falls ich die adressen der beiden 1wire sensoren in ein array schreiben wollte, wie geh ich da vor?
Also wie gesagt 2dimesionales Array. Oder sowas. Ist wohl das einfachste.

EDIT: Also ich hab mal ein wenig gespielt und anscheinend kann Bascom nur
1-dimensionale Arrays. Also anders bezeichnet nur Listen. So ein Mist. Da muß
ich mir mal was überlegen ...
P1030752.JPG
mein 1Wire-Bus mit nem DS18S20 ;) Also mit Phantomspeisung und einem
Device am Bus läuft es schon. Aber ich wollte eigentlich ein Array mit den
gesamten SN der Devices anlegen. Geht aber nicht. Also werde ich wohl
ein Array mit 8 Zeichen langen Strings anlegen und in den Strings die
Seriennummern auf binärer Art ablegen. Wenn es nicht will dann biegt man
so lange bis es geht ;) Von hinten durch die Brust ins Auge :D :eek:

Gruß
Dino
 
ich bin darauf gekommen weil meistens bei beispielen immer ar(8) genommen wird und dann 1 to 8 ,. der wert gespeichert wird da bin ich nicht so durchgestiegen
 
ich bin darauf gekommen weil meistens bei beispielen immer ar(8) genommen wird und dann 1 to 8 ,. der wert gespeichert wird da bin ich nicht so durchgestiegen
Die speichern in den Beispielen die 8 einzelnen Bytes der Seriennummer in einem
Array. Das ist aber für spätere Verarbeitung von mehreren Devices an einem
Bus ziemlicher Murx.

Als ich werde ein Array anlegen in dem jede Seriennummer durch einen
8 Zeichen langen String repräsentiert wird. Ob ich jetzt ein ASCII-Zeichen
oder nen Byte speicher ist eigentlich egal. Damit hab ich dann durch die
Hintertür ein zweidimensionales Array ...
1. Dimension => die Nummer des Strings im Array
2. Dimension => die Nummer des Zeichens im String

Mal sehen ob Bascom auch ASCII-Zeichen mit Wert 0 oder 13 oder sowas
abkann. CHR(0) wäre in C zB das Stringende. CHR(13) repräsentiert den
Steuercode ETX (EndOfText). Mal sehen ob das klappt ... :D

die aktuellen Teile von mir ...


CodeBox BASCOM

' ======================================
' === 1-Wire initialisieren ============
' ======================================
' Array mit Seriennummern der 1Wire-Devices
Dim One_wire_sn(8) As Byte
' BusCount = Anzahl der Devices am Bus
Dim One_wire_bc As Byte

Config 1wire = Portc.6

Gosub 1wire_init

___lcdno = 0
Locate 1 , 1
Lcd "F:" ; Hex(one_wire_sn(1)) ; " S:";
For C = 2 To 7
Lcd Hex(one_wire_sn(c));
Next
Lcd " C:" ; Hex(one_wire_sn(8))

Locate 2 , 1
Lcd "FamilyCode / SN / CRC ";One_wire_bc

' ======================================
' ======================================
' ======================================


' ======================================
' === 1Wire - Initialisierung ==========
' ======================================
' 1Wire-Bus initialisieren und Adresse lesen
1wire_init:
'reset the device
Waitms 200
1wreset
Waitms 200
'print error 1 if error
Print Err

One_wire_bc = 1wirecount()

' For D = 1 To One_wire_bc
1wreset
Waitms 200
'print error 1 if error
Print Err
'read ROM command
1wwrite &H33
For C = 1 To 8
One_wire_sn(c) = 1wread()
Next
' Next
Return
' ======================================
' ======================================
' ======================================

im Moment nur für einen Bus mit einem einzigen Device

Gruß
Dino
 
also kann ich auch ohne probleme meine werte auch woanders speichern in ner ganz normalen variable ?
ich sag jetzt mal z.b.?
Code:
dim adress as double
adress = 64bitrom
 
also kann ich auch ohne probleme meine werte auch woanders speichern in ner ganz normalen variable ?
ich sag jetzt mal z.b.?
Code:
dim adress as double
adress = 64bitrom
Denk dran das du beim lesen der Seriennummer einzelne Bytes geliefert
bekommst. Also pro Seriennummer 8 Bytes. Wenn du also die SN in einer
Double-Variable (ist die 64Bit?) speichern willst, dann mußt du die einzelnen
Bytes erst mal zu der Double zusammensetzen um sie darin zu speichern.
Das geht mit nem String einfacher (nach meiner Meinung).
Sieh dir auch mal den Befehl/Funktion CRC8 an. Die wirst du für die
Erkennung von Lesefehlern brauchen. Die Seriennummer hat ne CRC8 drin.
Wenn ich Zeit hab kann ich dir das ja mal zeigen was ich mit dem String
meine ...

Gruß
Dino
 
Versuch für ein 2dimensionales Array - läuft nicht ...

Mein Versuch, ein 2dimensionales Array über den Umweg eines 1dimensionales
String-Array mit Länge8 zu erzeugen ...


CodeBox BASCOM

' ======================================
' === 1-Wire initialisieren ============
' ======================================
' Array mit Seriennummern der 1Wire-Devices
Dim One_wire_sn(8) As Byte
' Mein 2dimensionales Array ;-)
Dim $one_wire_sn_string(5) As String * 8
' BusCount = Anzahl der Devices am Bus
Dim One_wire_bc As Byte

Config 1wire = Portc.6

Gosub 1wire_init

___lcdno = 0
Locate 1 , 1
Lcd "F:" ; Hex(one_wire_sn(1)) ; " S:";
For C = 2 To 7
Lcd Hex(one_wire_sn(c));
Next
Lcd " C:" ; Hex(one_wire_sn(8))

Locate 2 , 1
Lcd "FamilyCode / SN / CRC ";One_wire_bc

' ======================================
' ======================================
' ======================================


' ======================================
' === 1Wire - Initialisierung ==========
' ======================================
' 1Wire-Bus initialisieren und Adresse lesen
1wire_init:
'reset the device
Waitms 200
1wreset
Waitms 200
'print error 1 if error
Print Err

One_wire_bc = 1wirecount()

' For D = 1 To One_wire_bc
1wreset
Waitms 200
'print error 1 if error
Print Err
'read ROM command
1wwrite &H33
' String vorbelegen um die Länge von 8 Zeichen zu erzeugen
$one_wire_sn_string(1) = " "
For C = 1 To 8
One_wire_sn(c) = 1wread()
Mid($one_wire_sn_string(1) , C , 1) = Chr(one_wire_sn(c))
Next
' Next
Return
' ======================================
' ======================================
' ======================================

und hier die Fehler ...
2D-Array.png
:confused: :confused:
Brauch ich wohl noch ein paar Versuche ... :D
Irgendwie mag er in den Zeilen 290/293 ( die beiden (E) )
meine Zuweisungen nicht ;)

Gruß
Dino
 
Hi, ihr Zwei!

Ich kann mich gern noch einmal wiederholen.....

Ohne Hardware zum ausprobieren denkt man viel zu viel über das Wenn und Aber nach. ;)


Wenn z.B. zwei Sensoren auf einem Bus sind, dann müssen natürlich die Romdaten einzeln in ein Array gespeichert werden..... damit man die Sensoren hinterher auch einzeln ansprechen kann
.
Das Byte-Array dimensoniert ihr so:
Code:
Dim Rom_data1(8) As Byte , Rom_data2(8) As Byte


Wie ich vor einigen Beiträgen auch schon mal geschrieben habe, kann man erst einmal mit dem Befehl "1wirecount()" die Anzahl der Sensoren am Bus feststellen.
Damit lassen sich ggf. auch mal Kontaktfehler feststellen. ;)

Code:
1wc = 1wirecount()


Kommen wir nun zum Abfragen des Buses und das Auslesen der Romdaten:

Code:
Rom_data1(1) = 1wsearchfirst()

Rom_data2(1) = 1wsearchnext()

Danach stehen dann die einzelnen Romdaten zur Verfügung und können zur Abfrage jedes einzelnen Sensors genutzt werden.

Zum Beispiel:
Code:
1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data1(i)
Next

1wwrite &H44
Waitms 100


1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data1(i)
Next

1wwrite &HBE
Waitms 100


Ich hoffe, es bringt etwas Licht ins Dunkel. ;)

Gruß,
Cassio
 
Hi Cassio,

Ohne Hardware zum ausprobieren denkt man viel zu viel über das Wenn und Aber nach. ;)
ich hab ja Hardware :D und mit einem Device am Bus ist das ja auch kein
Problem. Auch mit mehreren ist das kein Problem.

Wenn z.B. zwei Sensoren auf einem Bus sind, dann müssen natürlich die Romdaten einzeln in ein Array gespeichert werden..... damit man die Sensoren hinterher auch einzeln ansprechen kann
.
Das ist schon klar. Da gibts ja diesen Suchalgorithmus den man bei nem
AppNote von Dallas/Maxim nachleesen kann.

Das Byte-Array dimensoniert ihr so:
Code:
Dim Rom_data1(8) As Byte , Rom_data2(8) As Byte
und genau hier scheiden sich unsere Geister ;)
Ich will keine 2...5 einzelnen Arrays haben. Da man dabei nicht mehr
mit einer Schleife für die Devices arbeiten kann.
Also kein ...
For DeviceNr = 1 to 1wirecount()
... um den Code kleiner zu machen. Das finde ich unästhetisch und nicht
professionell :rolleyes: :D
Darum der ganze Firlefanz von mir um ein 2dimensionales Array zu bauen.

Wie ich vor einigen Beiträgen auch schon mal geschrieben habe, kann man erst einmal mit dem Befehl "1wirecount()" die Anzahl der Sensoren am Bus feststellen.
Damit lassen sich ggf. auch mal Kontaktfehler feststellen. ;)

Code:
1wc = 1wirecount()


Kommen wir nun zum Abfragen des Buses und das Auslesen der Romdaten:

Code:
Rom_data[B][COLOR="Red"]1[/COLOR][/B](1) = 1wsearchfirst()

Rom_data[B][COLOR="Red"]2[/COLOR][/B](1) = 1wsearchnext()

Danach stehen dann die einzelnen Romdaten zur Verfügung und können zur Abfrage jedes einzelnen Sensors genutzt werden.

Zum Beispiel:
Code:
1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data[B][COLOR="Red"]1[/COLOR][/B](i)
Next

1wwrite &H44
Waitms 100


1wreset
1wwrite &H55
For I = 1 To 8
1wwrite Rom_data[B][COLOR="Red"]1[/COLOR][/B](i)
Next

1wwrite &HBE
Waitms 100


Ich hoffe, es bringt etwas Licht ins Dunkel. ;)
Leuchten tuts schon ... :stupido2: ich ärger mich im Moment nur über Bascom
weil es keine 2D-Arrays kann (anscheinend). Ich will die rot markierten Zahlen
als 2te Dimension angeben können. Also zB ...
1wwrite Rom_data( 1 , i )
damit man auch mal sowas machen kann ...
1wwrite Rom_data( device , i )
aber es geht nicht ... :hmmmm:
Bei dem 1Wire-Kram bin ich bei Bascom schon soweit durchgestiegen. Wenn
man das gesamte Array übergeben will muß man anscheinend immer den
ersten Eintrag übergeben und er liest dann soviele Einträge wie er für den
Befehl benötigt. War jedenfalls bei einigeen Beispielen so beschrieben.

Aber noch was anderes ... Wir sollten den ganzen 1Wire-Kram doch mal hier
vom PI/PD-Thread abtrennen und nach Messen physikalischer Größen
verschieben. Es wird sonst zu unübersichtlich ...
Werde ich heute noch machen. Ich hoffe mal, das ist auch im Sinn von
Bonze. ;)

Gruß
Dino
 
Beiträge verschoben um die Übersichtlichkeit zu bewahren

Hallo Bonze und die anderen,

an dieser Stelle hab ich mal dank meiner Macht als Moderator etwas umsortiert.
Um die Übersichtlichkeit zu bewahren und anderen Leuten die Suche nach
einem Thema zu erleichtern hab ich die Beiträge über die 1Wire-Temperaturmessung
aus diesem Beitrag ...
Software
- Steuern und Regeln (PI + PID)
=>

CodeBox BascomAVR
 PI Regelung[/URL][/B]
herausgelöst und hierhin verschoben.

Gruß
Dino
 
ist das beispiel jetzt zum auslesen de rom daten oder zum auslesen der temp?

ich definiere die rom:_adress(8) als ein Byte-array welches aus 8 bytes besteht?
beim speichern in dieses array kann ich aber wenn ich nen 64bit string hab diesen einfach mit rom_adress(1) speichern?
 
Hallo dino,
wie du schon sagst, hast du da einiges an Firlefanz nur um ein Pseudo 2-dimensionales Array zu erzeugen.
Im SRAM liegen die Zellen des Arrays eh hintereinander. Wenn du nun die Berechnung des Offsets selber machst, kannst du in einer Schleife dann doch sehr einfach darauf zugreifen. Etwa so

Code:
count=1wirecount()
IDs(1) = 1wsearchfirst()
offset=9
For i=2 to count
   IDs(Offset) = 1wsearchnext()
   Offset=offset+8
Next i

Auslesen würde ich so:

Code:
offset=1
For i=1 to count
   1wreset
   1wverify(offset)
   1wwrite  &HBE                       'Read Scratchpad
   Sensor_data(1)=1wread(9)
   Gosub Daten_auswerten
   Offset=Offset+8
Next i

1wreset
1wwrite &CC 'Skip Rom (alle Sensoren ansprechen)
1wwrite &44 'Konvertierung starten
Jetzt evtl. warten, wenn dieser Teil nicht durch einen Timer z.B. jede Sekunde aufgerufen wird.

HBA
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)