Bon ce we j'ai vaguement fini une version utilisable du code du microcontroleur, j'ai bien galéré avec des comportements totalement aléatoires et du code qui faisait vraiment n'importe quoi jusqu'à ce que je comprenne que quand j'emet des octets via le buffer série le contenu du buffer se retrouve éparpillé un peu partout dans toutes les autres variables globales, le truc de fou, et en particulier dans le tableau des lampes

pourtant le code avait l'air correct sans dépassement des indices du buffer, le buffer est en bank1 les lampes en bank0, et je pense qu'il y a une chiure du compilo qui switche pas les banques entre elles et du coup fait n'importe quoi dans les interruptions, je viens de me farcir la doc complète apparement faut déclarer toutes les varibles globales en "volatile static" sinon ça chie, je vais retester ça ce soir pour voir si c'est mieux car pour l'instant j'ai diminué le buffer pour éviter les overlap mémoire mais c'est minable et indigne comme bug fix
Enfin bref, ça marchotte quand même, j'ai changé tout le protocole pour me simplifier la vie surtout pour que je puisse le tester via un terminal même sans programme juste en tapant les commandes au clavier et j'ai ajouté de quoi vérifier l'état des bobines, des switch et des lampes.
Sens PC => Pin², les commandes sont codées sur 2 caractères:
"x" est une valeur, entre 0 et 255 codé sur un octet
- "RZ" => reset, le hard répond "PIN2 RUNNING" quand il a fini son init.
- "cx" => change la valeur des 8 bobines du premier port par la valeur x
- "dx" => 2ème port = x
- "lx" => change l'état des 8 lampes de la 1ère colonne des lampes avec x
- "mx" => change les 8 lignes de la 2ème colonne avec x
- .... etc
- "sx" => change les 8 lignes de la 8 ème colonne de lampes
- "BxxxxxxxxB" => mode burst recharge d'un coup toute la matrice des lampes avec les 8 colonnes, plus efficace que 1 par 1 si plus de 4 colonnes à changer
- "LP" => demande le status des lampes, le PIC répond "LxxxxxxxxP" x étant le contenu des lignes de chaque colonne des lampes
- "CO" => demande le status des coils, le pic répond "CxxO", x étant la valeurs des 2 ports 8 bits donc des 16 bobines
- "SW" => demande le status des switchs, le pic répond "SxxxxxxxxW", donc toute la matrice des switch
Sens Pin² => PC
- Si demande de status des lampes (LP), le PIC répond "LxxxxxxxxP" x étant le contenu des lignes de chaque colonne des lampes
- Si demande de status des bobines (CO), le pic répond "CxxO", x étant la valeurs des 2 ports 8 bits donc des 16 bobines
- Si demande se status des switchs (SW), le pic répond "SxxxxxxxxW", donc toute la matrice des switch
Le seul cas où le pic envoie 2 caractères tout seul sans répondre à un ordre c'est sur le changement d'état d'un switch:
-"1x" => un switch a été modifié colonne 1, x valeur des lignes de cette colonne
-"2x" => un switch a été modifié colonne 2, x valeur des lignes de cette colonne
- ... etc
-"8x" => un switch a été modifié colonne 8, x valeur des lignes de cette colonne
La détection des switch fonctionne bien, les bobines aussi, les lampes également ainsi que la rotation de la matrice.
Dans cette version ça ne gère pas encore la luminosité lampe par lampe comme savent le faire les derniers wms (p2000) et les stern, j'ai commencé mais j'ai eu tellement de soucis de corruption mémoire à cause de ce buffer série à la con que j'ai perdu un temps pas possible.
D'ailleur faut que je réécrive ce buffer ça va pas du tout il est linéaire et ne tourne pas comme un buffer fifo.
Je me suis basé sur mon revenge pour les fréquences, les switchs sont scannés à 500Hz et la matrice des lampes tourne à 250Hz, j'ai réglé les timer pour avoir à peu près pareil.
Voilà avec ça déjà on peut mettre à jour les bobines, les lampes colonnes par colonnes ou une par une, vérifier l'état des switch des bobines et recevoir automatiquement les switch modifiés
La suite au prochain numéro
Pascal