2
« le: décembre 07, 2017, 12:05:56 am »
Bonsoir,
J'ai commencé depuis quelques temps la réalisation de décodeurs d'accessoires sur base ARDUINO.
J'utilise la bibliothèque DCC_Decoder. Le système marche très bien pour les aiguillages mais je me suis aperçu récemment que du côté des signaux il y avait des ratés.
Après analyse, tests et interrogations sur les forums, je suis arrivé à la conclusion que le traitement des données, que je faisais à la suite du void BasicAccDecoderPacket_Handler, me faisait louper des données.
j'ai donc inclus une autre bibliothèque, CircularBuffer, pour enregistrer les données immédiatement après le "Handler" puis les récupérer et les traiter, cette fois-ci dans la "loop".
Et là, impeccable, je ne loupais plus de données, au vu du Serial.print.
J'ai donc continué le traitement des données pour activer les sorties: tout est OK jusqu'au calcul de la valeur à envoyer (ici CDE4) mais rien ne se passe avec le ShiftOut (j'utilise des registres à décalage).
J'en viens à me demander si l'instruction ShiftOut ne se percute pas avec la fonction buffer.shift() de CircularBuffer!
Je précise que je travaille avec CDM-Rail et que je ne suis pas un grand spécialiste de la programmation (cela ressemble sûrement à "la programmation pour les nuls")
Ci-dessous une copie de mon code que j'ai allégé pour aller au plus simple, mais avec lequel j'ai bien un problème au moment de l'envoi du ShiftOut.
------------------------------------------------------------------------------------------------------------------------------------
#include <DCC_Decoder.h>
#define kDCC_INTERRUPT 0 // pin 2 for UNO
#include <CircularBuffer.h>
CircularBuffer <int, 100> storadresse;
CircularBuffer <byte, 100> storaction;
int add = 0;
int act = 0;
int old_add = 0;
int old_act = 0;
int action = 0;
const int CLOCK2 = 8;
const int LATCH2 = 9;
const int DATA2 = 10;
int OUT4[8];
int CDE4 = 0;
//Handler DCC
void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data){
//Serial.print(address);
//Serial.print(" ");
//Serial.println(data);
storadresse.push (address);
storaction.push (data);
}
void setup() {
DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true);
DCC.SetupDecoder( 0x00, 0x00, kDCC_INTERRUPT );
Serial.begin (115200);
Serial.println("Debut test");
}
void loop() {
DCC.loop();
while(!storadresse.isEmpty()) {
add = storadresse.shift();
act = storaction.shift();
if ((add != old_add) || (act != old_act)){
old_add = add;
old_act = act;
// Conversion de l'adresse NMRA en adresse decodeur d'accessoire
add -= 1;
add *= 4;
add += 1;
add += (act & 0x06) >> 1;
action =(act & 0x01);
Serial.print(add);
Serial.print(" ");
Serial.println(action);
//Gestion des signaux
//Registre à décalage OUT4
if((add >=127) && (add <= 134)){
if(action = 1){
OUT4[add - 127] = bit(add - 127);
}
else{
OUT4[add - 127] = 0;
}
}//fin boucle OUT4
//Envoi OUTT4
CDE4 = OUT4[0]+OUT4[1]+OUT4[2]+OUT4[3]+OUT4[4]+OUT4[5]+OUT4[6]+OUT4[7];
Serial.println(CDE4);
digitalWrite(LATCH2, LOW);
shiftOut(DATA2, CLOCK2, LSBFIRST, CDE4);
digitalWrite(LATCH2, HIGH);
} //fin nouvelle donnée
} //fin while
} //fin loop
--------------------------------------------------------------------------------------------------------------------
Merci d'avance à ceux qui pourront m'aider