Bonjour à tous,
je vous expose mon probleme. Je developpe actuellement une carte à base d'un 18F452(32 Mhz 8*4 HSPLL) ,d'un XBEE S1 (v10A5) et d'un LED de status connecté sur le PORTC.RC0, et je me casse les dents sur l'initialisation du Xbee (a moins que ca vienne du pic).
J'utilise le mode API du Xbee pour envoyer un TX REQUEST (64 bits address) en broadcast contenant 64 octets de données en plus de l'encapsulation organisées comme ceci :
7E 00 4B 00 FF 00 00 00 00 00 00 FF FF suivi de 64 x 00 enfin 02.
si tout c'est bien deroulé je recupere le TX STATUS :
7E 00 03 89 FF 00 77
J'encapsule l'intégralité de ce paquet dans un nouveu TX REQUEST 64 que je renvoi sur le reseau.
Pour "ecouter" le reseau , j'ai un Xbee+FT232R connecté sur un PC (avec X-CTU).
Mon premier problème est le suivant , il faut attendre environ 10 s avant d'envoyer quoique ce soit au XBEE (sinon rien n'ai envoyé sur le reseau).
Lorsque j'arrive enfin à envoyer une donnée (la carte XBEE coté PC ayant recuperé le paquet) , 2 octets du TX status (7E 00) me sont retournés et ... c'est tout !!! Bien sur j'ai essayé plusieurs couple Xbee - Pic mais rien.
Mais la ou je n'arrive vraiment pas a comprendre ,c'est qu'en simulant la carte(PIC simulé avec Proteus VSM + utilisation COMPIN model pour utiliser un vrai Xbee sur le port serie) ,je n'ai aucun probleme (pb de timing quelque part ?).
Voici le programme (mikroC) tout simple (peut etre trop ?) :
Le PIC est confuguré ainsi : OSCS_OFF_1H,_HSPLL_OSC_1H,_BOR _OFF_2L,
Code:#define WIBEE_AT_COMMAND 0x08 #define WIBEE_TX_REQUEST 0x00 #define WIBEE_FRAME_ID 0xFF #define WIBEE_START_DELIMITER 0x7E #define WIBEE_TX_STATUS 0x89 unsigned char WIBEE_Packet_checksum; unsigned char WIBEE_AT_COMMAND_BUFFER[2]; unsigned char WIBEE_AT_COMMAND_VALUE[20]; unsigned char WIBEE_AT_COMMAND_VALUE_LENGHT; unsigned char WIBEE_TX_REQUEST_DESTINATION_ADDRESS[8]; unsigned char WIBEE_TX_REQUEST_OPTIONS; unsigned char WIBEE_TX_REQUEST_RF_DATA[64]; unsigned char i; /******************************************************************************/ /* Routine d'envoi un paquet sur le reseau WIBEE */ /* ou d'envoi de commande AT au XBEE */ /*----------------------------------------------------------------------------*/ /* En entrée : le type de paquet : WIBEE_AT_COMMAND */ /* WIBEE_TX_REQUEST */ /*----------------------------------------------------------------------------*/ /* En sortie : le resultat de l'operation : WIBEE_PACKET_SEND_SUCCES */ /* WIBEE_PACKET_SEND_FAILED */ /******************************************************************************/ unsigned char WIBEE_Send_Packet(unsigned char PacketType) { /*-------------------------------------------------------------------*/ /* 1) Initialise le calcul de la checksum */ /*-------------------------------------------------------------------*/ WIBEE_Packet_checksum = 0xFF - PacketType; WIBEE_Packet_checksum -= WIBEE_FRAME_ID; /*-------------------------------------------------------------------*/ /* 2) Determine le type de paquet à envoyer au XBee */ /* 3) Calcul de la checksum du paquet */ /* 4) Envoi du paquet au XBee */ /*-------------------------------------------------------------------*/ switch (PacketType) { // Commande AT case WIBEE_AT_COMMAND: WIBEE_Packet_checksum -= WIBEE_AT_COMMAND_BUFFER[0]; WIBEE_Packet_checksum -= WIBEE_AT_COMMAND_BUFFER[1]; for (i = 0 ; i < WIBEE_AT_COMMAND_VALUE_LENGHT ; i++) WIBEE_Packet_checksum -= WIBEE_AT_COMMAND_VALUE[i]; Usart_Write(WIBEE_START_DELIMITER); Usart_Write(0); Usart_Write((0x04 + WIBEE_AT_COMMAND_VALUE_LENGHT)); Usart_Write(WIBEE_AT_COMMAND); Usart_Write(WIBEE_FRAME_ID); Usart_Write(WIBEE_AT_COMMAND_BUFFER[0]); Usart_Write(WIBEE_AT_COMMAND_BUFFER[1]); for (i = 0 ; i < WIBEE_AT_COMMAND_VALUE_LENGHT ; i++) Usart_Write(WIBEE_AT_COMMAND_VALUE[i]); break; // Paquet de donnée à transmettre au reseau case WIBEE_TX_REQUEST: for (i = 0 ; i < 8 ; i++) WIBEE_Packet_checksum -= WIBEE_TX_REQUEST_DESTINATION_ADDRESS[i]; WIBEE_Packet_checksum -= WIBEE_TX_REQUEST_OPTIONS; for (i = 0 ; i < 64 ; i++) WIBEE_Packet_checksum-=WIBEE_TX_REQUEST_RF_DATA[i]; Usart_Write(WIBEE_START_DELIMITER); Usart_Write(0); Usart_Write(75); Usart_Write(WIBEE_TX_REQUEST); Usart_Write(WIBEE_FRAME_ID); for (i = 0 ; i < 8 ; i++) Usart_Write(WIBEE_TX_REQUEST_DESTINATION_ADDRESS[i]); Usart_Write(WIBEE_TX_REQUEST_OPTIONS); for (i = 0 ; i < 64 ; i++) Usart_Write(WIBEE_TX_REQUEST_RF_DATA[i]); break; default: break; } Usart_Write(WIBEE_Packet_checksum); // A rajouter la recuperation du TX status et AT_COMMAND_RESPONSE. return 1; } void main() { // Initialisation du port C TRISC = 0x80; PORTC = 0x00; LATC = 0x00; // Initialisation de l'USART Usart_Init(9600); // Efface le buffer TX_REQUEST_RF_DATA for (i = 0 ; i < 64 ; i++) WIBEE_TX_REQUEST_RF_DATA[i] = 0x00; // Adresse de destination 000000000000FFFF pour le broadcast WIBEE_TX_REQUEST_DESTINATION_ADDRESS[0] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[1] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[2] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[3] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[4] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[5] = 0x00; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[6] = 0xFF; WIBEE_TX_REQUEST_DESTINATION_ADDRESS[7] = 0xFF; // Pas d'options pour l'emission de paquet , donc doit recuperer un TX STATUS WIBEE_TX_REQUEST_OPTIONS = 0x00; // Envoi d'un paquet sur le reseau WIBEE_Send_Packet(WIBEE_TX_REQUEST); PORTC.RC0 = 1; // Power on STATUS LED // Recuperation pas tres propre du TX STATUS , mettre en place un systeme de Timeout while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[0] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[1] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[2] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[3] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[4] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[5] = RCREG; while (!Usart_Data_Ready); WIBEE_TX_REQUEST_RF_DATA[6] = RCREG; // Renvoi le paquet sur le reseau WIBEE_Send_Packet(WIBEE_TX_REQUEST); PORTC.RC0 = 0; // POWER OFF STATUS LED // Boucle infini while (1) { } }
_PWRT_ON_2L,_WDT_OFF_2H,_CCP2M S_OFF_3H,_STVR_OFF_4L,_LVP_OFF _4L,_DEBUG_OFF_4L,_CP0_OFF_5L, _CP1_OFF_5L,_CP2_OFF_5L,_CP3_O FF_5L,_CPB_OFF_5H,_CPD_OFF_5H, _WRT0_OFF_6L,_WRT1_OFF_6L,_WRT 2_OFF_6L,_WRT30_OFF_6L,,_WRTC_ OFF_6L,_WRTB_OFF_6L,_WRTD_OFF_ 6L,_EBTR0_OFF_7L,_EBTR1_OFF_7L ,_EBTR2_OFF_7L,_EBTR3_OFF_7L,_ EBTRB_OFF_7L
voici enfin le schema de ma carte :
Si quelqu'un a une idée , merci d'avance ...
-----