Forum: Compiler & IDEs AVR 1wire per interrupt


von Jürgen S. (jsachs)


Angehängte Dateien:

Lesenswert?

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

von Jürgen S. (jsachs)


Lesenswert?

Nachtrag:

ich habe die AP Note gelesen, wo der UART genutzt wird um den One Wire 
zu erzeugen. Der ist bei mir aber schon RS485 belegt.
Der SPI wäre noch verfügbar. Allerdings erzeugt der SPI ja kein Start 
und Stopbit.
Theoretisch sollte das doch durch Bit 0 und Bit 7 simuliert werden 
können. Es beleiben dann eben nur noch 6 Bit für die Datengenerierung 
bzw Datensampeln übrig.

[off topic]
Konnte man nicht nachträglich seinen Beitrag editieren / Betreff ändern 
?
[/off topic]

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.