PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere 1wire-Ports festlegen:



hardware.bas
28.11.2010, 20:00
Sorry, ich hatte das Thema schon mal aufgegriffen, warscheinlich jedoch in
einem thematisch ungünstigen Thread. Also, weiss jemand, ob es
möglich ist, mehrere 1wire-Port am AVR zu nutzen. Man kann zwar
mehr dimensionieren, die Ausleseprozedur bezieht sich jedoch nicht
auf einen speziellen Port. Vielen Dank für ein Feedback. VG Micha

for_ro
28.11.2010, 20:34
Also, weiss jemand, ob es möglich ist, mehrere 1wire-Port am AVR zu nutzen. Man kann zwar mehr dimensionieren ...
Was meinst du mit "dimensionieren"? Du kannst nur einen konfigurieren.


... die Ausleseprozedur bezieht sich jedoch nicht
auf einen speziellen Port.
Du kannst doch in jedem 1wire Befehl einen Port und einen Pin angeben.

hardware.bas
28.11.2010, 20:45
Natürlich konfigurieren ist gemeint. Ich brauche 3 Stück 1wire-Ports. Ohne
beim Compilieren zu meckern kann ich Diese konfigurieren. Nun mein
Problem: Wie weise ich die Ausleseprozedur den einzelnen Ports zu?
Wenn das nicht klappen sollte, kann man ev. vor dem Ausleseprozedere
den einzelnen Port konfigurieren, so dass immer der zuletzt konfigurierte
Port dann massgebend ist? VG Micha

for_ro
28.11.2010, 20:49
Nochmal:


Du kannst doch in jedem 1wire Befehl einen Port und einen Pin angeben.

var2 = 1WIRECOUNT( port , pin)
var2 = 1WSEARCHFIRST( port , pin)
var2 = 1WSEARCHNEXT( port , pin)
var2 = 1WREAD( bytes , port , pin)
1WRESET , PORT , PIN
1WWRITE var1 , bytes , port , pin

Die einzige Ausnahme scheint mir 1wverify zu sein. Hatte ich noch gar nicht bemerkt.

Edit: Bascom kompiliert dies jedenfalls, ob's funktioniert müsste man ausprobieren
1wverify var1 , port , pin

hardware.bas
28.11.2010, 21:15
Vielen Dank. In der kommenden Woche werd ich das ausprobieren können.
VG Micha

hardware.bas
07.12.2010, 18:01
Vielen Dank, for_ro, für Deine Hilfe. Ähnliches hatte ich dann später im
BASCOM-Lehrbuch gefunden. Ich habe nun heute diese Lösung gebraucht,
leider ohne Ergebnis. 3 Stück DS18S20 sind sternförmig verkabelt, also
bedingt durch die Kabeltopologie nicht als 1WIRE-BUS betreibbar. Alle
3 Sensoren funktionieren auch beim einzeln auslesen (Umflashen des
Programmes auf die configurierten Ports / Alle werden mit +5V, GND und
DATA, also 3-adrig betrieben). In meinem Falle an PORTD.5, PORTD.6 und
PORTD.7, welche in dem Versuch alle als 1wire konfiguriert wurde.
Benutzt wurde dann die bekannte Prozedur der Einzelmessung,
wobei an die 1wire-Kommandos folgendes rangehägt wurde:
1w"kommando", pind , x (x der Pin). Leider ist keine
Kompilierung möglich. Obwohl ich nicht verlangen will, dass ich eine
vorgekaute Lösung für diesen speziellen Fall bekomme, wäre ich
jedoch für ein Beispiel dazu dankbar. VG Micha

for_ro
07.12.2010, 18:15
Wie sieht denn der Code aus, den du nicht kompilieren kannst?

hardware.bas
07.12.2010, 18:34
Leider steht der Rechner und das Gerät mit der Elektronik ung. 70km
auf der Baustelle. Ich kann von dort jedoch ins Netz.
UNGEFÄHR!!! sieht der Code ao aus, als Auszug:



Config 1wire = Portd.5
Config 1wire = Portd.6
Config 1wire = Portd.7
Dim Sp(9) As Byte

for x = 5 to 7

1wreset , pind , x
1wwrite &HCC , pind, x
1wwrite &H44 , pind , x

Waitms 512

1wreset , pind , x
1wwrite &HCC , pind , x
1wwrite &HBE . pind , x
Sp(1) = 1wread(9 , pind ,x)

"Array auslesen und drucken ok"

Wait 1

next

---------------------------------------------
Wenns funktioniert, wird natürlich der
Anwendung angepasst. VG Micha

for_ro
07.12.2010, 19:07
Mach es mal so:
'Config 1wire = Portd.5 'brauchst du nicht
'Config 1wire = Portd.6 'mehrere geht eh nicht
'Config 1wire = Portd.7
Dim S_p(9) As Byte 'SP ist ein reserviertes Wort
Dim X As Byte
for x = 5 to 7

1wreset Pind , X 'Fehler in der Hilfe, Komma hinter 1wreset muss weg
1wwrite &HCC , 1 , Pind , X 'Anzahl Bytes muss angegeben werden
1wwrite &H44 , 1 ,pind , x

Waitms 512

1wreset Pind , X
1wwrite &HCC , 1 ,pind , x
1wwrite &HBE , 1 , Pind , X
S_p(1) = 1wread(9 , Pind , X)

