Modul XBee je nastaven pro komunikaci typu Peer-to-peer a data se
přenáší pomocí sériové komunikace UART, kde piny DI a DO jsou Rx a Tx
(dle připojeného zařízení)
Inicializace
UART
viz. příklad pro komunikaci RS232
Řešení
#define F_CPU
16000000UL
#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile unsigned char prerus=0;
volatile unsigned char LED=255;
char tempstr[12],znak;
char BTN=255;
char BTN-new=255;
//*******************************************************************************************
// MOJE UPRAVY
//-------------------------------------------------------------------------------------------
//
#define setb(port,pin) port |=
1<<pin //nastav bit
#define clrb(port,pin) port &= ~(1<<pin)
//nuluj bit
#define negb(port,pin) port ^=
1<<pin //neguj bit
//*******************************************************************************************
//UART ATmega 128
//*******************************************************************************************
// Funkce pro UART:
void init_uart (unsigned int
baud); //inicializace
UART
unsigned char u_getc( void
);
//přijmi znak z UART
void u_putc( char data
);
//napiš znak do UART
void u_puts( char *text
);
//napiš string do UART
// UART pošli znak:
void u_putc( char data )
{
while ( !( UCSR0A & (1<<UDRE)) ) //
Wait for empty transmit buffer
;
UDR0 =
data;
// Put data into buffer, sends the data
}
// UART pošli string:
void u_puts( char *text )
{
unsigned char i=0,temp;
do
{
temp = text[i];
if(temp==0) break;
u_putc(temp);
i++;
}
while(temp>0);
}
// UART přijmi znak:
unsigned char u_getc( void )
{
while ( !(UCSR0A & (1<<RXC))
) // Wait for data to be received
;
return
UDR0;
// Get and return received data from buffer
}
// u_puts(tempstr);
//
u_puts("\r\n");
// odřádkuj
// Inicializace na 9600 pro 16MHZ
/*
UCSR0A=0x00;
UCSR0B=0x18;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x67;
char tempstr[12],znak;
*/
//******************************************************************************************
ISR(USART0_RX_vect)
{
prerus=1;
LED = UDR0;
}
void main(void)
{
// Inicializace UART na 9600 pro 16MHZ
UCSR0A=0x00;
//UCSR0B=0x18; bez preruseni
UCSR0B=0x98;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x67;
DDRB=0xFF; // vystupní - Ledky
DDRD=0x00; // vstupní - Tlacitka
PORTB=0; //
zablikani na zacatku
_delay_ms(50);
PORTB=255;
_delay_ms(50);
PORTB=0;
_delay_ms(50);
PORTB=255;
_delay_ms(50);
sei();
while (1)
{
if (prerus==1)
{
PORTB=LED;
}
BTN=PIND;
if (BTN!=BTN_new)
{
BTN_new=BTN
u_puts(BTN);
}
};
}