jaja, kleine Ursache ....
Druckbare Version
jaja, kleine Ursache ....
Ich habe mir jetzt den reduzierten Code angesehen und versucht zu verstehen was da genau vorsich geht. Arbeite zum ersten mal mit RS-485.
Ich würde den hier gezeigten Code gerne so modifizieren, dass 3 verschiedene Bits übertragen werden. Ich habe einen Sender und einen Empfänger und möchte am Empfänger 3 Relais schalten.
Also z.B. Bit A,B,C
Jedes steht für den Zustand von einem Relais.
Ich muß dam im Sende und Empfangsprogramm A,B und C als Bit dimensionieren. Richtig?
Mit Printbin A sende ich das Bit A dann vom Sender zum Empfänger.
und wie empfange ich es dann?
A = UDR?
Falls jemand einige Zeilen hat damit ich das verstehe wäre ich sehr dankbar.
das kommt immer drauf an, was du genau möchtest.
ist es nur ne simplexverbindung und es macht nix
wenn auch mal n falsches relais anzieht
gehts am einfachsten.
senden mit udr=zustaende,
empfangen mit zustaende=udr
ist aber was "wichtiges" dran, sodass fehlschaltungen
unbedingt unterbunden sein müssen brauchts ne
prüfsumme um die korrekte übermittlung zu checken.
nur, woher weiß der controller, das das übertragene
byte kein datenbyte ist, sondern ne prüfsumme
und auch so behandelt werden muss ...
es gibt auch da mehrere wege.
zum einen kann man auch mit der 9-bit-uart arbeiten
und das neunte bit als marker verwenden
oder man bastelt sich n protokoll, das definierte
startzeichen, endzeichen und/oder definierte paketlängen
hat.
soll der bus um zusätzliche mitglieder erweitert werden
brauchts noch mindestens ne empfängeradresse.
dann hätten wir schon mindestens 2 bytes zu übertragen,
so in etwa 1.byte mit 9 bit, paketstart, zweites byte empfänger.
sinnigerweise währen aber 3 byte, also start, empfänger, anweisung.
das währ dann bei 8-bit-uart. bei 9-bit kann man sich das erste byte
wieder schenken, weil da das 9. bit als startzeichen herhalten kann,
als erstes zeichen 8-bit empfänger, neuntes bit ist paketstart.
zweites zeichen, ist dann 8-bit, ist dann die anweisung.
bei wichtiger fehlerlosigkeit käme dann noch die entsprechende
prüfsumme als byte mit hinten dran.
das kann man dann noch ausbauen mit zeichenzähler für datenpakete
unterschiedlicher länge, mit endzeichen usw. usw.
ein recht komplexes protokoll findest du z.b.
unter https://www.roboternetz.de/phpBB2/fi...tabellev12.pdf
beschrieben
es sind dir da schon viele möglichkeiten gegeben, was du brauchst
weißt nur du alleine.
Kann man die Sicherheit auch erhöhen wenn jedes Bit z.B. 5 mal hintereinander empfangen werden muß damit das richtige Relais anspricht? Die Geschwindigkeit ist in meinem Fall total unkritisch. Selbst wenn es 500msec dauert bis am Empfänger etwas passiert wäre das egal.
Das mit UDR verstehe ich leider total nicht :-(
Hat jemand für mich einige Zeilen Code damit ich verstehe was da passiert?
Danke für eure Hilfe.
also,
das UDR ist nur n Register, ne Speicherzelle könnte man sagen,
die genau ein Byte fasst.
Bevor man es verwendet muss man aber erst die
UART, also die serielle Schnittstelle konfigurieren.
Üblicherweise ist die Konfiguration
z.B. 19200,8,n,1
19200 ist die Baudrate, also die Übertragungsgeschwindigkeit
8 ist die Paketlänge, also 8 BIT, nicht Byte, also 1 Byte
n steht für "no parity" also kein Paritätsbit
1 steht für ein Stopbit.
ist die UART konfiguriert stellt sie verschiedene Flags
Interrupts und Register bereit, die man verwenden
kann.
Da gibts z.B. das RXC also das receive complete Flag,
es zeigt an, dass ein Zeichen ganz empfangen wurde.
Es kann auch ein entsprechender Interrupt ausgelöst
werden, das währe dann der URXC-Interrupt.
Äquivalent gibts das auch zum Senden,
da nennt sich das dann TXC, also Sendeübertragung complete-Flag
und UTXC also Zeichen gesendet Interrupt.
Wird nun ein Zeichen empfangen wird dies in der
UDR-Speicherstelle abgelegt und kann dort dann ausgelesen
werden. Die Anweisung währe dann:
beliebige_variable = UDR
Zum Senden schreibt man einfach ein Zeichen, also ein
Byte in das gleiche Register, also:
UDR=beliebiges_byte
das wars auch schon.