Super_Cinci:
Je n'ai même pas résumé, car il y a autant de choses à décrire qu'il y a de transistors dans le µP (en gros...)
Pour les histoires d'allocation des variables locales, je viens d'apprendre un truc, merci les gars!
Selon le nombre de fonctions de mon programme, j'utilise au max les interruptions. Par exemple, j'ai trouvé un moyen d'utiliser un clavier matriciel sans aucun appel de fonction : je branche les colonnes sur un port (prenons le port X par exemple) et les lignes sur le port Y. le port Y contient l'interruption PCINT1 (Pin Change INTerrupt). cette interruption est déclenchée dès qu'une des pin du port change, ce qui est très pratique dans mon cas, la lecture du clavier dans mon programme se résume alors à la lecture de la variable key :
#define NO_KEY 0xFF; // code "pas de touche"
volatile byte lignes, colonnes, key;
void KeybInit(){ // initialisation du clavier
PORTX en sortie; // Préparation des colonnes
PORTX = 0x00;
PORTY en entrée; // Préparation des lignes
PORTY = 0xFF; // pullup sur les lignes
Autoriser PCINT1 sur PORTY; // démarrer la lecture sur interruption
}
ISR(PCINT1-Vect)(){ // routine d'interruption appelée dès qu'une pin du port Y change d'état (appui sur une touche ou relâchement)
Désactiver PCINT1 sur PORTY;
colonnes = PINY; // lecture de la ligne qui a changé d'état
PORTX en entrée; // Préparation des colonnes
PORTX = 0xFF; // pullup sur les colonnes
PORTY en sortie; // Préparation des lignes
PORTY = 0x00;
lignes = PINY; // lecture de la ligne de la touche enfoncée
key = decodeKey(lignes, colonnes); // décodage du code de la touche
keybInit(); // réinitialisation du clavier
}
void setup(){
key = NO_KEY;
keybInit();
}
void loop(){
if (key != NO_KEY){
switch (key){ // ne fait appel à aucune fonction (donc très rapide)
case 0x00 :
//traitement touche code 0x00
break;
case 0x01 :
//traitement touche code 0x01
while (key == 0x01); // attente du relâchement de la touche
// faire quelque chose
while (key == NO_KEY); // attente de l'appui sur une nouvelle touche
// faire encore quelque chose
while (key != NO_KEY); // attente du relâchement de toutes les touches
break;
}
}
}
Ici, j'ai grandement simplifié, la fonction decodeKey n'est pas là, elle transforme le couple (lignes, colonnes) en un code sur un octet (utile pour un clavier à touches numérotées... la touche "1" donne la valeur 1 etc etc.
J'avoue qu'un arduino Mega sera bien plus adapté à ce genre de code car il possède beaucoup de PCINT, permettant de gérer ainsi des claviers de 256 touches voire plus, sans avoir besoin de balayer les lignes et colonnes en continu, le gain de temps est bien plus que considérable, car si on n'appuie sur aucune touche, alors on peut résumer la loop ainsi :
void loop(){
if (key != NO_KEY){
// peu importe ce qu'il se passe ici, car on n'appuie sur aucune touche : key = NO_KEY...
}
}
et donc loop boucle uniquement sur un simple if. Ce n'est qu'un exemple, mais de cette même manière, on peut gérer le clavier quand et comme on veut!
Dans mes programmes utilisant ce genre de manip d'int pour un clavier, la loop contient un menu (dans lequel on navigue via le clavier).
si ça peut donner des idées, prenez, prenez! faudrait que j'en fasse une lib (je sais toujours pas comment on fait, j'ai essayé une fois sans résultat), ça serait grandement pratique pour beaucoup, car la lib Keypad est vraiment très lente (du digitalWrite et Read à foison avec je ne sais combien de if()...) et bug de temps en temps...
Et sur un mega, on peut pas faire de int sur l'ensemble des pin je suppose ? Il me semble avoir lu que c'etait limité à 6 pins chez arduino.
L'idée serait de prioriser l'ensemble des DI (digitals input) alors que le traitement "secondaire" type affichage LCD, écriture carte SD seraient moins prioritaire.
Évidement, les DI ne serait pas sollicitées à une cadence folle. Ça dans le cadre de la domotique.