Sur ma télécommande j'ai des trims afin de compenser le décalage du véhicule.
En tout j'ai donc 8 trims donc 8 inters à bouton poussoir à surveiller. Lors d'un appui sur l'un d'eux cela change la variable des trims. Pour ne pas rendre l'appui sur un bouton bloquant, 'j’utilise la méthode de la détection de front avec une variable mémoire. Ainsi mon programme continue de tourner en permanence, même si on reste appuyé sur le BP.
La lecture des ces trims est donc un enchainement de 16 comparaisons pour savoir si un bouton est appuyé ou relâché et si son état à changer !
Je trouve cette méthode pas top et peu optimisée!
Est ce que de votre coté vous utilisez une autre méthode pour scruter autant de boutons sans rendre bloquant le programme ?
Voici la partie de scrutation des trims pour vous donner une idée de la lourdeur de la chose !
Code : Tout sélectionner
//-------------------------------------------------------------------------------------------------
// Cette fonction check la pression sur un BP des trims
// Sil'appui est validé elle incrémente ou décremente et l'enregistre en EEPROM
// Avec le systéme d'ancien état on ne reste pas bloqué dans la fonction
void Lecture_Trim(){
if ( (BP_Trim_G_H == 0) && (Ancien_etat1==0) ) { // Je detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_G_H == 0) {
Ancien_etat1 = 1; // Je signale un état bas validé
}
}
if ( (BP_Trim_G_H == 1) && (Ancien_etat1==1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_G_HB += 1; // L'ordre est validé
Ancien_etat1 = 0; // RAZ du flag
EEPROM_Write(0x01, V_Trim_G_HB);
delay_ms(1);
}
//---
if ( (BP_Trim_G_B == 0) && (Ancien_etat2==0) ) { // Je detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_G_B == 0) {
Ancien_etat2 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat2 && (BP_Trim_G_B == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_G_HB -= 1; // L'ordre est validé
Ancien_etat2 = 0; // RAZ du flag
EEPROM_Write(0x01, V_Trim_G_HB);
delay_ms(1);
}
//---
if ((BP_Trim_G_D == 0) && (Ancien_etat3==0) ) { // Je detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_G_D == 0) {
Ancien_etat3 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat3 && (BP_Trim_G_D == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_G_DG += 1; // L'ordre est validé
Ancien_etat3 = 0;
EEPROM_Write(0x02, V_Trim_G_DG);
delay_ms(1);
}
//---
if ( (BP_Trim_G_G == 0) && (Ancien_etat4==0) ) { // JE detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_G_G == 0) {
Ancien_etat4 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat4 && (BP_Trim_G_G == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_G_DG -= 1; // L'ordre est validé
Ancien_etat4 = 0; // RAZ du flag
EEPROM_Write(0x02, V_Trim_G_DG);
delay_ms(1);
}
//---
if ( (BP_Trim_D_H == 0) && (Ancien_etat5==0) ) { // JE detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_D_H == 0) {
Ancien_etat5 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat5 && (BP_Trim_D_H == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_D_HB += 1; // L'ordre est validé
Ancien_etat5 = 0; // RAZ du flag
EEPROM_Write(0x03, V_Trim_D_HB);
delay_ms(1);
}
//---
if ( (BP_Trim_D_B == 0) && (Ancien_etat6==0) ) { // JE detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_D_B == 0) {
Ancien_etat6 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat6 && (BP_Trim_D_B == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_D_HB -= 1; // L'ordre est validé
Ancien_etat6 = 0; // RAZ du flag
EEPROM_Write(0x03, V_Trim_D_HB);
delay_ms(1);
}
//---
if ( (BP_Trim_D_D == 0) && (Ancien_etat7==0) ) { // JE detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_D_D == 0) {
Ancien_etat7 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat7 && (BP_Trim_D_D == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_D_DG += 1; // L'ordre est validé
Ancien_etat7 = 0; // RAZ du flag
EEPROM_Write(0x04, V_Trim_D_DG);
delay_ms(1);
}
//---
if ( (BP_Trim_D_G == 0) && (Ancien_etat8==0) ) { // JE detecte un passage a l'état bas
delay_ms(5); // debounce
if (BP_Trim_D_G == 0) {
Ancien_etat8 = 1; // Je signale un état bas validé
}
}
if (Ancien_etat8 && (BP_Trim_D_G == 1) ) { // Si je suis déjà passé à l'état bas et que je suis revenu à haut
V_Trim_D_DG -= 1; // L'ordre est validé
Ancien_etat8 = 0; // RAZ du flag
EEPROM_Write(0x04, V_Trim_D_DG);
delay_ms(1);
}
}
L'idée est quand même d'essayé de garder cette fonction dans mon programme principale, pour pouvoir agir en permanence sur les trims. Au pire j'aurais pus créer un écran de réglage pour n'activer cette fonction que dans certaines conditions, mais bon pas top !