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);
|