I'm currently working on receiving signals from an RC remote. I have used pins A8 to A15 on my Arduino Mega board.
The ports and interrupts are setup with the help of this code:
DDRK = 0b00000000; // Set port A8-A15 to input PCICR |= (1<<PCIE2); // Enable interrupt on PCMSK2 containing receiver pins PORTK = 0b11111111; PCMSK2 = 0b11111111; // Enable all interrupts on receiver pins Then I have set up an interrupt which finds the pin which interrupted and times the pulse.
// Interrupts whenever a signal is received. ISR(PCINT2_vect) { static uint32_t startTime[8]; static uint8_t lastState; uint8_t mask; uint8_t changedPin; mask = PINK ^ lastState; lastState = PINK; if(mask & (1 << 0)) changedPin = 0; if(mask & (1 << 1)) changedPin = 1; if(mask & (1 << 2)) changedPin = 2; if(mask & (1 << 3)) changedPin = 3; if(mask & (1 << 4)) changedPin = 4; if(mask & (1 << 5)) changedPin = 5; if(mask & (1 << 6)) changedPin = 6; if(mask & (1 << 7)) changedPin = 7; // Check if the changed pin is high if(lastState & (1 << changedPin)) { // Start counting if it is startTime[changedPin] = micros(); } else { // Save if it has gone down again rcValue[changedPin] = micros() - startTime[changedPin]; } } This is actually working really good, except for the part when I connect a total of 4 or more pins.
Example:
A8: Working fine
A8 to A9: Working fine
A8 to A10: Working fine
A8 to A11: A9 and A11 working fine, A10 doesn't register any input, A8 jumps up from normal values (1000-2000) to values which are approximately 17000.
My guess is that it may have something to do with the masking and detection of the pin from there, but I have searched all over the almighty internet and it has not given me a clear answer.