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


von Luky (Gast)


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.
1
void USART_transmit(const uint8_t c, uint8_t AddrMode) {  
2
  while ( !( UCSR0A & (1<<UDRE0)) ) ;
3
4
  if(AddrMode) { //9. Bit High
5
    UCSR0B |= (1<<TXB80); //Bit Setzen
6
  } else {
7
    UCSR0B &= ~(1<<TXB80); //ruecksetzen
8
  }
9
    UDR0 = c;
10
} //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?

von STK500-Besitzer (Gast)


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?

von Luky (Gast)


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?

von STK500-Besitzer (Gast)


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?

von Luky (Gast)


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.

von Karl H. (kbuchegg)


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.

von Luky (Gast)


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...

von spess53 (Gast)


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

von Luky (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


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.

von spess53 (Gast)


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:
1
;----------------------------------------------------------------------------------------
2
USART_RXC:            push r16                   ; USART Rx Complete
3
                      in r16,SREG
4
                      push r16
5
                      push r17
6
7
                      lds r17,UCSR0B             ; Bit 8
8
                      lds r16,UDR0               ; Datenbyte
9
                      sbrs r17,RXB80             ; Bit8 = 1?
10
                      rjmp USART_RXC10           ; wenn Datenbyte
11
12
                      cpi r16,address            ; Adressvergleich
13
                      brne USART_RXC20
14
                      
15
                      lds r17,UCSR0A             ; wenn gültige Adresse
16
                      cbr r17,1<<MPCM0           ; Mastermode zurücksetzen
17
                      sts UCSR0A,r17
18
                      cbi PortC,0                ; Led ein
19
                      rjmp USART_RXC20
20
21
USART_RXC10:          sts data,r16               ; Byte speichern
22
                      ser r17
23
                      sts data_valid,r17         ; Flag setzen
24
25
USART_RXC20:          pop r17
26
                      pop r16
27
                      out SREG,r16
28
                      pop r16
29
                      reti
30
;----------------------------------------------------------------------------------------

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.