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