Forum: Compiler & IDEs MPCM Problem


von Peter P. (jre)


Lesenswert?

Hallo

Ich möchte gerne den MPCM Modus der uRechner nutzen
Als Master setzte ich den Atmega 644P20PU ein, als Slave einen Atmega32

Ich lasse mir in der Interrupt schleife des Slaves sofort das UDR und 
das UCSRB zurück schicken. Der Master leitet die Empfangenen daten 
sofart an den anderen UART um, wo ich sie mit dem PC empfangen kann

Es ist nur ein Slave angeschlossen.
Ist im Slave das MPCM Bit gesetzt, dann empfängt er nur Daten, bei denen 
das RX8 == 1 ist. Wie erwartet

Der Master Empfängt nur Daten, bei denen im UCSRB auch das RX8 gesetzt 
ist.
Den MPCM Modus schalte ich nie um.

Die am PC Empfangenen Daten sehen dann immer so aus:
HEX: 01,9E
HEX: 02,9E

Wenn ich jetzt am Slave den MPCM Modus abschalte, so das wieder alle 
Daten empfangen werden, sieht das ganze so aus:

HEX: 01, 9E (richtig)
HEX: 02, 9E (richtig)
HEX: 22, 9E (falsch) Hier müsste 9C stehen
HEX: 22, 9C (richtig)
HEX: 22, 9C (richtig)
HEX: 22, 9C (richtig)
HEX: 01, 9C (falsch) Hier müsste 9E stehen
HEX: 22, 9E (falsch) Hier müsste 9C stehen
HEX: 22, 9C (richtig)
HEX: 22, 9C (richtig)
HEX: 22, 9C (richtig)

Wie man sieht kommt das 9. Bit nicht mit den Daten zusammen, mit denen 
es kommen soll. Am Master habe ich zwischen beiden Versuchen nichts 
geändert.

Hier sind die Funktionen des Masters
1
void USART0_send_Byte(uint8_t byte)
2
{
3
  while(!( UCSR0A & (1<<UDRE0))); //warten auf Datenregister empty;
4
  UDR0= byte;
5
}
1
void USART0_send_Adresse(uint8_t slave_address)
2
{
3
    /* Wait for empty transmit buffer */
4
    while ( !( UCSR0A & (1<<UDRE0)) );      //warten bis senden möglich
5
    sbi(UCSR0B,TXB80);                //TXB8=1: Adresse senden   
6
    UDR0 = slave_address;
7
  //while ( !( UCSR0A & (1<<TXC0)) );      //warten bis Übertragung erfolgt ist
8
    UCSR0A |=(1<<TXC0);  
9
  cbi(UCSR0B,TXB80);
10
}
1
    ibi(PORTB,0);
2
    USART0_send_Byte(0x22);
3
    _delay_ms(2000);
4
    ibi(PORTB,0);
5
    USART0_send_Byte(0x22);
6
    _delay_ms(2000);
7
    ibi(PORTB,0);
8
    USART0_send_Byte(0x22);
9
    _delay_ms(2000);
10
    ibi(PORTB,0);
11
12
    ibi(PORTB,1);
13
    USART0_send_Adresse(1);
14
    _delay_ms(2000);
15
    ibi(PORTB,1);
16
    USART0_send_Byte(0x22);
17
    _delay_ms(2000);
18
    ibi(PORTB,1);
19
    USART0_send_Byte(0x22);
20
    _delay_ms(2000);
21
    ibi(PORTB,1);
22
    USART0_send_Byte(0x22);
23
    _delay_ms(2000);
24
    ibi(PORTB,1);
25
26
    ibi(PORTB,2);
27
    USART0_send_Adresse(2);
28
    _delay_ms(2000);
29
    ibi(PORTB,2);
30
    USART0_send_Byte(0x22);
31
    _delay_ms(2000);
32
    ibi(PORTB,2);
33
    USART0_send_Byte(0x22);
34
    _delay_ms(2000);
35
    ibi(PORTB,2);
36
    USART0_send_Byte(0x22);
37
    _delay_ms(2000);
38
    ibi(PORTB,2);

von Peter P. (jre)


Lesenswert?

Unglaublich!

Jetzt beim schreiben des Beitrages ist mir noch eine Idee gekommen die 
den Fehler tatsächlich verursacht hat.

In der RXC ISR vom Slave muss zuerst das UCSRB register gesichter 
werden, bevor das UDR register ausgelesen wird.

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.