C est plus clair comme cela:
471 se retrouvent avec = (488 -454)/2 + 454
Avec les AVR on peut aller très précisément sur les plages en question grâce aux timer B.
Aussi voila le genre de trame que l'on doit pouvoir traiter pour le résultat qui nous intéresse mais qui requiert un AVR en plus de l'ESP32
Valeurs en accord avec les remarques portées sur le Security Gap d'OPEN DCC:
https://www.opendcc.de/info/railcom/railcom_f.shtmlDe plus on y inclus les marges des timings selon ce qui sera perçu en entrée.= et toujours conforme au respect de la norme.
// Values for half bits from RCN 210, section 5: http://normen.railcommunity.de/RCN-210.pdf
#define ONE_BIT_MIN F_CPU / 1000000 * 52
#define ONE_BIT_MAX F_CPU / 1000000 * 64
#define ZERO_BIT_MIN F_CPU / 1000000 * 90
#define ZERO_BIT_MAX F_CPU / 1000000 * 119
// Values for half bits from RCN 217,
#define ENABLE_STOP_TIME F_CPU / 1000000 * 26 // CUTOUT MIN START VALUE
#define ENABLE_START_TIME F_CPU / 1000000 * 488 // CUTPOUT MAX STP¨VALUE
// Values according OPEN DCC best practices:
#define CUTOUT_START_TIME F_CPU / 1000000 * 30 //4us security gap cutout at start
#define CUTOUT_STOP_TIME F_CPU / 1000000 * 484 //4us secutity gap cutout at stop
//TIMER B IS ALREADY STARTED AND CNT GO UP
if(TCB0.CNT < ENABLE_STOP_TIME) //< 26us
{
//ENABLE ON
LOGIC_ENABLE_OUT_PIN_ON;
while(TCB0.CNT < ENABLE_STOP_TIME) {;}; //WAIT TILL IS OVER
}
else if((TCB0.CNT < CUTOUT_START_TIME) && (TCB0.CNT >= ENABLE_STOP_TIME)) // >=26us & <30us
{
//ENABLE OFF
LOGIC_ENABLE_OUT_PIN_OFF;
while(TCB0.CNT < CUTOUT_START_TIME) {;}; //WAIT TILL IS OVER
}
else if((TCB0.CNT < CUTOUT_STOP_TIME) && (TCB0.CNT >= CUTOUT_START_TIME)) // >=30us & <484us
{
//MAKE CUTOUT:
LOGIC_CUTOUT_OUT_PIN_ON;
while(TCB0.CNT < CUTOUT_STOP_TIME) {;}; //WAIT TILL IS OVER
}
else if((TCB0.CNT < ENABLE_START_TIME) && (TCB0.CNT >= CUTOUT_STOP_TIME)) // >=484 us & < 488us
{
//STOP CUTOUT
LOGIC_CUTOUT_OUT_PIN_OFF;
while(TCB0.CNT < ENABLE_START_TIME) {;}; //WAIT TILL IS OVER
}
else if ((TCB0.CNT >= ENABLE_START_TIME)) // >=488us
{
//ENABLE PIN ON:
LOGIC_ENABLE_OUT_PIN_ON;
//CUTOUT IS OVER
}
}
A eprouver encore par quelques tests de validation.