Sur le code initial j apporte une première modification somme toute triviale quand on y pense!
En effet c est l'interruption qui va modifier les valeurs et elle uniquement donc on peut y glisser les valeurs de pilotage des I/O.
Je profite pour les initialiser dans le setup ce qui n avait pas été fait précédemment!
Voila le code revu en conséquence.
La LOOP est vide à présent est c est tout à fait normal!
#include <Arduino.h>
/*
DCC AUTO LOOP REVERSER: BASIC V1.0
Author: Laurent ROEKENS LTR
Version 1.0.0
Date rev: 31/01/2024: initial release
Version 1.0.1
Date rev: 07/02/2024: interruption manages port change directly.
Specially design for MEGATINY x02 ( 202,402, 212, 412 CPU Parts)
SWAP PIN NAMES OFR ANY AVRx CPU. ( ex AVR Serie0 (NANO_EVERY), AVR Dx, ...)
*/
//VARIABLES:
#if !defined(PIN_PA1)
#define PIN_PA1 2
#endif
#if !defined(PIN_PA2)
#define PIN_PA2 3
#endif
#if !defined(PIN_PA3)
#define PIN_PA3 4
#endif
#define TOGGLE GPIOR0 //use global register GPRIOR0 to store value for faster speed reaction
#define CDE_RLY_SET_PIN PIN_PA2
#define CDE_RLY_RESET_PIN PIN_PA1
#define RST_PIN PIN_PA3
void toggle_state();
#define RLY_COIL_SET_ON PORTA.OUTSET = PIN2_bm //faster than PORTA.OUT |= PIN2_bm
#define RLY_COIL_SET_OFF PORTA.OUTCLR = PIN2_bm //faster than PORTA.OUT &= ~PIN2_bm
#define RLY_COIL_RESET_ON PORTA.OUTSET = PIN1_bm //faster than PORTA.OUT |= PIN1_bm
#define RLY_COIL_RESET_OFF PORTA.OUTCLR = PIN1_bm //faster than PORTA.OUT &= ~PIN1_bm
void toggle_state()
{
TOGGLE = !TOGGLE;
switch(TOGGLE)
{
case false:
RLY_COIL_RESET_OFF;
RLY_COIL_SET_ON;
break;
case true:
RLY_COIL_SET_OFF;
RLY_COIL_RESET_ON;
break;
}
}
///////////////////////////////
//SETUP
///////////////////////////////
void setup()
{
TOGGLE = false; //init state arbitrary
pinMode(CDE_RLY_RESET_PIN, OUTPUT);
pinMode(CDE_RLY_SET_PIN, OUTPUT);
pinMode(RST_PIN, INPUT);
//init STATE:
TOGGLE = false; //init state arbitrary
RLY_COIL_SET_ON;
RLY_COIL_RESET_OFF;
attachInterrupt(digitalPinToInterrupt(RST_PIN),toggle_state,FALLING); //ANY STATE DOWN DETECTED ON RST_PIN WILL SWAP STATE
}
////////////////////////////////
//LOOP
////////////////////////////////
void loop(){
}