This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
lab3 [2013/11/26 16:48] dan.tudose created |
lab3 [2013/11/26 17:08] (current) dan.tudose |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Implementarea unui protocol de acces la mediu în rețele de senzori wireless ====== | ====== Implementarea unui protocol de acces la mediu în rețele de senzori wireless ====== | ||
+ | |||
+ | ===== Comunicatia intre noduri ===== | ||
+ | |||
+ | Compilati codul de mai jos si rulati pe doua noduri de adrese diferite: nodul cu adresa 1 este cel care trimite pachete iar al doilea (adresa diferita de 1) va receptiona pachetele trimise. Receptia va fi semnalata prin aprinderea led-ului de pe PB5 pe placa de extensie. | ||
+ | |||
+ | <code C> | ||
+ | #include < | ||
+ | #include < | ||
+ | #define F_CPU 16000000UL | ||
+ | #include < | ||
+ | |||
+ | #define TRX_FRAME_BUFFER(index) (*(volatile uint8_t *)(0x180 + (index))) | ||
+ | |||
+ | volatile uint8_t rxPayload; | ||
+ | |||
+ | uint8_t nod1_address __attribute__((section(" | ||
+ | uint8_t node_address __attribute__((section(" | ||
+ | |||
+ | |||
+ | void initLeds() | ||
+ | { | ||
+ | DDRB = 0xff; | ||
+ | PORTB = 0x00; | ||
+ | } | ||
+ | |||
+ | void setState(uint8_t state) | ||
+ | { | ||
+ | TRX_STATE = CMD_FORCE_TRX_OFF; | ||
+ | TRX_STATE = state; | ||
+ | while (state != TRX_STATUS_struct.trx_status); | ||
+ | } | ||
+ | |||
+ | // send a short frame with a magic payload | ||
+ | void sendFrame() | ||
+ | { | ||
+ | setState(CMD_PLL_ON); | ||
+ | |||
+ | TRX_FRAME_BUFFER(0) = 3; //length - minimum length is 3 | ||
+ | TRX_FRAME_BUFFER(1) = 0x00; | ||
+ | |||
+ | |||
+ | // start transmission | ||
+ | TRX_STATE = CMD_TX_START; | ||
+ | } | ||
+ | |||
+ | |||
+ | // upon receipt make a simple verification of correctness | ||
+ | ISR(TRX24_RX_END_vect) | ||
+ | { | ||
+ | rxPayload = TRX_FRAME_BUFFER(0); | ||
+ | if (rxPayload == 0) | ||
+ | PORTB ^= (1<< | ||
+ | setState(CMD_RX_ON); | ||
+ | } | ||
+ | |||
+ | void rfInit(void) | ||
+ | { | ||
+ | setState(CMD_TRX_OFF); | ||
+ | |||
+ | IRQ_STATUS = 0xff; | ||
+ | IRQ_MASK_struct.rx_end_en = 1; | ||
+ | sei(); | ||
+ | |||
+ | // | ||
+ | TRX_CTRL_2_struct.rx_safe_mode = 1; | ||
+ | } | ||
+ | |||
+ | int main() | ||
+ | { | ||
+ | rfInit(); | ||
+ | initLeds(); | ||
+ | |||
+ | while(1) | ||
+ | { | ||
+ | if (node_address == 1) | ||
+ | { | ||
+ | sendFrame(); | ||
+ | PORTB ^= (1<< | ||
+ | _delay_ms(3000); | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | PORTB &= ~(_BV(PB5)); | ||
+ | setState(CMD_RX_ON); | ||
+ | while (rxPayload != 0) asm(" | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return 0; | ||
+ | } | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
Nodurile vor urma un program comun de activitate wireless, vor transmite la început un broadcast pentru a obține informații de rutare apoi vor transmite un pachet de la un nod specificat către nodul desemnat base-station (nodul 0). | Nodurile vor urma un program comun de activitate wireless, vor transmite la început un broadcast pentru a obține informații de rutare apoi vor transmite un pachet de la un nod specificat către nodul desemnat base-station (nodul 0). |