Danke für die Hinweise, aber leider finde ich keine Schaltpläne oder ähnliches dazu :(
mfg
Dominik
Druckbare Version
Danke für die Hinweise, aber leider finde ich keine Schaltpläne oder ähnliches dazu :(
mfg
Dominik
Moin Dominik!
Also, mit einer "wesentlich geringeren" Spannung wirst Du den Mikrocontroller nicht programmieren können. Ein High-Pegel muss schon einen bestimmten, definierten Wert haben.
Aber einen grundsätzlichen Lösungsansatz hätte ich schon, für den ich allerdings noch zwei Dinge wissen müsste:
1. Hast Du bedacht, dass beim Deaktivieren der Versorgungsspannung auch der Motor abgehängt wird? Denn den wird auch der dickste Gold Cap ja nicht wirklich mit Leistung versorgen können...
2. Welche Mengen an Daten möchtest Du übertragen, und wie oft (pro Stunde, Minute oder Tag)?
@Sauerbruch
Die Steuerung soll nicht programmiert werden (im herkömmlichen Sinn mit z.B. ISP) sondern es sollen nur Parameter übertragen werden.
@blacksnake
Ich habe einen Link gepostet (mikrocontroller.net) hast du den schon angeschaut? Dort hat auch jemand soetwas Ähnliches gesucht.
MfG Hannes
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...