Hi
I have one question regarding interrupt handling in new Azurit version.
In old version (106) it was :
enable interrupts :
then handling:
and in robot.cpp is setOdometryState where also swap direction is handled :
if (odometryLeftSwapDir) leftStep = -1;
if (odometryRightSwapDir) rightStep = -1;
In new version:
enable interrupts:
handling :
What is reason for this change ? Time consumption ? Is it right that setOdometryState in robot.cpp is no longer used ? How is now handled swap direction ?
Thank you for explanation.
Alex
I have one question regarding interrupt handling in new Azurit version.
In old version (106) it was :
enable interrupts :
Code:
// enable interrupts
//-----------------------------------------------------------------------------------------------------------------UweZ geändert Anfang---------------------------------
#ifdef __AVR__
// R/C
PCICR |= (1<<PCIE0);
if (remoteUse==1){ // überprüfe ob RemoteUse aktiviert ist;
bitWrite(PCMSK0, PCINT4, HIGH); // und wenn ja schreibe eine 1 ins PCMSK0 Register4 "XXX1XXXX" Interrupt PCINT4 Register4 entspricht den Pin 10 des Arduino Mega
}
else // und wenn nicht
{
bitWrite(PCMSK0, PCINT4, LOW); // dann schreibe eine 0 ins PCMSK0 PCINT4 Register4 "XXX0XXXX"
}
//-----------------------------------------------------------------------------------------------------------------
if (remoteUse==1){ // überprüfe ob RemoteUse aktiviert ist;
bitWrite(PCMSK0, PCINT5, HIGH); // und wenn ja schreibe eine 1 ins PCMSK0 Register5 "XX1XXXXX" Interrupt PCINT5 Register5 entspricht den Pin 11 des Arduino Mega
}
else // und wenn nicht
{
bitWrite(PCMSK0, PCINT5, LOW); // dann schreibe eine 0 ins PCMSK0 PCINT5 Register5 "XX0XXXXX"
}
//-----------------------------------------------------------------------------------------------------------------
if (remoteUse==1){ // überprüfe ob RemoteUse aktiviert ist;
bitWrite(PCMSK0, PCINT6, HIGH); // und wenn ja schreibe eine 1 ins PCMSK0 Register6 "X1XXXXXX" Interrupt PCINT6 Register6 entspricht den Pin 12 des Arduino Mega
}
else // und wenn nicht
{
bitWrite(PCMSK0, PCINT6, LOW); // dann schreibe eine 0 ins PCMSK0 PCINT6 Register6 "X0XXXXXX"
} .......
then handling:
Code:
ISR(PCINT2_vect, ISR_NOBLOCK){
#else
ISR(PCINT2_vect){
#endif
unsigned long timeMicros = micros();
boolean odometryLeftState = digitalRead(pinOdometryLeft);
boolean odometryRightState = digitalRead(pinOdometryRight);
robot.setOdometryState(..........
and in robot.cpp is setOdometryState where also swap direction is handled :
if (odometryLeftSwapDir) leftStep = -1;
if (odometryRightSwapDir) rightStep = -1;
In new version:
enable interrupts:
Code:
//-------------------------------------------------------------------------
// enable interrupts
//-------------------------------------------------------------------------
#ifdef __AVR__
//-------------------------------------------------------------------------
// Switch
//-------------------------------------------------------------------------
PCICR |= (1<<PCIE0);
PCMSK0 |= (1<<PCINT1);
//-------------------------------------------------------------------------
// R/C
//-------------------------------------------------------------------------
PCICR |= (1<<PCIE0);
if (remoteUse)
{
PCMSK0 |= (1<<PCINT4);
PCMSK0 |= (1<<PCINT5);
PCMSK0 |= (1<<PCINT6);
}
//-------------------------------------------------------------------------
// odometry
//-------------------------------------------------------------------------
// Wenn odometryUse == 1 dann:
// PCMSK2, PCINT20, HIGH -> für links
// PCMSK2, PCINT22, HIGH -> für rechts
//
// Wenn twoWayOdo == 1 dann:
// PCMSK2, PCINT21, HIGH
// PCMSK2, PCINT23, HIGH
if (odometryUse)
{
PCICR |= (1<<PCIE2);
PCMSK2 |= (1<<PCINT20);
PCMSK2 |= (1<<PCINT22);
}
//-------------------------------------------------------------------------
// mower motor speed sensor interrupt
//-------------------------------------------------------------------------
if (motorMowModulate)
{
//PCICR |= (1<<PCIE2);
//PCMSK2 |= (1<<PCINT19);
}
#else
// Due interrupts
// ODO.......
handling :
Code:
#ifdef __AVR__
volatile byte oldOdoPins = 0;
// Arduino Mega odometry interrupts
ISR(PCINT2_vect, ISR_NOBLOCK)
{
const byte actPins = PINK; // read register PINK
const byte setPins = (oldOdoPins ^ actPins);
unsigned long time = millis();
if ((setPins & 0b00010000) && (actPins & 0b00010000)) // pin left is RISING
{
if (robot.motorLeftPWMCurr >= 0) // forward
robot.odometryLeft++;
else
robot.odometryLeft--; // backward
}
if ((setPins & 0b01000000) && (actPins & 0b01000000)) // pin right is RISING
{
if (robot.motorRightPWMCurr >= 0)
robot.odometryRight++; // forward
else
robot.odometryRight--; // backward
}
oldOdoPins = actPins;
}
#else
// Arduino Due odometry inter.................
What is reason for this change ? Time consumption ? Is it right that setOdometryState in robot.cpp is no longer used ? How is now handled swap direction ?
Thank you for explanation.
Alex