Hallo,
nachdem ich bereits Tante Guckel und die Hilfe zu Rate gezogen habe,
muss ich mich mal wieder an euch wenden.
Ich habe / will mehrere 1-Wire-Busse (da >20 Sensoren) an einen ATMega 8
hängen.
Mit 'config 1wire = PortB.0' kann man den ja prima initial in Bascom
definieren.
Schreibe ich nun im Code nextwireport = 2
1
if nextwireport = 1 then
2
config 1wire = PortB.0
3
else
4
config 1wire = PortD.3
5
endif
6
7
x(1) = 1wsesarchfirst()
dann fragen alle Routinen weiterhin den Port/Pin B.0 ab.
ändere ich hingegen initial B.0 in D.3 wird auch brav der zweite
1-wire-Port abgefragt.
Mir ist bekannt das man jeder 1w-Routine den Port und Pin mitgeben kann,
aber programmatisch wohl leider nur den Pin und nicht auch den Port. In
der Hilfe wird in einem Beispiel nur über die Pins mit einer Schleife
gegangen.
Jemand ne Idee wie ich auch per Code den Port beliebig ändern kann?
Möchte dies später via UART vom PC aus angegeben können.
Ich möchte ungern mir die Routinen etc. selber stricken müssen. Die
eingebauten sind so hübsch ;-)
Bitte kein Flamewar über C/ASM vs Bascom. Wenn dann bitte dahingehend
konstruktive Ideen. Von mir aus auch mit Inline-Assembler, wobei ASM 14
Siegel und C 7 Siegel für mich sind ;-)
grüße
lars
So, Update erledigt ... keine Unterschiede in diesem Punkt.
1
Compiler version :2.0.7.2
2
Compiler build :2.0.7.2.001
3
IDE version :2.0.7.2
Habe grad in der Übersichtsliste der CONFIG-Befehle gesehen "config
1-wire Reusable: No", d.h. das dieser Aufruf nicht mehrfach
vorgenommen werden kann. Ok. Oder auch nicht.
Aber es muss doch möglich sein mehrere 1-Wire an einem µC zu haben bzw.
das was 'config 1-wire' "manipuliert" in z.b. Inline-ASM einzubauen -
oder?
Falls ja, bitte bitte bitte, den betreffenden ASM-Code einstellen ;-)
Grüße
Lars
Lars W. schrieb:> Das schrieb ich ja bereits, nur lt. Hilfe kann man eben nur den Pin> ändern.
Nö, hast Du nicht geschrieben, dort werden im Beispielcode keine
Parameter direkt an die Befehle übergeben. Da Config für 1wire nicht
wiederverwendbar ist, kannst Du mit dem gezeigten Code nicht mal die
Pinnummer ändern, der Code dort wird also nicht wie vorgesehen
funktionieren.
Lars W. schrieb:> Habe grad in der Übersichtsliste der CONFIG-Befehle gesehen "config> 1-wire Reusable: No", d.h. das dieser Aufruf nicht mehrfach> vorgenommen werden kann.
Ja, war klar, ich kenn' die Hilfe.
Config ist aber nicht nötig, wenn der Port/Pin im Befehl selbst steht.
In der Hilfe findest Du auch, daß Pinnummer als Variable akzeptiert
wird, aber der Port direkt angegeben werden muss, das heißt die 8 Pins
eines Ports sind ohne Verrenkungen ansprechbar. Wenn Dir das nicht
reicht, musst Du Dir selbst was bauen.
Sollten die 1wire Routinen in der MCS.lib verfügbar sein, dann können
sie angepasst werden. Du kannst das nach eigener Aussage nicht, warum
sollte jemand anders Deine Arbeit machen ?
Lars W. schrieb:>> Das schrieb ich ja bereits, nur lt. Hilfe kann man eben nur den Pin>> ändern.>MWS schrieb:> Nö, hast Du nicht geschrieben, ...
Doch :-)
denn Lars W. schrieb:> Mir ist bekannt das man jeder 1w-Routine den Port und Pin mitgeben kann,> aber programmatisch wohl leider nur den Pin und nicht auch den Port. In> der Hilfe wird in einem Beispiel nur über die Pins mit einer Schleife> gegangen.MWS schrieb:> In der Hilfe findest Du auch, daß Pinnummer als Variable akzeptiert> wird, aber der Port direkt angegeben werden muss, das heißt die 8 Pins> eines Ports sind ohne Verrenkungen ansprechbar.
Genau das meine ich, Port direkt, Pin per Variable. sorry falls ich mich
da unverständlich ausgedrückt haben soll(te).
> Ja, war klar, ich kenn' die Hilfe.> Config ist aber nicht nötig, wenn der Port/Pin im Befehl selbst steht.
siehe oben, man kann nur den PIN in einer Variable definieren mir ging
und geht es auch um den Port.
> Wenn Dir das nicht> reicht, musst Du Dir selbst was bauen.
Das ist ja genau der Punkt ;-)
> Du kannst das nach eigener Aussage nicht, warum> sollte jemand anders Deine Arbeit machen ?
mir geht es nicht um den kompletten Code, sondern mein Gedanke war
abgeleitet von der Aussage in der Hilfe ...
>> The 1wire commands and function will automatically set the DDR and PORT>> register bits to the proper state. You do not need to bring the pins>> into the right state yourself.
... der, das mir evtl. auch jemand sagen kann was genau config 1-wire da
treibt, damit ich eben den DDR und das Port Register selber anpassen
kann.
Andernfalls müsste ich ja sowas in der art Programmieren (siehe 1. Post)
1
if nextwireport = 1 then
2
T(1) = 1wsearchfirst(PortB, 0)
3
elseif nextwireport = 2 then
4
T(1) = 1wsearchfirst(PortC, 4)
5
else
6
T(1) = 1wsearchfirst(PortD, 3)
7
endif
da ich einige unterschiedliche Modi habe, die unterschiedliche Werte
zurückgeben bläht diese Methode den Code gewaltig auf.
Daher meine Idee dem µC vorher zu sagen "alle 1-Wire ab jetzt B.0 oder
C.4 oder oder oder) danach laufen alle Modi/alle 1-wire-Befehle auf
diesem Port/Pin ...
> Sollten die 1wire Routinen in der MCS.lib verfügbar sein, dann können> sie angepasst werden.
Danke auf jeden Fall für den Hinweis mit der Lib, werde mir das auch mal
ansehen.
Grüße
Lars
Habe nun mal in der MCS.Lib gestöbert ... es war die Hölle :-)
ich habe da einen abschnitt gefunden, ob das allerdings der gesuchte ist
für "config 1wire" kann ich nicht beurteilen, da ich mit ASM auf
kriegsfuß stehe, könnte mir bitte einer der Experten hier was zu sagen?
1
[_1WIRE]
2
...
3
; Dallas 1wire routines. On entry X points to data, Z to PIN register, R24 holds bit number
4
; R18 holds number of bytes to transfer
5
...
6
Ret
7
8
[_ADJUST_PIN]
9
; internal routine used to create a usable number for a pin number
10
; on entry Pin number(0-7) must be in R24
11
; on exit r24 contains the number for OR operations
12
; on exit r25 contains the number for AND operations
13
...
14
Ret
(den vollständigen code will/kann/darf ich nicht posten da MCS was von
"No SOURCE code from the library may be distributed in any form"
schreibt)
kann ich überhaupt - und wenn ja wie - diesen code direkt als inline
verwenden?
wie müsste der angepaßt werden damit er läuft?
würden die anderen 1-wire-funktionen die änderungen dann überhaupt
akzeptieren?
danke
grüße
lars
Lars W. schrieb:> T(1) = 1wsearchfirst(PortB, 0)> elseif nextwireport = 2 then> T(1) = 1wsearchfirst(PortC, 4)> else> T(1) = 1wsearchfirst(PortD, 3)
Musst halt die 1wire-Befehle in eigene Funktionen kapseln, denen Du den
Port mitgeben kannst.
> da ich einige unterschiedliche Modi habe, die unterschiedliche Werte> zurückgeben bläht diese Methode den Code gewaltig auf.
Wüsste jetzt nicht, warum der Code "gewaltig" aufgebläht würde, wenn man
eigene Funktionen aufruft. Das wäre der für Dich beherrschbare und auch
sinnvolle Weg.
Georg Ious schrieb:> Schonmal daran gedacht, dass 1WIRE ein BUS ist, an den mehrere Geräte (> bis ca. 100) angeschlossen werden können?
ja das habe ich, aber aufgrund unterschiedlicher leitungslängen kommt es
vor, das einige Sensoren nicht richtig erkannt werden.
ja, mit verschiedenen widerständen habe ich rumgespielt und die AN von
Maxim auch gelesen ...
MWS schrieb:> Wüsste jetzt nicht, warum der Code "gewaltig" aufgebläht würde, wenn man> eigene Funktionen aufruft. Das wäre der für Dich beherrschbare und auch> sinnvolle Weg.
beherrschbar ja, nur PRO abfrage ergeben sich ja (ungezählt) 5,6,7,8
Befehle, welche ich in eigene funktionen Packen müsste, ok, geht,
"schöner" wäre es aber eben dies nicht machen zu müssen sondern nur den
"Ausgangsport" aller 1-wire-befehle zu ändern. Das wäre die bequemste
art und weise.
hatte mal irgendwo im internet was gesehen wo einer an einer steuerung
mehrere ports/pins für mehrere busse hatte. leider war da imho kein code
dabei und soweit ich mich erinnere wäre der auch in C gewesen.
allein aus organisatorischen gründen kann es doch auch manchmal gut sein
die sensoren oder busteilnehmer zu trennen, kann mir also prinzipiell
nicht vorstellen, das man nachträglich während des betriebes des uC dies
nicht mehr ändern können sollte.
Falls ich irgendwoher ne lösung finde, werde ich sie euch aber auch
mitteilen.
So lange, danke und grüße
lars
Zur Überwachung meiner Heizung verwende ich mehrere 1.Wire-Buse mit
jeweils einem Sensor. Nachfolgend die Abschntte zur Busbedienung (ohne
Ablauf und Zeitsteuerung):
---- 1.Wire-Buse anlegen
Config 1wire = Portb.0 '5 mal 1Wire-Bus konfigurieren
Config 1wire = Portb.1
Config 1wire = Portb.2
Config 1wire = Portb.3
Config 1wire = Portb.4
' ------------- Startbefehl für Temperaturmessung ----------------
Erste_messung_starten_b:
Bus = 255 ' -1 in Bytedarstellung
Index = 0
Naechste_messung_starten_b:
Incr Index
Incr Bus
1wreset Pinb , Bus ' mindestens 1 Sensor am Bus
If Err = 0 Then
1wwrite Skip_rom , 1 , Pinb , Bus ' und Messung starten
1wwrite Convertt , 1 , Pinb , Bus
End If
Return
-------
Der Temperaturwert wird 2 Sekunden nach dem Startbefehl geholt,
dann kommt der nächste 1.Wire-Bus dran.
-------
Aktuelle_buchse_abfragen:
1wreset Pinb , Bus ' Sensor DS18S20 abfragen
If Err = 0 Then
1wwrite Skip_rom , 1 , Pinb , Bus ' Command Skip ROM
1wwrite Read_ram , 1 , Pinb , Bus ' Sensor abfragen
Array_1wire(2) = 1wread(9 , Pinb , Bus)
If Array_1wire(10) = Crc8(array_1wire(2) , 8) Then ' ok?
Gosub Temperatur_a_eintragen ' CRC ist ok !
End If
Else
Gosub Keine_sensoren_gefunden
End If
Gosub Index_eintragen '.. und LCD-String berechnen und anzeigen
Return
Gruß allu
öh, ich bin verwirrt ...
also kann man doch "config 1-wire" mehrfach verwenden, oder bezieht sich
das "reusable no" in der hilfe auf was anderes?
auf jeden fall, danke allu
was aber auch in deinem programm nicht geht ist den PORT zu wecheln, nur
der PIN geht ... aber wenigstens schon mal was :-))
DANKE
grüße
lars
Lars W. schrieb:> was aber auch in deinem programm nicht geht ist den PORT zu wecheln, nur> der PIN geht ... aber wenigstens schon mal was :-))
Doch, mein 6ter 1.Wire-Bus liegt auf Port d.3, habe ich aber wegen der
Übersichtlichkeit weggelassen (Solar-Speicher und Warmwasser-Speicher,
Heizung Vor- und Rücklauf, Solar Vor- und Rücklauf und Abgastemperatur
mit einem PT1000 - aber das ist eine andere Geschichte).
MWS schrieb:> Dieser Code ist komplett sinnfrei, der Rest funktioniert nur weil den> 1wire-Befehlen Port und Pin direkt mitgegeben wird:
Mag sein, läuft aber schon seit Wochen ohne Probleme durch.
Gruß allu
Karlchen schrieb:> Mag sein, läuft aber schon seit Wochen ohne Probleme durch.
Solange die eigentliche Funktion nicht behindert wird, lässt sich das
Hinzufügen von sinnlosem Code fast beliebig fortsetzen :D
MWS schrieb:> Solange die eigentliche Funktion nicht behindert wird, lässt sich das> Hinzufügen von sinnlosem Code fast beliebig fortsetzen :D
Darf ich mal raten: Du bist Informatiker ?
MWS schrieb:> Nein, das ist nicht mein Job, aber ich weis was in Bascom geht und was> nicht.
Frage: Kann ich
Config 1wire = Portb.4
Config 1wire = Portd.3
usw.
einfach weglassen, weil dadurch überhauot kein BASCOM-Code generiert
wird ?
Danke, gruss allu
allu schrieb:> Frage: Kann ich>> Config 1wire = Portb.4> Config 1wire = Portd.3> usw.>> einfach weglassen, weil dadurch überhauot kein BASCOM-Code generiert> wird ?
Durch diese Configs wird grundsätzlich noch kein Code erzeugt. Du sagst
dem Compiler nur, daß im Falle er einen 1wire-Befehl ohne Port/Pinangabe
findet, dann eben diese Config-Einstellung verwendet.
Solltest Du also noch einen 1wire-Befehl ohne Port/Pin im Code haben,
dann achte darauf welches Config dafür verwendet wird.
Hat jeder 1wire-Befehl seine eigene Port/Pin-Angabe, dann kannst Du Dir
die Configs sparen.
hmm, habe das mal testweise umgebaut auf Port,Pin angabe ohne das Config
vorher zu verwenden ...
kam nur mist bei raus ... er landet in der do loop in einer
endlosschleife, scheinbar wird ERR nicht gesetzt. die Hex werte für den
sensor sind 00, nur die letzten beiden ziffern ändern sich.
bei 1wverify kann man imho und laut hilfe keinen port/pin angeben ...
wie soll das dann gehen? oder geht nur eh immer 1wverify(1)?
Weiterhin geht 1wirecount nicht, hier bleibt der uC hängen. und geht
erst ewig später weiter, wenn überhaupt. und wenn er es doch macht oder
wenn ich es auskommentiere, dann gibts o.g. "00"en
und ja bzw. nein D.5 ist nicht anderweitig konfiguriert ;-)
codeausschnitt:
1
...
2
1wactivebus = 5
3
Reset Err
4
1wreset Portd , 1wactivebus
5
1wwrite &HCC , 1 , Portd , 1wactivebus
6
1wwrite &H44 , 1 , Portd , 1wactivebus
7
Waitms 750
8
9
Tmp1int = 1wirecount(portd , 1wactivebus) ' <-- hier bleibt er hängen
MWS schrieb:> Hat jeder 1wire-Befehl seine eigene Port/Pin-Angabe, dann kannst Du Dir> die Configs sparen.
Aha, danke, habe ich immer mit Port/Pin-Angabe gemacht, deshalb läuft es
wohl problemlos.
Gruss allu
allu schrieb:> Aha, danke, habe ich immer mit Port/Pin-Angabe gemacht, deshalb läuft es> wohl problemlos.
Zitat aus der Bascom-Hilfe:
> You can configure only one pin for the 1WIRE statements because the idea is that> you can attach multiple 1WIRE devices to the 1WIRE bus.> You can however use multiple pins and thus multiple busses. All 1wire commands> and functions need the port and pin in that case.
Lars W. schrieb:> 1wwrite &HCC , 1 , Portd , 1wactivebus> 1wwrite &H44 , 1 , Portd , 1wactivebus> Tmp1int = 1wirecount(portd , 1wactivebus) ' <-- hier bleibt er hängen
Vergleich' doch die verwendete Syntax mit der Hilfe, oder auch mit
allu's Code.
Lars W. schrieb:> Bleibt nur die Frage noch übrig bei 1wverify ...
In einem anderen Fall sind an einem Bus 2 Sensoren angeschlossen. Die
Sensoren werden über ihre ID (Dsid1()und Dsid2() ausgewählt.
Die IDs werden beim Programmstart einmalig aus den Sensoren ausgelesen.
Const Read_ram = &HBE
Dim Dsid1(8) As Byte
Dim Dsid2(8) As Byte
Const 1w_bus_1 = 1 ' Port-Pin ist PC.1
-----------------
-----------------
' 1.Temperatursensor DS18S20 abfragen
1wreset Pinc , 1w_bus_1
1wverify Dsid1(1) , Pinc , 1w_bus_1
If Err = 0 Then
1wwrite Read_ram , 1 , Pinc , 1w_bus_1
Array_1wire(2) = 1wread(9 , Pinc , 1w_bus_1)
-----------------
Sensorwerte im Array_1wire()
Gruss allu
Lars W. schrieb:> Ok, Ok, Ok. Habe nur PORT gelesen und nicht das die Funktionen da PINx> haben wollen, steht da auch verwirrend ;-)
Hätte Mark schreiben sollen "1WWRITE var1 , bytes , pin , pin" ?
Lars W. schrieb:> Bleibt nur die Frage noch übrig bei 1wverify ...
1wverify Arg(1), PinX, PX hat's nur nicht in die Hilfe geschafft, wird
aber richtig compiliert.
allu schrieb:> 1wverify Dsid1(1) , Pinc , 1w_bus_1
lt. Hilfe gibt es dieses Konstrukt nicht ...
MWS schrieb:> 1wverify Arg(1), PinX, PX hat's nur nicht in die Hilfe geschafft, wird> aber richtig compiliert.
... wenns denn funktioniert solls mir recht sein. Werde es testen.
MWS schrieb:> Hätte Mark schreiben sollen "1WWRITE var1 , bytes , pin , pin" ?
naja, das nicht aber vielleicht so
1wwrite var1 , bytes , port-pin, pin-number
und bei den mit Portangabe anstelle Pin vielleicht
1wwrite var1 , bytes , port, pin-number
dann wäre es auf jeden fall übersichtlicher, nun denn, es ist müssig
sich darüber aufzuregen, is halt nicht so.
Es geht.
ich weiß das man auch mal ein paar zeilen tiefer gucken und noch genauer
lesen muss in zukunft und fertig.
danke für eure hilfe bis zum nächsten mal :-)
lars