Bonjour a tous,
Apres plus de 1 semaine dessus,je craque!!
Je realise un project menant a transferer une trame de donne( STX-ADDRESSE-DATA-CHECKSUM-ETX) de mon pc a une carte de development via une communication RS232(dc via USART du PIC) cette carte est ensuite constitue de 2 microcontroleur(18f4680). Je dois faire passer cette trame d'un PIC a un autre via une communication SPI.
Donc j'utilise mon 1er pic comme "maitre" et mon 2eme comme "esclave".
La communication entre les 2 pic marche parfaitement mais mon probleme et qu'une fois que le pic numero recoit la donnee,il doit effectuer un checksum,c'est a dire, qu'il doit additionner tous les bits entre les delimiteurs(STX et ETX).
Et c'est la que je m'embrouille et bloque litteralement.
voici la data des donnee:
STX = 0x02 sur 8 bit
Addr = ? sur 8 bit
Data =? sur n bit
Checksum =? sur 8 bit
ETX = 0x03.
J'ecris mon code sur Mplab(c18 compileur) Et voici un brouillon de mon code,pourriez vous m'eclairer s'il vous plait
------------------------------------------------------------------------------------------
Code:void main() { unsigned char result[32]; unsigned char sum = 0; int i; int j = 0; int k; init_spi(); // init SPI module. init_uart(); // init UART module init_interrupt(); while(1) { while (!DataRdyUSART()); // attendre si il y'a une donne result[j] = ReadUSART(); // attrapper les donnee venant de l' USART if (result[j] == 0x02) // est ce le bon debut de trame?(STX) { j++; while(1) { while (!DataRdyUSART()); // attendre qu'il y ait une donne result[j] = ReadUSART(); // Get the character received from the USART // 1. ETX detecte. while (result[j] != 0x03) { sum = sum + result[j]; //Les additionner ensemble } if (sum != 0) // Si differents de zero { for(k=0;k<200;k++); OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_LOW, 64); putrsUSART("ERROR\r\n"); // Envoyer un message sur hyperterminal; } else { spi_data_ready = 1; // Donnee prete a etre envoyer a SPI break; } } } else if ((result[j] != 0x03) && ((j+1) > 31)) { break; } j++; }
-----