Programmation microcontrolée Zigbee

Fermé
Pocamulan - 29 avril 2009 à 15:50
 dgidgis - 1 oct. 2009 à 10:51
Bonjour,
Je dois réaliser un programme en C avec le logiciel Silicon Laboratory, ce programme doit faire communiquer via le sans fil deux module Zigbee entre eux équiper d'antenne. On ma fourni un code déjà existant mais j'ai du mal à en comprendre le fonctionnement. Si quelqu'un pourrais m'aider à déchiffrer tout ça, ca m'aiderais enormement. Alors si vous êtes plutot doué dans la programmation de ce genre dite le moi je vous transmettrer le code qui me bloque.

Merci à tous
A voir également:

4 réponses

J'ai déjà commencer à le commenter voilà ce que ca donne :

//SPI-RS232
#include <c8051F120.h>

#define SYSCLK 24900000 //definition de l'horloge

/********************************************DEFINITION DES PORTS***************************************/
sfr16 RCAP2 = 0xCA;
sfr16 TMR2 = 0xCC;

sbit MOSI = P0^4; //sortie du CC2420
sbit MISO = P0^3; //entree du CC2420
sbit SCK = P0^2; //horloge fournie au CC2420
sbit NSS = P0^5; //signal d'activation
sbit RESET = P1^6; //reset du CC2420
sbit VREGEN = P1^7; //fixe un niveau de tension
sbit SFD = P1^0; //reception

sbit BP = P3^0; //definition du bouton1 sur port3
sbit BP2 = P3^1; // " " du bouton2 " "
sbit LED = P1^1; //definition de la led sur port 1
sbit LEDTX = P2^0; // " " de la led pour TX sur port2
sbit LEDRX = P2^1; // " " de la led pour RX " "
sbit LEDCX = P2^7; // " " de la led pour CX " "


/*****************************************DECLARATION SOUS PROGRAMME*************************************/
void UART_ISR(void);
void Test_uart();
void wait_ms (int ms); //temporisation en ms
void UART_TX_RX ();
void fiche();
void vaccin();
void RF_RX();
void RF_TX(char RF);
void Test_RF();
void SPI_Transfer (char SPI_byte);
void SPI_TX_RX (char a,char b,char c,char d);
void ecriture_registre_hf();
void lecture_registre_hf();

/**************************************DECLARATION VARIABLE********************************************/
unsigned char ch;
unsigned char SPI_read;
unsigned char SPI1;
unsigned char SPI2;
unsigned char SPI3;
unsigned char UART[50];

int ts;
int trf;
int rf;
int u;
int z;

/*********************************INITIALISATION*************************************/
void Init_Device(void)
{
WDTCN = 0xDE; //Watchdog Timer Control Register (désactivé)
WDTCN = 0xAD;

SFRPAGE = TIMER01_PAGE; //Timer 1 UART0
TCON = 0x40; //Timer Control Register (timer1 active)
TMOD = 0x20; //Timer Mode Register (mode 8bits counter/timer with auto-reload)
CKCON = 0x10; //Clock Control Register (timer1 utilise clock)
TH1 = 0xF9; //Timer 1 High Byte

SFRPAGE = UART0_PAGE; //UART0
SCON0 = 0x50; //UART0 Control Register (mode 8bits UART/variable baud rate + mode reception)

SFRPAGE = CONFIG_PAGE;
OSCICN = 0x83; //Oscillateur interne 24,5MHz

XBR0 = 0x04; //Pin UART0
XBR2 = 0x40; //CrossBar
//Config PORT PUSH-PULL
P0MDOUT = 0x35; //Port0 Output (pin 0,2,4,5 mode push pull)
P1MDOUT = 0xC2; //Port1 Output (pin 1,6,7 mode push pull)
P2MDOUT = 0xFF; //Port2 Output (toutes les pin mode push pull)

LEDCX = 1; //LedCX éteinte

ES0 = 1; //Interruption UART0
EA = 1; //Interruption général

VREGEN = 1; //Activation du module CC2420
RESET = 1;
wait_ms(10); //tempo de 10ms
RESET = 0;
wait_ms(50); //tempo de 10ms
RESET = 1;
SCK = 0;

wait_ms(50); //tempo 50ms
SPI_TX_RX (0x01,0x00,0x00,1); //Oscillateur CC2420
wait_ms(50); //tempo 50ms
SPI_TX_RX (0x03,0x00,0x00,1);

LED = 0; //Led allume
ts = 1;
trf = 1;

}


