mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Multi-processor Communication Mode AVR


Autor: Luky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.
void USART_transmit(const uint8_t c, uint8_t AddrMode) {  
  while ( !( UCSR0A & (1<<UDRE0)) ) ;

  if(AddrMode) { //9. Bit High
    UCSR0B |= (1<<TXB80); //Bit Setzen
  } else {
    UCSR0B &= ~(1<<TXB80); //ruecksetzen
  }
    UDR0 = c;
} //USART_transmit
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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: Luky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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?

Autor: Luky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Luky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Luky (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muss der Slave das MCPM-Bit auch rücksetzen wenn ihm der Master keine 
Daten schickt?

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
;----------------------------------------------------------------------------------------
USART_RXC:            push r16                   ; USART Rx Complete
                      in r16,SREG
                      push r16
                      push r17

                      lds r17,UCSR0B             ; Bit 8
                      lds r16,UDR0               ; Datenbyte
                      sbrs r17,RXB80             ; Bit8 = 1?
                      rjmp USART_RXC10           ; wenn Datenbyte

                      cpi r16,address            ; Adressvergleich
                      brne USART_RXC20
                      
                      lds r17,UCSR0A             ; wenn gültige Adresse
                      cbr r17,1<<MPCM0           ; Mastermode zurücksetzen
                      sts UCSR0A,r17
                      cbi PortC,0                ; Led ein
                      rjmp USART_RXC20

USART_RXC10:          sts data,r16               ; Byte speichern
                      ser r17
                      sts data_valid,r17         ; Flag setzen

USART_RXC20:          pop r17
                      pop r16
                      out SREG,r16
                      pop r16
                      reti
;----------------------------------------------------------------------------------------

MfG Spess

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.