AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
Firmware iDwaRF-Net

Description détaillée

Le logiciel iDwaRF-Net permet de porter le protocole WirelessUSB de Cypress sur le microcontrôleur AVR ATmega168. Le module iDwaRF-168, programmable à volonté, assume avec une égale facilité le rôle de concentrateur ou de capteur dans un réseau radio N:1 de capteurs. Il est facile d'inclure des fonctions propres à l'utilisateur.
WirelessUSB fonctionne dans la bande ISM 2,4 GHz. Chaque réseau radio WirelessUSB dispose d'un choix de 79 canaux.
Le protocole trouve toujours un canal libre, même avec un grand nombre d'appareils WirelessUSB utilisés simultanément. La transmission repose sur un processus DSSS (Direct Sequence Spread Spectrum) robuste, de sorte que la réception des données est encore assurée avec un taux d'erreur de 10%. Le protocole change automatiquement de canal en cas de perturbations récurrentes.
Semblable en cela à Bluetooth, WirelessUSB existe en version pour zone locale (LS) jusqu'à 10 m et en version à longue portée (LR) atteignant 50 m.
Le module iDwaRF-168 est basé sur cette dernière version.

wirelessUSB.png
Le réseau radio en étoile se compose d'un concentrateur et de plusieurs capteurs.
Un module iDwaRF programmé comme concentrateur (hub) forme le centre d'un réseau radio N:1 en étoile qui peut comporter un grand nombre de capteurs. Le concentrateur fonctionne en général sans interruption et est raccordé à un PC ou à un autre micro-contrôleur hôte par liaison sérielle.
Dans le cas d'applications simples, le module iDwaRF peut exécuter lui même des fonctions hôte spécifiques à l'utilisateur. Une unité capteur se compose d'un module iDwaRF programmé en conséquence et du capteur proprement dit.
L'oscillateur interne RC de l'AVR peut servir à diminuer la consommation. En outre, le module n'est actif que par intermittence (beacon time). Les transferts sont toujours déclenchés par le capteur et confi rmés par le concentrateur. Celui-ci peut aussi faire parvenir des données au capteur par le canal de retour (back channel).
Ce module reprends l'implémentation du firmware original en version 2.5 disponible sur le site de chip45.com (lui même dérivé de l'implémentation du DVK de CYPRESS) en lui ajoutant la possibilité de modifier certaines ressources utilisées comme le timer de temporisation ou la mémoire utilisé par le hub pour stocker les informations sur les capteurs et donc d'utiliser iDwaRF-Net sur d'autres cartes cibles que le module iDwaRF de chip45.com.

Graphe de collaboration de Firmware iDwaRF-Net:

Modules

 Capteur WirelessUSB iDwaRF
 
 Hub WirelessUSB iDwaRF
 

Structures de données

union  _MID
 

Fonctions

void avrSleep (void)
 Endormir le microcontrôleur pendant une tranche de temps de 125 ms. Cette fonction peut être appelée afin de placer le microcontrôleur en veille (mode Power-down) pendant une tranche de temps de 125 ms.
Le réveil est provoqué par une interruption du chien de grade.
 
void rfInit (void)
 Initialise toutes les ressources utilisées par le firmware iDwaRF. Plus de détails...
 
void rfProcessAll (void)
 Effectue toutes les tâches du firmware. Plus de détails...
 

Macros

#define IDWARF_BACKDATA_SIZE   16
 Nombre d'octets nécessaires pour stocker les informations d'un capteur. Plus de détails...
 
#define IDWARF_PAYLOAD_SIZE   (IDWARF_BACKDATA_SIZE - 7)
 Nombre maximum d'octets pouvant être transmis dans une trame WirelessUSB. Plus de détails...
 
#define IDWARF_SLEEP_TIME(__sec)   (U16)((__sec) / 125E-3)
 Convertir un temps en seconde en nombre de tranches de temps. Plus de détails...
 

Définitions de type

typedef int16_t I16
 Entier de 16 bits signé
 
typedef int32_t I32
 Entier de 32 bits signé
 
typedef int8_t I8
 Entier de 8 bits signé (octet)
 
typedef union _MID MID
 Identifiant fabricant d'une puce RF.
 
typedef uint16_t U16
 Entier de 16 bits non signé
 
typedef uint32_t U32
 Entier de 32 bits signé
 
typedef uint8_t U8
 Entier de 8 bits non signé (octet)
 

Énumérations

enum  PACKET_TYPES {
  BIND_REQUEST_PACKET = 0x00, BIND_RESPONSE_PACKET = 0x01, PING_PACKET = 0x02, ACK_PACKET = 0x03,
  FIXED_DATA_PACKET = 0x04, VARIABLE_DATA_PACKET = 0x05, NO_PACKET = 0xFF
}
 Type de paquets transmis sur le réseau. Plus de détails...
 
