daten war ein Beispiel für eine Variable
Weiterrücken kann man mit dem Shift oder rotate
Man kann auch anstatt daten.0 daten.a schreiben, wodei a dann auch ein
Variable sein muß
Was meinst du mit "daten = 23" ?
Ich wollte doch bytes versenden .. keine Zahlen. Das verstehe ich nicht :-O
MfG,
ShadowPhoenix
PS: Wie rückt man in einem Byte weiter
daten war ein Beispiel für eine Variable
Weiterrücken kann man mit dem Shift oder rotate
Man kann auch anstatt daten.0 daten.a schreiben, wodei a dann auch ein
Variable sein muß
Ja, aber kann daten nicht auch "00000001" sein?
Weil wie soll man bei der Zahl "23" abfragen, ob eine ziffer "1" oder "0" ist ?
MfG,
ShadowPhoenix
Also - du musst deine Sende LED zu erst einmal mit 36kHz modulieren.
D.h. du initialisierst deinen Timer und schaltest die led alle 13,9 us an und alle 13,9 us später wieder aus. Dann sendet das Teil immer eine 1.
Wenn du nun eine Null senden willst, dann musst du die LED einfach ausschalten.
Um nun ein Byte zu übertragen, musst du vom MSB (most significant bit), also das oberste Bit zuerst übertragen, dann rotierst du das Byte eins nach links und sendest dann wieder das MSB. Das machst du insgesamt 8 Mal - dann hast du dein Byte übertragen.
Nun musst du nur noch ein Timing beachten, d.H. zum Beispiel eine 1 bedeutet, wenn die led 200 us lang mit 36 kHz. blinkt. Eine 0 bedeutet, wenn die LEd 200 us lang abgeschaltet ist.
Damit jetzt der Empfänger weiß, wann deine Übertragung beginnt brauchst du noch einen Syncronisationsbefehl. Zum Beispiel sendest du 50 us lang eine 1. (also 50us lang blinkt die LED mit 36 kHz).
Ich würde dir empfehlen das ganze aufzubauen, wie es bei den Phillips Fernsehgeräten ist. Die verwenden RC5. Da ist das alles geregelt.
Hier kriegst du alle Infos über RC5.
http://home.t-online.de/home/Holger....ge.htm?rc5.htm
Falls dir das nicht ganz so passt kannst du es ja ein bisschen abändern, aber vom Prinzip, ist hier bereits alles vorhanden.
Grüße
Flite
Naja - hab ein bisschen zu lang gebraucht.
Wie wärs, wenn du dir mal das binäre, hexadezimale und dezimale Zahlensystem zu Gemüte führst. Mit der wissenschaftlichen VErsion des Standard Rechners von Windows (in Zubehör) kannst du 23 ganz einfach in eine binäre Zahl umwandeln:
23 dezimal = 00010111
Grüße
Flite
@Flite
Danke!
23 = 00010111
Jop, jetzt verstehe ich
Nur:
Wie wird dann nach dem Schema...
daten = 23
for a = 1 to 8
if daten.0 = 1 then
sende 1
else
sende 0
end if
shift daten , right ,1
next a
...wieder EMPFANGEN?
MfG,
ShadowPhoenix
Also erst mal musst du das ganze verzögern.
Sonst läuft das viel zu schnell ab.
Dann musst du bei sende 1 implementieren, dass die LED mit 36 kHz moduliert wird. Sonst gibt der TSOP immer 0 zurück.
Was dir jetzt noch fehlt ist ein Startbefehl, der vor dem ganzen gesendet wird. Dieser muss eindeutig sein, darf also während der Übertragung nicht nochmals auftreten.
Wenn du nun am Empfänger diesen empfängst, musst du nur soviele us warten, wie du beim Senden auch wartest und dann den Status des TSOPs abfragen.
Also gewissermaßen:
Startbefehl erkannt.
for 1 to 8
Wenn TSOP = 1 Dann
empfang.0 = 1
else
empfang.0 = 0
rotate empfang, left, 1
warte XX us
next
So etwa sollte die empfangsroutine aussehen.
Am besten lässt sich sowas natürlich mit einem Speicheroszi überprüfen, aber ich denke, sowas besitzt du nicht ...
Grüße
Flite
Danke!
Eine Frage noch:
Kann ein Fehler auch daran liegen, dass mein 12MHz Quarz ZWEI AVR's versorgt?
Oder ist das egal?
MfG,
ShadowPhoenix
Hm - ein Quarz, der zwei AVRs versorgt sollte eigentlich gar nicht gehen.
Oder ist das ein Quarzoszillator.
Ich würde es mit 2 Quarzen versuchen, aber wenn du beide Programmieren kannst laufen die AVRs ja.
Probier es mal mit dem Code aus, wie ich ihn ober gepostet hab.
Evtl. laufen die AVRs auch noch mit dem inneren Takt (1 MHz), falls du die MEGA Reihe verwendest und die FUsebits noch nicht umgestellt hast.
Grüße
Flite
Ich meinte natürlich Quarzoszillatoren!
Naja, ich verwende ein externes Programmiergerät.
Hier meine aktuellen Codes, die leider nicht funktionieren:
SENDER:
EMPFANG:Code:$regfile = "m8def.dat" $crystal = 12000000 Dim Daten As Byte Dim A As Integer Config Portb = Output Mainloop: Daten = 170 For A = 1 To 8 If Daten.0 = 1 Then Gosub Send1 Else Gosub Send0 End If rotate Daten , Right , 1 Waitms 500 Next A Goto Mainloop Send1: Portb.1 = 1 Waitms 500 Portb.1 = 0 Goto Mainloop Send0: Portb.1 = 0 Waitms 500 Portb.1 = 0 Goto Mainloop
Was ist da falsch programmiert?Code:$regfile = "m8def.dat" $crystal = 12000000 Dim A As Integer Dim Rxdaten As Byte Dim Zustand As Integer Config Portd = Input Config Portb = Output Zustand = Pind.2 Mainloop: For A = 1 To 8 If Rxdaten.0 = 0 Then Gosub Write0 Else Gosub Write1 End If rotate Rxdaten , Left , 1 Waitms 500 Next A Goto Mainloop Write1: Portb.5 = 1 Waitms 500 Portb.5 = 0 Goto Mainloop Write0: Portb.5 = 0 Waitms 500 Portb.5 = 0 Goto Mainloop
MfG,
ShadowPhoenix[/code]
Lesezeichen