Hi
So I have got the pin change interrupt working when reading one digital input on pin D10 using the following
//Original code from Tutorial: Pin Change Interrupts on the Arduino
//https://www.youtube.com/watch?v=-rvaUgYVNuI
//Modified to work with arduino Mega 2650 on pin D7
#define Rx_Cooling1 10 //D10 corrisponds to PCINT4 (PCMSK0 / PCIF0 / PCIE0)
boolean Rx_Cooling;
unsigned long Cooling_SignalTime;
unsigned long Cooling_Sig;
unsigned long Cooling_SignalStartTime;
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
volatile byte portBstatus;
volatile int eventFlag;
int RxUpperSignalLimit = 2100;
int RxLowerSignalLimit = 1000;
void setup() {
Serial.begin(19200);
//define the pins
pinMode(Rx_Cooling1, INPUT);
digitalWrite(Rx_Cooling1, HIGH);
sbi (PCICR, PCIE0); //Enable interupt PCI2
sbi (PCMSK0, PCINT4); //Set the interupt control bits for Digital input 10
}
void loop() {
if(eventFlag == 1){
Rx_Cooling = bitRead(portBstatus, 4); //Read bit of digital input 10
//Cooling
if(Rx_Cooling == HIGH){
Cooling_SignalStartTime = micros();
}
if(Rx_Cooling == LOW){
Cooling_SignalTime = (micros() - Cooling_SignalStartTime);
}
if(Cooling_SignalTime > RxLowerSignalLimit && Cooling_SignalTime < RxUpperSignalLimit) Cooling_Sig = Cooling_SignalTime;
Serial.print("Wing Fold Signal Time ");
Serial.println(Cooling_Sig);
}
eventFlag = 0; //Reset event flag
}
//Get binary of Port B whenever D10, D11, D12, D13, D50, D51, D52 or D53 change state
ISR (PCINT0_vect){
portBstatus = PINB;
eventFlag = 1; //Update event flag so that signal time can be calculated
}
How ever when I try and add the same to pin 11 as well as pin 10 using the following it is very slow to update the Cooling_Sig and wings_Sig as Cooling_SignalTime and Wings_SignalTime are way out like 24000, 36000 etc.
//Original code from Tutorial: Pin Change Interrupts on the Arduino
//https://www.youtube.com/watch?v=-rvaUgYVNuI
//Modified to work with arduino Mega 2650 on pin D7
#define Rx_Cooling1 11 //D11 corrisponds to PCINT5 (PCMSK0 / PCIF0 / PCIE0)
boolean Rx_Cooling;
unsigned long Cooling_SignalTime;
unsigned long Cooling_Sig;
unsigned long Cooling_SignalStartTime;
#define Rx_Wings1 10 //D10 corrisponds to PCINT4 (PCMSK0 / PCIF0 / PCIE0)
boolean Rx_Wings;
unsigned long Wings_SignalTime;
unsigned long Wings_Sig;
unsigned long Wings_SignalStartTime;
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
volatile byte portBstatus;
volatile int eventFlag;
int RxUpperSignalLimit = 2100;
int RxLowerSignalLimit = 1000;
void setup() {
Serial.begin(19200);
//define the pins
pinMode(Rx_Cooling1, INPUT);
digitalWrite(Rx_Cooling1, HIGH);
pinMode(Rx_Wings1, INPUT);
digitalWrite(Rx_Wings1, HIGH);
sbi (PCICR, PCIE0); //Enable interupt PCI2
sbi (PCMSK0, PCINT4); //Set the interupt control bits for Digital input 10
sbi (PCMSK0, PCINT5); //Set the interupt control bits for Digital input 10
}
void loop() {
if(eventFlag == 1){
Rx_Cooling = bitRead(portBstatus, 5); //Read bit of digital input 10
//Cooling
if(Rx_Cooling == HIGH){
Cooling_SignalStartTime = micros();
}
if(Rx_Cooling == LOW){
Cooling_SignalTime = (micros() - Cooling_SignalStartTime);
}
Rx_Wings = bitRead(portBstatus, 4); //Read bit of digital input 10
//Cooling
if(Rx_Wings == HIGH){
Wings_SignalStartTime = micros();
}
if(Rx_Wings == LOW){
Wings_SignalTime = (micros() - Wings_SignalStartTime);
}
if(Cooling_SignalTime > RxLowerSignalLimit && Cooling_SignalTime < RxUpperSignalLimit) Cooling_Sig = Cooling_SignalTime;
if(Wings_SignalTime > RxLowerSignalLimit && Wings_SignalTime < RxUpperSignalLimit) Wings_Sig = Wings_SignalTime;
Serial.print("Cooling Signal Time ");
Serial.print(Cooling_Sig);
Serial.print("\t");
Serial.print("Wing Fold Signal Time ");
Serial.println(Wings_Sig);
}
eventFlag = 0; //Reset event flag
}
//Get binary of Port B whenever D10, D11, D12, D13, D50, D51, D52 or D53 change state
ISR (PCINT0_vect){
portBstatus = PINB;
eventFlag = 1; //Update event flag so that signal time can be calculated
}
Update times of Cooling_Sig and Wings_Sig with the above are around half a second, I am after less than 200ms at the most. Cooling_SignalTime and Wings_SignalTime update very fast I would say around 100ms without timing it.
Once again if anyone could help with this that would be great.