hat jemand evtl. einen beispielcode für sender und empfänger?
Druckbare Version
hat jemand evtl. einen beispielcode für sender und empfänger?
für was? TWI SPI UART ??
für UART.
und gleich noch eine Frage. Wartet der Sender beim verschicken eines Bytes per UART irgendwie auf eine Antwort? Ich frage weil ich nur die Sendeleitung nutzen will und keine Rückleitung (damit mehrere Empfänger auf dasselbe Signal hören).
nein, der sendet eine fallende flanke( das startbit), dann 8 datenbits(falls es so eingestellt ist) und ein stopbit(falls so eingestellt)
wenn der empfänger das byte nur zu hälfte empfang merkt der sender davon garnichts
Ich habe auch so eine ähnliche Konfiguration.
Bei mir sendet ein Atmega8 an 7 andere Atmega8.
Ich habe einen RS485-Bus verwendet, da dieser am Störunanfällisten ist.
Ich verwende einfachen Klingeldraht über Distanzen bis zu ca. 30m
ohne Probleme.
Und Timing-Probleme gibts auch nicht ; es sendet doch in deinem Fall nur der
Master; und der weiss doch wohl, wenn der Bus benutzt wird. !!!
Als Ankopplung an den Bus verwende ich MAX485 im Halpduplexbetrieb.
Gruß
halbrichtig hellraider, woher wissen deine slaves, dass die daten auf dem bus vom master tammen und nicht von nem anderen slave ;) ich hab das wie gesagt mit ner "slave talk enabled" leitung und ein klein wneig timing gelöst, mit 1MBaud und maximaler verzögerung durch programmlogik(empfang ist interruptgesteuert, verarbeitung sequentiell im programm eingebaut) hab cih ne reaktionszeit von ca 15-20 µS
Also mein Projekt ist noch nicht ganz fertig aber funktioniert soweit:
Der Sender startet eine Anfrage an den entsprechenden Slave.
Also wenn der MASTER von Slave1 den Strom wissen will sieht das so aus:
Print "#S1,Strom"
__________________________________________________ __________
Der Empfang ist etwas aufwändiger:
zuerst wird nachgesehen ob die empfangene Nachricht auch für diesen slave ist. Als nächstes wird nachgesehen was der Master wisssen will: zb. Strom. Dann wird gesendet: von (Slave1) was (Strom) und natürlich der Wert, der ja die eigentliche Anfrage ist ;-) Da das Programm noch im test ist wird alles auf LCD ausgegeben also nicht verwirren lassen. Zur Reichweite kann ich noch nichts sagen. zur Zeit habe ich fliegnde verdrahtung mit 1m klingeldraht und die µC direkt verbunden also auf 5V Pegel und ein Max232 zur kontrolle am PC.
Der Master hat natürlich auch eine so ähnliche Empfangsprogrammierung - logisch sonst könnte er ja die eigene Anfrage an den Slave nicht empfangen.Code:
Main:
'auf Empfang reagieren:
If E_flag = 4 Then 'Empfangsstring komplett
If Slave = "S1" Then 'wenn Daten für Slave1
Select Case Parameter
Case "Strom" : Print "#S1,Strom:" ; Strom
Locate 1 , 1
Lcd "S..." ; Slave ; "," ; Parameter ; ":" ; Strom
Case "Volt" : Print "#S1,Volt:" ; Volt
Locate 1 , 1
Lcd "S..." ; Slave ; "," ; Parameter ; ":" ; Volt
Case Else : Print "Err."
End Select
End If
'Daten auf jedenfall löschen
Slave = "" 'Slave löschen
Parameter = "" 'Parameter löschen
Wert = "" 'Wert löschen
E_flag = 0 'Empfang neu setzen
End If
goto Main
'_________
Onrxd:
E_byte = Udr
Select Case E_byte
Case 35 : E_flag = 1 '"#" = Slave wird gesendet
Case 44 : E_flag = 2 '"," = Parameter kommt
Case 58 : E_flag = 3 '":" =
Case 13 : E_flag = 4 '"ENTER" = Empfang komplett
Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte)
If E_flag = 2 Then Parameter = Parameter + Chr(e_byte)
If E_flag = 3 Then Wert = Wert + Chr(e_byte)
End Select
Das meiste davon kannst du ja weglassen, da du ja nur in eine Richtung senden möchtest
viel Erfolg,
Tobias