USART nastavení bitu MPCM, viceprocesorová komunikace

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
miras12
Příspěvky: 12
Registrován: 08 lis 2009, 01:00

USART nastavení bitu MPCM, viceprocesorová komunikace

#1 Příspěvek od miras12 »

Dobrý den

Mám uC , který je MASTER a uC který je SLAVE. MASTER má poslat datový rámec s nastaveným bitem TXB8 (devátý bit , který informuje zda se jedná o adresní rámec ) a SLAVE by měl podle toho zda-li je TXB8 nastaven přijmout tento rámec, respektive vyvolat příznak přerušení od příjmu. Problém je v tom , že SLAVE příjme datový rámec (vyvolá přerušení) i v případě , že není nastaven bit TXB8. Z datasheetu jsem pochopil, že není potřeba identifikovat 9 bit RXB8 u SLAVE , že toto je obstaráno jednotkou USART. Níže je uveden program pro SLAVE a MASTER.

/////////////////////////////////////////////SLAVE//////////////////////////////////
void USARTInit(uint16_t ubrr_value)
{
//nastavení přenosové rychlosti
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);

UCSRC=(1<<URSEL)|(3<<UCSZ0); //nastavení délky znaku rámce na 9, pomoci UCSZ=7,1stop bit,bez parity, asynchronní mód

UCSRB=(1<<UCSZ2|1<<RXEN)|(1<<TXEN)|(1<<RXCIE);//povolení přijímače ,vysílače a přerušení od příjmu
UCSRA|=1<<MPCM; //povolení viceprocesorové komunikace
}

ISR(USART_RXC_vect) // obsluha přerušení od příjmu
{

PORTC=UDR; //zobrazení na PORTC
}

void main()
{
USARTInit(200); //inicializace USART

while(1)
{
DDRC=0x3f; // nastavení prvních 6-ti bitů PORTC jako výstupních
sei(); // povolení globálního přerušení
}
}

/////////////////////////////////////////////MASTER/////////////////////////////////////
void USARTInit(uint16_t ubrr_value)
{
// stejné nastavení jako u SLAVE, jenom není povoleno přerušení od příjmu
UBRRL = ubrr_value;
UBRRH = (ubrr_value>>8);
UCSRC=(1<<URSEL)|(3<<UCSZ0);
UCSRB=(1<<UCSZ2|1<<RXEN)|(1<<TXEN);
UCSRA|=1<<MPCM;
}

char posli(char data) // funkce pro vysílání dat
{
while(!(UCSRA & (1<<UDRE)));
UDR=data;
return(0);
}

void main()
{
USARTInit(200); //inicializace USART

while(1)
{
UCSRB|=1<<TXB8; // nastavení 9 bitu, při nastavení by mělo dojít k příjmu na straně SLAVE
posli(48); // vyšle hodnotu 48
}
}

Díky za rady

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#2 Příspěvek od AB1 »

Multiprocesorová komunikace probíhá např. takto:

Každý slave má adresu kterou mu určíme.
Master vyšle adresu s nastaveným devátým bitem.
Pak vysílá data (paket) s devátým bitem vynulovaným.

Slave po příjmu každého bajtu testuje devátý bit.
Pokud je bit9 nastavený a přijatý bajt je jeho adresa, začne přijímat data.
Pokud je bit9 nastavený a přijatý bajt není jeho adresa, přestane přijímat data.

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“