/**************************************PROGRAMME PRINCIPAL******************************************/
void main ()
{

Init_Device(); //initialisation

while (1) //boucle
{
if (SFD == 1) //si mode reception activé
{
while(!(SFD == 0)); //tant que mode reception activé
RF_RX(); //appel de RF_RX : buffer recoi les données recue
}
else
{
if (BP == 0) //si BP appuyé
{
wait_ms(1); //tempo 1ms
while(!(BP == 1)); //tant que BP appuyé
RF_TX(0xA9); //appel de RF_TX : transmission de OxA9
}
else;
}
SFRPAGE = CONFIG_PAGE;
P2=0xff;
}
}

/***************************************PROGRAMME INTERRUPTION UART******************************************/
void UART_ISR(void) interrupt 4
{
EA = 0;
if (RI0 == 1)
{
SFRPAGE = UART0_PAGE;
RI0 = 0;
ch = SBUF0; //ch recoit le contenu du buffer
switch (ts)
{
case 0 : //Réception des 3 caractéres UART
UART_TX_RX ();
u++;
break;

case 1 : //Réception du caractére UART pour test
Test_uart(); //appel de test_uart
break;

case 2 : //Réception du caractére UART vers RF
RF_TX(ch);
ts = 1;
break;

case 3 : //Réception des caractéres fiche UART vers RF
fiche();
z++;
break;

case 4 : //Réception des caractéres vaccin UART vers RF
vaccin();
z++;
break;

case 5 :
lecture_registre_hf(); //Réception du caractére pour lir registre autonome
z++;
break;

case 6 : //Réception du caractére pour lir registre autonome
ecriture_registre_hf();
z++;
break;

}
}
else TI0 = 0;
EA = 1;
}

/*************************************PROGRAMME SAUVEGARDE DES DONNEES*********************************/
void UART_TX_RX ()
{
if (u == 0)
{
SPI1 = ch;
}
if (u == 1)
{
SPI2 = ch;
}
if (u == 2)
{
SPI3 = ch;
ts = 1;
}
}


/***************************************PROGRAMME TEST UART**********************************************/
void Test_uart()
{
switch (ch)
{
case 0x81 :
SBUF0 = 0x80; //Test connexion
break;

case 0x91 : //Réception des 3 commandes pour lire ou ecrire dans registre
ts = 0;
u = 0;
break;

case 0x92 : //Emission des données UART recut vers CC2420
SPI_TX_RX (SPI1,SPI2,SPI3,3);
break;

case 0x93 : //Emission des données CC2420 recut vers UART
SFRPAGE = UART0_PAGE;
SBUF0 = 0x90;
wait_ms(1);
SBUF0 = SPI1;
wait_ms(1);
SBUF0 = SPI2;
wait_ms(1);
SBUF0 = SPI3;
break;

case 0x95 : //Reset du module CC2420
SFRPAGE = CONFIG_PAGE;
RESET = 0;
wait_ms(10);
RESET = 1;
wait_ms(10);
break;

case 0xA1 : //Réception du caractére à envoyer sur liaison RF
ts = 2;
break;

case 0xA2 : //Réception des 28 caractéres à envoyer sur liaison RF
ts = 3;
z=0;
break;

case 0xA3 : //Réception des 9 caractéres à envoyer sur liaison RF
ts = 4;
z=0;
break;

case 0xA6 : //Réception du carctere registre lecture rf
ts = 5;
z=0;
break;

case 0xA7 : //Réception des carcteres registre ecriture rf
ts = 6;
z=0;
break;

default :
SFRPAGE = UART0_PAGE;
SBUF0 = 0x00;
} // fin switch
}


/****************************************LECTURE REGISTRE*************************************************/
void lecture_registre_hf()
{
if (z < 5)
{
UART[z] = ch;
}
if (z == 4)
{
for (z = 0; z < 5; z++)
{
RF_TX(UART[z]);
wait_ms(10);
}
ts = 1;
} //Réception du caractére pour lire registre autonome

}

