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