#define clockPinX 8
#define clockPinY 9
#define clockPinZ 10
#define dataPinX 2
#define dataPinY 3
#define dataPinZ 4
#define myDigitalRead(pin) (pin>13 ? bitRead(PINC,pin-14):\
pin>7 ? bitRead(PINB,pin-8) :\
bitRead(PIND,pin))
#define myDigitalWrite(pin,level) (pin>13 ? bitWrite(PORTC,pin-14,level):\
pin>7 ? bitWrite(PORTB,pin-8,level) :\
bitWrite(PORTD,pin,level))
volatile int bitCount = 0;
volatile uint32_t dataX=0;
volatile uint32_t dataY=0;
volatile uint32_t dataZ=0;
void setup() {
pinMode(clockPinX,INPUT);
pinMode(clockPinY,INPUT);
pinMode(clockPinZ,INPUT);
pinMode(dataPinX, INPUT);
pinMode(dataPinY, INPUT);
pinMode(dataPinZ, INPUT);
// Activer l'interruption sur changement d'état
PCICR |= (1 << PCIE2); // Activer PCIE2 (groupes de broches de D0 à D7)
PCMSK2 |= (1 << PCINT20); // Activer l'interruption sur PCINT20 (broche 4)
Serial.begin(9600);
delay(1000);
}
void loop() {
if (bitCount >= 24) {
Serial.print("Donnée reçue: ");
Serial.println(dataX, BIN);
bitCount = 0;
dataX = 0;
}
}
// Routine d'interruption Pin Change
ISR(PCINT2_vect) {
if (myDigitalRead(clockPinX) == HIGH) { // Si le front est montant
dataX <<= 1;
if (myDigitalRead(dataPinX) == HIGH) {
dataX |= 1;
}
bitCount++;
}
if (bitCount >= 24) {
// Vous pouvez désactiver l'interruption ici si nécessaire
}
}