Ich versuche gerade mit dem Multi-processor Communication Mode
herumzuspielen.
Leider habe ich damit einige Probleme mit der Konfiguration...
Ich will jeweils 8 Datenbits + Adressbit übertragen. Also am Master-AVR
9Bit USART-Modus, das letzte Bit liegt dann in UCSR0B und wird gesetzt,
wenn ich eine Adresse übertragen will.
Muss ich bei den Slave-AVRs den 8Bit Modus einstellen oder den mit 9
Bit?
Da diese eigendlich nur Ardressinfos bekommen und keine Daten vom Master
(Slave senden nur Daten nach Aufforderung zum Master) kann ich das MPCM0
Bit in UCSR0A ständig gesetzt halten und die Slaves stören sich nicht
untereinander wenn ein anderer gerade Daten an den master überträgt, da
bei diesen ja das Addressflag nicht gesetzt ist.
Oder sehe ich da etwas falsch?
>Muss ich bei den Slave-AVRs den 8Bit Modus einstellen oder den mit 9>Bit?
Wenn 9 Bit übertragen werden, sind 8 empfangene wohl zu wenig...
>Da diese eigendlich nur Ardressinfos bekommen und keine Daten vom Master>(Slave senden nur Daten nach Aufforderung zum Master) kann ich das MPCM0>Bit in UCSR0A ständig gesetzt halten und die Slaves stören sich nicht>untereinander wenn ein anderer gerade Daten an den master überträgt, da>bei diesen ja das Addressflag nicht gesetzt ist.>Oder sehe ich da etwas falsch?
Warum brauchst du dann 9 Bit?
Mit dem 9.Bit unterscheidet man zwischen Adresse und Daten.
Wo ist jetzt dein Problem?
Also mein Problem ist dass ich das 9. Bit im Master ja manuell setzen
muss, also muss dieser im 9 Bit Modus betrieben werden, oder?
Der Slave entscheidet aufgrund des 9. Bits ob er angesprochen wurde
(automatisch), empfängt aber nur 8 Bit an Daten. Also wie muss dieser
konfiguriert werden?
In Verbindung mit Parity funktioniert der Modus leider nicht, oder habe
ich da etwas übersehen?
>Der Slave entscheidet aufgrund des 9. Bits ob er angesprochen wurde>(automatisch), empfängt aber nur 8 Bit an Daten. Also wie muss dieser>konfiguriert werden?
Den Slave muss man auch für die Multicontroller-Kommunikation
konfigurieren, weil er sonst ein Bit zu viel gfeschickt bekommt, das zu
einem Fehler führen kann.
Von welchem Controller redest du denn eigentlich?
Ich habe ATmega48 als Slave und einen 168er als Master.
Alle sind jetzt auf 9Bit Modus mit 1 Stopbit eingestellt, die
Übertragung funktioniert aber nicht.
Luky schrieb:
> Der Slave entscheidet aufgrund des 9. Bits ob er angesprochen wurde> (automatisch),
kann es sein, dass du hier falsche Vorstellungen hast?
Vorneweg: Ich habe den MPCM noch nie benutzt. Aber nach dem was ich im
Mega16 Datenblatt nachgelesen habe funktioniert das so:
Der Master sendet 9 Bit raus. Bei Adressen ist das 9. Bit gesetzt.
Soweit hast du das noch richtig.
Bei den Slaves ist das so:
zunächst mal ignorieren die alle Bytes, bei denen das 9. Bit nicht
gesetzt ist. Das erledigt das MPCM Flag.
Ist das 9. Bit aber gesetzt, dann meldet sich beim Slave die UART ganz
normal mit: Ich habe ein Byte empfangen (RXC wird gesetzt).
Es liegt jetzt am Programm, sich aus dem UDR das Byte rauszuholen (das
in diesem Fall nur eine SLave-Adresse sein kann) und mit der eigenenn
Adresse zu vergleichen (die der Slave irgendwo her hat: EEPROM,
Mäuseklavier, was auch immer). Stimmen sie überein, dann löscht der
Slave das MPCM Flag und schaltet damit sozusagen die UART für normalen
Empfang frei.
Jetzt rauschen die Daten bei diesem einen Slave rein. Alle anderen
Slaves ignorieren diese Daten, da ja ihr MPCM Flag nach wie vor gesetzt
ist.
Irgendwann ist die Datenübertragung abgeschlossen, der angesprochene
Slave setzt wieder sein MPCM Flag und schaltet sich somit selbst auch
wieder in den Modus, in dem sich die UART erst dann rührt, wenn das
nächste Adressbyte eintrudelt.
Automatisch entscheidet ein Slave da gar nichts. Das einzige was
passiert ist, dass die übertragenen Bytes eine Art Kennung besitzen (das
9. Bit), welches alle UART kurzzeitig hellhörig werden lässt und das
zugehörige Programm muss dann entscheiden, ob es etwas aufgrund dieses
Bytes etwas machen will oder nicht.
Ich habe es ja genauso verstanden und auch versucht zu beschreiben. Nur
dass ich das MPCM-Bit immer gesetzt lasse, da der Master dem Slave nur
seine Adresse schickt. Der angesprochene Slave sendet dann viele Daten
an den Master. Diese werden von den anderen Slaves aber ignoriert, da
das 9. Bit dort nicht gesetzt ist.
Meine Frage ist aber wie ich es konfigurieren muss, da es bei mir leider
noch Probleme gibt...
Hi
>Meine Frage ist aber wie ich es konfigurieren muss, da es bei mir leider>noch Probleme gibt...
Was ist denn nun unklar? Alle Controller werden im 9-Bit Mode
initialisiert. Das MPCM-Bit wird nur bei den Slaves gesetzt. Ausserdem
muss für jeden Slave eine eigene Adresse vorhanden sein. Um einen Slave
anzusprechen sendet der Master die Adresse mit gesetztem 9.Bit. Alle
Slaves vergleichen die Adresse mit der eigenen. Der Slave dessen Adresse
übereinstimmt setzt das MPCM-Bit zurück. Damit ist die normale
Kommunikation zwischen Master und Slave möglich (Bit8 = 0). Wenn die
Kommunikation beendet ist, setzt der Slave das MPCM-Bit wieder.
Wenn du mit Assembler klar kommst, könnte ich dir mal ein Beispiel
(Master/Slave) anhängen.
MfG Spess
>Muss der Slave das MCPM-Bit auch rücksetzen wenn ihm der Master keine>Daten schickt?
Nein, aber wenn der Slave Daten an den Master schickt.
Wenn das Bit gesetzt während der Datenübertragung ist, könnten andere
Slaves es als Adresse erkennen und selber senden wollen.
Wenn der Master die Adresse auf den Bus gelegt hat, und nur auf Daten
wartet, muss er auch das MCPM-Bit löschen, um die Daten zu empfangen.
Im Prinzip ist jeder Controller auf dem Bus der Master, sobald er Daten
verschickt, sofern der Bus bidirektional wie z.B. 2wire-RS485 ist.
Wenn man vom Master die TXD-Leitung an die RXD der Slaves verteilt und
deren TXD-Leitungen (Achtung! Tristate-Ausgänge nutzen!) zusammen
schaltet und an die RXD-Leitung des Masters anbindet, dann gibt es nur
einen echten Master.
Der Master könnte natürlich auch so konfiguriert werden, dass er
grundsätzlich 9 Bits sendet und empfängt...
In dem Fall wäre die Software in den Slaves sogar etwas aufwändiger als
im Master.
Hi
>Nein, aber wenn der Slave Daten an den Master schickt.>Wenn das Bit gesetzt während der Datenübertragung ist, könnten andere>Slaves es als Adresse erkennen und selber senden wollen.
Das verwechselt du mit dem 9.Datenbit. Das muss 0 sein. Das MCPM-Bit
bewirkt, das der RXC-Interrupt nur bei gesetztem 9.Datenbit ausgelöst
wird. Nimmt also nicht an der Kommunikation teil.
>Der Master könnte natürlich auch so konfiguriert werden, dass er>grundsätzlich 9 Bits sendet und empfängt...
Master und Slave werden mit 9 Bit initialisiert und bleiben es auch. Der
Master setzt lediglich bei der Adressierung das 9.Bit auf 1. Daten
werden von Master und Slave mit gelöschtem 9.Bit gesendet.
>In dem Fall wäre die Software in den Slaves sogar etwas aufwändiger als>im Master.
Du musst lediglich das 9.Bit auswerten um zwischen Adresse und Datenbyte
zu unterscheiden.
Sieht bei mir so aus: