Forum: Mikrocontroller und Digitale Elektronik 1-Wire Verbindungen von PIC zu PIC


von Jochen S. (Firma: ---) (nechoj)


Angehängte Dateien:

Lesenswert?

Hallo,

lt. beiliegender .png Zeichnung habe ich folgendes Problem:

AHSS-Modul (MASTER) soll über Port C7 mit einem Sk/Gbm/Hs-Modul (SLAVE),
Port C4, mit einer 1-Wire Leitung (sSkRm) verbunden werden.
Am SLAVE sind 6 Eingänge von 6 um-Schaltern (Pegel schalten: GND--> +5V)
(Schaltdauer-Länge muss auf ca. 1/2 sec begrenzt sein) und 2 weitere 
Eingänge RM + Gbm angeschlossen. Diese insgesamt 8 diversen Parameter
sollen als 8 bit Daten vom SLAVE zum MASTER übertragen werden. (sSkRm)
bit 0 entspricht Anschluß Sk, bit 1 Anschluß Sk-R, usw., lt. Zeichnung.
Wie muß ich vorgehen? Braucht der SLAVE eine Adresse?
Alle mir vorliegenden Unterlagen über eine 1-Wire Übertragung (Maxim)
beziehen sich nur auf Übertragungen MASTER zu MAXIM-Fertigkomponenten.

Für exakte zweckdienliche Hilfestellung (evtl. C-Programm) wäre ich sehr
dankbar.
Es verbleiben für mich darüber hinaus noch weitere Fragen.
(5 einzeln zu vergebende Adressen für das MASTER-Modul, Programmierung
über einen Taster auf der Platine), usw..

Gruß und Dank

 Jochen

Bemerkungen: Beide oben angesprochenen PIC's sind mit 16 MHz getaktet.
             Das Programm soll in C geschrieben sein.
             Die Länge der ser. 1-Wire Leitung liegt zwischen 1,5 - 10m,
             je nach Zusammenstellung.
             Als Compiler soll PICC-Lite verwendet werden.
             MPLAB-ICD 2 von Microsoft ist vorhanden.

von Hans_Dampf (Gast)


Lesenswert?

>Die Länge der ser. 1-Wire Leitung liegt zwischen 1,5 - 10m,

Nur so nebenbei, Du bist Dir aber schon im klaren, dass Du für eine 
1-Wire Verbindung 2 Adern (Daten + GND) benötigst, oder?

Wie groß ist die Datenrate über diese Leitung?

von Michael S. (rbs_phoenix)


Angehängte Dateien:

Lesenswert?

Also ich habe mal über ein Funkmodul (theoretisch ja auch nur ein Kabel) 
Daten von 2 PICs ausgetauscht. Das überall die gleiche Masse sein 
sollte, ist ja klar (wenn es nicht darf, musste mit 2 Leitungen hin und 
über Optokoppler trennen). Ich habe mir 2 Funktionen in C geschrieben, 
die einmal 8 bit sendet und 8 bit empfängt.

Ich habe das etwas anders gelöst, weil ich über Funk keine nervige 
syncronisation haben wollte:
Ich sende Immer 8 Highsignale im Abstand von 30µs. Kommt schon 5 µs 
hinter dem Highsignal ein zweites Highsignal, ist es eine übertragene 1. 
Wenn nicht, eine übertragene 0. Das Byte ist zuende, wenn nach 30µs kein 
erneutes Highsignal kommt.
Also eine 1: 5µs high, 5µs low, 5µs high, 15µs low.
Und eine 0: 5µs high, 25µs low.

siehe Anhang: die großen Zahlen sind die Bits und die kleinen die µs

Also bei mir geht es. Ich rufe die Funktion immer 3 mal auf, 1. Adresse 
und dann 2 Daten-Bytes. Der Empfänger ist immer als Eingang geschaltet, 
liest das erste Byte mit und wenn es nicht seine Adresse ist, ignoriert 
er die nächsten beiden Bytes. Vorteil finde ich dabei ist, dass man halt 
keine Sync software braucht (man kann auch problemlos PICs mit 
unterschiedlichen Taktungen nehmen, solange überall 1µs-Pause auch 1µs 
ist), man kann bestimmen ob MSB oder LSB zuerst kommt, man kann auch 
immer 16 bit übertragen (adresse + byte, um jedem byte einem Empfänger 
zuzuschreiben), man kann zusätzlich zur vorhandenen Adresse noch eine 
Globale Adresse machen, dass z.b. alle Empfänger das Byte lesen.

Für bidirektional muss man nur aufpassen, dass im Standard-Fall alle 
angeschlossenen Ports auf Eingang sind und derjenige, der senden will, 
auf Ausgang Schaltet (um einen kurzen zu vermeiden).

Also wenn man das so macht, wie in der Grafik, kann man im Ideal-Fall 2 
Bytes in 750µs senden (3*250µs), somit hat man 1333,333 bytes pro 
sekunde und das sind ca 1,3 KB/s. Heutzutage nichts tolles, aber 
selbstgemacht, 1-wire und mit 4MHZ-PICs. Man kann hier natürlich auch 
32MHz PICs nehmen, und sagen, man teilt die Zeit durch 8, dann hat man 
10,4 KB/s.



Lange rede, kurzer Sinn. So hab ich es gemacht, es hat funktioniert und 
wenn du noch interesse hast, sag es hier und ich schreib dir die 2 
Funktionen in C. Allerdings bin ich normalerweise ein Fan von 2-wire wie 
I²C z.B. Also ich kenne die umstände nicht genau, aber ich würde der 
Einfachheit her immer wenns geht minimal 2-wire nehmen (habe auch schon 
4-wire gemacht: Takt, 2 Bits gleichzeitig und Busy-Leitung).

MFG RBS_Phoenix

von Michael S. (rbs_phoenix)


Lesenswert?

Ohh ich hab ja garnicht zuende gelesen^^

Jochen Sch. schrieb:
> Braucht der SLAVE eine Adresse?

Ansich in dem Beispiel zwischen C4 und C7 nicht, weil ja nur einer da 
ist zum empfangen. Nur 2 Fragen stell ich mir noch.

1. Monodirektional ist dann ja so, dass in dem Fall alle 0,5 sec der 
Slave an den Master sendet und somit der Master nicht senden soll (denn 
sonst wär es ja wieder bidirektional) und anders rum macht es keinen 
Sinn, da du die Daten der Eingänge nicht zum Master bekommst.

2. Kann es sein, dass 2 Master an einem Bus sind? Wer ist denn dann der 
Master der Master?

Ich hätte die beiden unteren Master-Slave getauscht. Dann hast du nur 
einen Master an den einen Bus und der andere ist logischer, da dann der 
Master monodirektional an den Slave sendet.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.