J'ai déjà évoqué le sujet il y a un moment et je souhaite revenir dessus.
Je fais une com UART avec une autre carte. Un petit dialogue plutôt simple. J'utilise une machine d'état pour traiter la reception d'info plutôt que d'utiliser un buffer!
Cependant j'aimerais être certain qui si un loupé se produisait l'UART ne se bloquerai pas; pour ce faire j'avais imaginé un truc dans ce genre.
- reception du start d'une trame sur l'UART
- lancement du Timer prévu pour un time-out de 40ms ( large)
- si le message est bien reçu j’arrête le Timer et je le réinitialise pour un autre lancement plus tard
- Si une erreur est survenue de je ne sais où , au bout de 40ms l'INT du Timer, réinitialise la valeur de l'UART, réinitialise son compteur et se stoppe elle même .
Pensez vous que c'est jouable peut être qu'il y a mieux comme façon de faire, ou peut être que sa fonctionne pas du tout ?
Est ce gênant qu'une INT s'auto arrête ?
Code : Tout sélectionner
void interrupt(){
//----------------------- UART 1 -----------------------------
if((RC1IF_bit==1) && (RC1IE_bit==1)) {
Reception_UART1 = UART1_Read(); // On récupere la donnée
switch (Valeur){
case 0: if (Reception_UART1 == 2){ // reception du Start signal
Valeur = 1;
TMR1ON_bit = 1; // Je lance le time-Out
}
else
Valeur = 0;
break;
// Command : ordre=0x00 ; parametre=0x01
case 1: if (Reception_UART1 == 0){
Valeur = 2;
}
else {
Valeur = 0;
}
break;
// Nombre de DATA
case 2: if (Reception_UART1 == 1){
Valeur = 3;
}
else{
Valeur = 0;
}
break;
//DATA
case 3: Ordre = Reception_UART1;
XOR = 3^Reception_UART1;
Valeur = 4;
break;
// Calcul du Checksum
case 4: if (XOR == Reception_UART1){
F_Ordre_OK = 1;
}
TMR1ON_bit = 0; // J'eteins le time-Out
TMR1H = 0x63; // Je réinitilise
TMR1L = 0xC0;
Valeur = 0;
break;
default: Valeur = 0;
}
}
// ----- TIMER1 : 40 ms pour time-Out sur la reception UART
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1ON_bit = 0; // J'eteins le time-Out
TMR1H = 0x63;
TMR1L = 0xC0;
Valeur = 0; // Je RAZ la valeur
}
}
Merci