'"Array auslesen und drucken ok"

Wait 1

Next

hardware.bas
07.12.2010, 20:04
Vielen Dank, ich werde es morgen probieren. Folgende Fragen hab ich
gleich, um dann ev. eigenständig weiterzukommen:
- Es reicht also. EINEN Port zu configurieren, den Letzten??
- Was bedeutet die 1 hinter den 1wire-Befehlen
- Musste bei Anzahl der Bytes bein DS1820 dann nicht "9" stehen?
Das funktioniert bei mir:
- Beim array hab ich eine andere Variable, fällt mir ein, die funktioniert
- Das mit SP habe ich auch festgestellt, seit ich BASCOM-Vollversion hab
Ich halte Euch auf dem Laufenden, wies ausging. VG Micha

for_ro
07.12.2010, 21:07
- Es reicht also. EINEN Port zu configurieren, den Letzten?? Bei dir gar keinen. Der konfigurierte Pin wird nur genommen, wenn du hinter den Befehlen nichts angibst
- Was bedeutet die 1 hinter den 1wire-Befehlen Die Anzahl Bytes bei 1wwrite
- Musste bei Anzahl der Bytes bein DS1820 dann nicht "9" stehen? Nein, du überträgst ja nur ein einzelnes Byte, wie z.B. &HCC
Das funktioniert bei mir:
- Beim array hab ich eine andere Variable, fällt mir ein, die funktioniert
- Das mit SP habe ich auch festgestellt, seit ich BASCOM-Vollversion hab
Ich halte Euch auf dem Laufenden, wies ausging. VG Micha[/b]

hardware.bas
08.12.2010, 04:30
Ok, vielen Dank für Deine Mühe, for-ro. Beim Kennen der logischen
Hintergründe wird das für mich in wenigen Stunden sicher nunmehr
lösbar sein. Auf Grund des geforderten Zeitschemas werden alle
3 Sensoren hintereinander angestossen, danach gemeinsam einmalig mit
waitms 512 gewartet und danach hintereinander ausgelesen.
Wenn obiges funktioniert, müsste dann auch das gehen. VG Micha

for_ro
08.12.2010, 12:13
Wenn du die Schleife in ein größeres Programm eingebunden hast, wäre es noch sinnvoll, das Waitms 512 wegzubekommen.
Dazu würde ich den Ablauf so ändern:
Im Initialisierungsbereich deines Programm stößt du einmalig für alle Sensoren die Konvertierung an
In deiner Main wirst du ja in regelmäßigen Abständen die Temperatur Ausgabe durchlaufen. Die geht dann so:
For x = 5 to 7
[list=a:8f71c15875]
1wreset Pind , X
1wwrite &HCC , 1 ,pind , x
1wwrite &HBE , 1 , Pind , X 'Werte auslesen
S_p(1) = 1wread(9 , Pind , X)
'"Array auslesen und drucken ok"
1wreset Pind , X
1wwrite &HCC , 1 , Pind , X
1wwrite &H44 , 1 ,pind , x 'nächste Konvertierung starten

Next[/list:o:8f71c15875]

hardware.bas
08.12.2010, 13:07
for-ro, vielen Dank, jetzt haben sich unsere Beiträge überschnitten.
Also, nochmals vielen Dank, seit einigen StunDen läuft es genauso,
wie beabsichtigt. Das Anstossen mit einer 3maligen For-Next-Schleife,
danach die Waitms-Anweisung (meines Wissens braucht der DS1820
einen kurzen Moment, stört sicher nicht und ist jetzt im Impulsfahrplan
integriert) und danach das Einzelnauslesen mit der Variablenzuweisung.
Wie erwähnt.... es klappt jetzt alles vorzuglich, war eine PRIMA HILFE!
Schreibe hier von der Baustelle. VG Micha

for_ro
08.12.2010, 14:09
Dein Ablauf:

---------------
Konvertieren
Waitms 512
Auslesen
Ausgeben
---------------
andere Sachen, Wiederaufruf z.B. nach 1. min
---------------
Konvertieren
Waitms 512
Auslesen
Ausgeben
---------------
andere Sachen, Wiederaufruf z.B. nach 1. min
---------------
Konvertieren
Waitms 512
Auslesen
Ausgeben
---------------


Bei mir
---------------
Auslesen
Ausgeben
Konvertieren
---------------
andere Sachen, Wiederaufruf z.B. nach 1. min
---------------
Auslesen
Ausgeben
Konvertieren
---------------
andere Sachen, Wiederaufruf z.B. nach 1. min
---------------
Auslesen
Ausgeben
Konvertieren
---------------
andere Sachen, Wiederaufruf z.B. nach 1. min

Bei dir sind die 512ms notwendig, damit der Sensor die Konvertierung fertigstellen kann.
Bei mir wird die Konvertierung während der Zeit durchgeführt, in der andere Sachen gemacht werden. Da dies in der Regel länger als 512ms dauert, sind die Sensoren auch fertig. Ergebnis: Wartezeit vermieden.

Ich würde das immer auf diese Weise machen.

hardware.bas
10.12.2010, 20:13
Gute Idee! Habe schon was gefunden, was in dieser Wartezeit den AVR
beschäftigt. VG Micha