JE suis toujours sur mes modules radio !
J'ai changé de stratégie pour la réception. Voici le déroulé :
Le maitre envoi un message à un esclave. Pour le moment seulement au N°1.
Plusieurs solution :
- réception d'un NON_ACK c'est à dire que le module après ces tentatives me signale qu'il n'as recu ou alors une erreur de channel . ACK =2 dans ce cas la.
- Fin du time-out, au bout de 250ms si je n'ai rien reçu du tout, je sors . ( chose normalement impossible mais par sécurité)
- réception de l'ACK . Accusé est bon le module esclave est donc à portée radio . dans ce cas ACK = 1; J'attends donc la réponse de mon module esclave quite à sa réception d'un message par le maitre.
Voici un petit organigramme pour être encore plus explicite du comportement qu'il faudrait !
Même avec un analyseur logique, je vois ou se situe l'erreur mais je ne comprends pas pourquoi elle se produit !
En bleu il s'agit de RD0 qui annonce le départ d'une communication .
En jaune l’émission de l'UART . On remarque que des que RD0 passe à 1 , j'envoie un message . tout va bien .
En vert la réception UART . On voit qu’après qu'un message soit partis je reçois un Accusé de réception, puis un message de réponse.
Le problème c'est que une fois le message de réponse reçu, le comportement n'est pas bon !!!! 3 fois sur 4 ! . Normalement RD0 devrait faire un pic à 1 après la réception d'un bon message ;
En rouge , les bonnes réponses cela devrait comme ca à chaque fois.
En violet (la flèche) indique le problème du bug
Et voici la partie du programme simplifiée :
Code : Tout sélectionner
//#############################################################################
//######################### BOUCLE PRINCIPALE #########################
//#############################################################################
while(1){
delay_ms(10);
Demande_envoi();
}
}
//########################################################################
void Demande_envoi(){
char Compteur = 0; // Variable locale
PORTD.B0 = 1;
//Envoi de requete 1.95ms à 38400
ACK_OK = 0; // Raz du flag juste avant
UART_Write(0x02); // Start
UART_Write(0x01); // Commande
UART_Write(0x03); // Nbe de DATA Bytes
UART_Write(0x6A); // Channel
UART_Write(0x01); // destination adresse
UART_Write(0x01); // payload
UART_Write(0x6A); // CS
Compteur = 0;
while(1){
Compteur++; // lancement time-out
delay_ms(1);
if (Compteur>50 ){ // time-out depassé
Compteur = 0;
PORTD.B0 = 0;
PORTD.B5 = 1; // J'allume une led pour l'indiquer
Delay_ms (50);
PORTD.B5 = 0;
break;
}
if(ACK_OK == 2){ // Si je recois un NON_ACK
ACK_OK = 0; // Hors de portée ou non allumé ou mauvais channel
PORTD.B0 = 0;
PORTD.B3 = 1;
Delay_ms (50); // J'allume une led pour le signaler
PORTD.B3 = 0;
break;
}
if (ACK_OK == 1){ // Si j'ai recu un bon ACK
ACK_OK = 0;
Compteur = 0; // RAZ du time-out
Reponse_OK = 0;
PORTD.B0 = 0;
while(1){ // Attente de la réponse ou time out
Compteur++;
delay_ms(1); // Lancement time-out
if (Compteur>250){
PORTD.B1 = 1; // J'allume une LED
break; // Je sors
}
if (Reponse_OK == 1){ // SI je recois une BONNE reponse
Reponse_OK = 0;
PORTD.B0 = 1;
delay_ms(1);
PORTD.B0 = 0;
PORTD.B4 = 1; // J'allume une led
Delay_ms (50);
PORTD.B4 = 0;
break; // Je sors
}
}
break;
}
};
}