enum  PROTOCOL_STATUS {
  TX_SYNC_DATA = 0x01, BIND_ACK = 0x02, AUTO_BIND = 0x04, SEEDED_BIND = 0x08,
  NODE_BOUND = 0x10, BIND_ENABLED = 0x20, BIND_INIT = 0x40, BINDING = 0x80
}
 Drapeaux d'état du réseau.
 

Documentation des macros

#define IDWARF_BACKDATA_SIZE   16

Nombre d'octets nécessaires pour stocker les informations d'un capteur.

Ne pas être modifié < > car l'implémentation du DVK CYPRESS utilise le décalage de 4 rangs vers la droite ou la gauche au lieu de faire des divisions ou des multiplications par cette valeur.

Définition à la ligne 84 du fichier idwarf.h.

#define IDWARF_PAYLOAD_SIZE   (IDWARF_BACKDATA_SIZE - 7)

Nombre maximum d'octets pouvant être transmis dans une trame WirelessUSB.

7 octets sont nécessaires pour la gestion du capteur :

  • 4 octets pour le MID
  • 1 octet pour la longueur du payload
  • 1 octet de 8 bits d'état
  • 1 octet de 3 bits pour les flags de séquence et le single bit
Exemples:
idwarf/terminal/hub/terminal_hub.c.

Définition à la ligne 96 du fichier idwarf.h.

#define IDWARF_SLEEP_TIME (   __sec)    (U16)((__sec) / 125E-3)

Convertir un temps en seconde en nombre de tranches de temps.

Paramètres
__secNombre de secondes à convertir (peut être un nombre réel)
Renvoie
le nombre de tranche de temps (valeur tronquée)

Définition à la ligne 104 du fichier idwarf.h.

Documentation du type de l'énumération

Type de paquets transmis sur le réseau.

Valeurs énumérées
FIXED_DATA_PACKET 

Data packet of fixed length as defined by SIZE_OF_FIXED_DATA_PACKET

VARIABLE_DATA_PACKET 

Data packet of variable length

Définition à la ligne 67 du fichier iprotocol.h.

68 {
69  BIND_REQUEST_PACKET = 0x00,
70  BIND_RESPONSE_PACKET = 0x01,
71  PING_PACKET = 0x02,
72  ACK_PACKET = 0x03,
73  FIXED_DATA_PACKET = 0x04,
74  VARIABLE_DATA_PACKET = 0x05,
75  NO_PACKET = 0xFF
76 } PACKET_TYPES;
PACKET_TYPES
Type de paquets transmis sur le réseau.
Definition: iprotocol.h:67

Documentation des fonctions

void rfInit ( void  )

Initialise toutes les ressources utilisées par le firmware iDwaRF.

Dans la version ATmega168/328 (iDwaRF Node), les ressources utilisées sont les suivantes :

  • TIMER0 :
    Utilisé pour les temporisations. Programé sous interruption de débordement avec prédivision par 64. Un préchargement de TCNT0 à 0x8D avec un quartz de 7372800 Hz donne une période de déclenchement de l'interruption de 1 ms.
  • SPI :
    Utilisé en mode master FCLK = F_CPU/4, sans interruption.
  • WATCHDOG :
    Utilisé en interruption pour le réveil du mode Power-Down (125 ms)
Broches utilisées
Broche Fonction Sens
INT0 IRQ In
PC0 /PD Out
PC1 /RESET Out
PB2 /SS Out
PB3 MOSI Out
PB4 MISO In
PB5 SCK Out
Avertissement
Cette fonction appelle sei() afin de valider les interruptions.
Exemples:
idwarf/terminal/hub/terminal_hub.c, idwarf/terminal/sensor/terminal_sensor.c, idwarf/tutorial/hub/tutorial_hub.c, et idwarf/tutorial/sensor/tutorial_sensor.c.
void rfProcessAll ( void  )

Effectue toutes les tâches du firmware.

Cette fonction effectue toutes les tâches nécessaires au fonctionnement du firmware.
Pour le hub :

  • choix du canal utilisé par le réseau et changement en cas de brouillage
  • processus d'intégration ou d'exclusion des capteurs (BIND)
  • réception et envoi des informations aux capteurs

Pour le capteur :

  • Intégration du réseau au démarrage et en cas de changement de canal.
  • réception et envoi des informations au hub
  • Endormissement et reveil.

Cette fonction doit être appellée à chaque itération de la boucle infinie du programme principal.

Exemples:
idwarf/terminal/hub/terminal_hub.c, idwarf/terminal/sensor/terminal_sensor.c, idwarf/tutorial/hub/tutorial_hub.c, et idwarf/tutorial/sensor/tutorial_sensor.c.