Rádiové moduly ZigBee

Seznámení s principem rádiové komunikace.

Řešené příklady
- bezdrátová komunikace mezi dvěma moduly

Zadání

- Ovládejte LED diody připojené na kitu 1 pomocí  tlačítek připojených na kitu 2 a zároveň pomocí tlačítek na kitu 1 ovládejte LED na kitu 2. Vysílejte signál jen když nastane změna stavu tlačítek.

Nápověda

Ovládání modulu XBee
XBee.jpg xbee_TxRx.png

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

xbee_RS232.png
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);  

    }

      };
}