Hallo,
ich habe hier im Forum und bei Google schon ein wenig gesucht, aber
nicht 100%ig das gefunden was ich suche.
Es gibt ja hier schon einige Umsetzungen des 1wire in Software. Was ich
aber gerne hätte wäre die Umsetzung per Interrupt, bzw eine Art die
nicht vom Software Timing abhängt.
Mir fallen da 2 Möglichkeiten ein:
1) Interrupt Lösung:
Empfang: einen Interruptfähigen Pin und einen Timer nutzen. Kommt ein
Interrupt, kann man anhand der Zeit des Timers feststellen ob es eine
"0" oder eine "1" ist.
Senden: Der Timer löst einen Interrupt aus, der sich dann um das setzen
des nächsten Bits kümmert. Ähnlich des Software UART.
Allerdings sehe ich hier Probleme wenn bereits andere Interrupts aktiv
sind. das dürfte das Timing durcheinanderbringen, da ja immer nur ein
Interrupt zur gleichen Zeit bearbeitet werden kann.
2) Über UART SPI TWI simulieren
UART ist bei mir belegt, also hier mal die Beschreibung für den SPI
Anschlussbild siehe Anhang.
Senden: Je nach auszugebenden Signal schreibt man jetzt "11111000"
(1wire "1") bzw "11000000" (1wire "0") in das SPDR Register.
Wird jetzt der Takt so gewählt, das hierbei das richtige Timing entsteht
sollte das ja funktionieren
Empfangen: Man schreibe eine 1wire "0". Sobald der SPI Interrupt kommt,
sind 8 Bits gesampelt und man kann anhand der Bits feststellen ob "0"
oder "1" empfangen wurde. Ungefähr so "if (SPDR > 127) Bit=1; else
Bit=0".
Da das Timing zwischen den Bits nur eine Mindestpause benötigt, sollte
das kein Problem sein. Der Reset darf ja gerne auch etwas länger sein
(Parasite Power nicht ?)
Soweit zu Theorie :-)
R2 dient als Schutz und Entkopplung des SPI beim Programmieren. C1 ist
optional als "Slew rate" Limiter, R1 und R3 dürften klar sein. Bei Q1
könnte ein FET eventuell besser sein.
Variante 2 würde ich bevorzugen.
Der SPI müsste dann ja so eingestellt werden, das ein BYTE ungefähr
80us-100us dauert.
Nachteilig ist das 2-3 Pins verloren gehen. Auch konnte ich nicht genau
im Datenblatt erlesen ob ich den SCK Pin noch anderweitig nutzen kann,
wenn der SPI im Master Modus läuft.
Allerdings wäre das Timing komplett unkritisch in Hardware realisiert.
Der Prozessor ist frei für andere Interrupts wie Softuart und Co, was ja
auch Zeitkritisch ist.
Kann das funktionieren ?
Hat das schon mal jemand umgesetzt ?
Mein DS18S20 sind leider falsch(nicht) geliefert worden, so das ich noch
nichts testen kann.
Gruss
Juergen