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...







Zitieren

Lesezeichen