/***********************************ECRITURE REGISTRE********************************************/
void ecriture_registre_hf()
{
if (z < 5)
{
UART[z] = ch;
}
if (z == 4)
{
for (z = 0; z < 5; z++)
{
RF_TX(UART[z]);
wait_ms(10);
}
ts = 1;
}
}

/***************************************FICHE?**********************************/
void fiche()
{
if (z < 29)
{
UART[z] = ch;
}
if (z == 28)
{
RF_TX(0xff);
wait_ms(10);
RF_TX(0xa8);
wait_ms(10);
for (z = 0; z < 29; z++)
{
RF_TX(UART[z]);
wait_ms(10);
}
ts = 1;
}
}

/***************************************VACCIN*****************************************/
void vaccin()
{
if (z < 12)
{
UART[z] = ch;
}
if (z == 11)
{
for (z = 0; z < 12; z++)
{
RF_TX(UART[z]);
wait_ms(10);
}
ts = 1;
}
}

/***************************************RF Emission***************************************/
void RF_TX(char RF)
{
LEDTX=0; //allume LedTX
SPI_TX_RX (0x3e,RF,0x00,3); //transfert de 0x3E , RF (0xA9) et 0X00
wait_ms(10); //tempo 10ms
SPI_TX_RX (0x04,0x00,0x00,1); //transfert de Ox04
wait_ms(10); //tempo de 10ms
SPI_TX_RX (0x09,0x00,0x00,1); //transfert de 0x09
}

/******************************************RF Reception************************************/
void RF_RX()
{
LEDRX=0; //allume LedRX
SPI_TX_RX (0x7f,0x00,0x00,2); //tranfert de 0x7f et 0x00
SPI_TX_RX (0x8,0x00,0x00,1); //tranfert de 0x8
SFRPAGE = UART0_PAGE;
SBUF0 = SPI2; //buffer recoit SPI2
}

/*************************************************SPI*******************************************/
void SPI_TX_RX (char a,char b,char c,char d)
{
int i;
NSS = 0; //signal d'activation à 0
for (i = 0; i < d; i++) //
{
if (i == 0)
{
SPI_Transfer (a); //transfert de a
SPI1 = SPI_read; //SPI1 recoit Miso
}
if (i == 1)
{
SPI_Transfer (b); //transfert de b
SPI2 = SPI_read; //SPI2 recoit
}
if (i == 2)
{
SPI_Transfer (c);
SPI3 = SPI_read;
}
}
NSS = 1;
}

/********************************************SPI TRANSFERT*************************************/
void SPI_Transfer (char SPI_byte)
{
unsigned char SPI_count;
for (SPI_count = 8; SPI_count > 0; SPI_count--)
{
MOSI = SPI_byte & 0x80; // ET logique avec 0X80
SPI_byte = SPI_byte << 1; //décalage de 1 vers la gauche
SCK = 0x01;
SPI_read = SPI_read << 1; //décalage de 1 vers la gauche
SPI_read |= MISO; // ou inclusif Spi_read avec miso
SCK = 0x00;
}
}

/************************************************TEMPORISATION***************************************/
void wait_ms(int ms)
{
SFRPAGE = TMR2_PAGE;

TMR2CN = 0x00;
TMR2CF = 0x00;

RCAP2 = -(SYSCLK/1000/12);
TMR2 = RCAP2;

ET2 = 0;

TR2 = 1;

while(ms)
{
TF2 = 0;
while(!TF2);
ms--;
}

TR2 = 0;
}
3
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 192
29 avril 2009 à 15:51
pourrais tu nous envoyer le code en question... sinon, personne ne pourra l'expliquer !
0
Le programme précedent est le code charger dans le module relié au pc
j'en ai un autre pour le module autonome ki envoie les informations
0
Salut!

Je suis en train de réaliser un programme comme toi avec 2 module Zigbee avec antennes et ils doivent échanger des datas!!!le problème est que je ne trouve pas un bon logiciel pour programmer!!!tu parle dans ton message de Silicon Laboratory!!!où le trouve tu?pourrai tu me le passer ou me donner le moyen de le trouver?je t'en serai très reconnaissant
0