Im Prinzip kann man 1wire ja auch nachmachen: Wird die Versorgungsspannung kurz unterbrochen entspricht das einer "1", und eine längere Unterbrechung einer "0". Zum Beispiel 1 ms und 2 ms.
Die Versorgungsspannung wird wie schon beschrieben mit ´nem Kondensator gepuffert, der für so kurze Zeitintervalle aber keine gigantische Kapazität braucht. Wichtig ist natürlich die Diode davor, damit die gemeinsame Spannungs- und Datenleitung auch wirklich auf Low gehen kann, und nicht vom Kondensator auf High gehalten wird.
Mit diesen kurzen oder längeren Pausen auf der Leitung machst Du folgendes:
Beide Flanken triggern einen Interrupt. Bei der fallenden (d.h. der Pin ist Low) wird ein Timer gestartet. Bei der steigenden (Pin = High) wird der Timer gestoppt und abgefragt. Ist er weiter gelaufen als in 1 ms, wird ein entsprechendes Bit auf 1 gesetzt, ansonsten auf 0. Anschließend wird der Timer natürlich wieder resettet für die nächste Runde.
Gleichzeitig kannst Du noch eine Zählvariable bei jeder steigenden Flanke von hochzählen lassen und aus den einzelnen Bits ein Byte bauen. Ist die Zählvaraible 7, ist das Byte fertig, was dem Hauptprogramm mit einem entsprechenden Flag angezeigt werden kann .
Das ganze mal als Code (Taktfrequenz z.B. 1 MHz, Interrupt = INT0 = PIND.2, 8-bit Timer0):
Code:
Config timer0 = timer, prescale = 64 ' Zählt in 1 ms bis ca. 15, in 2 ms bis ca. 30
Dim My_bit as bit ' Variable für jedes empfangene Bit
Dim My_byte as byte ' Variable für das empfangene Byte
Dim Byte_ready as bit ' Flag für fertig empfangenes byte
Dim I as Byte ' Zählvariable
Config INT0 = Change ' Interrupt 0 bei steigender und fallender Flanke
On INT0 Flanke
Enable INT0
Enable Interrupts
Do
If Byte_ready = 1 then
Byte_ready = 0
... ' Neues Byte empfangen: Was auch immer damit geschehen soll...
...
...
End if
Loop
Flanke:
If PIND.2 = 0 then ' fallende Flanke
Start timer0
Else ' steigende Flanke
Stop timer0
If timer0 < 20 then My_bit = 1 else My_bit = 0
timer0 = 0
My_byte(I) = My_bit
If I < 7 then ' Noch keine 8 Bits empfangen
I = I +1
Else ' 8 Bits empfangen: Byte fertig!
I = 0
Byte_ready = 1
End if
End if
Return
Edit: Und natürlich ein "Return" am Schluss der ISR...
Lesezeichen