Question to interrupts handling in new Azurit 107

alda

Member
Hi
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
 
The 2nd odometry channel isn't used anymore, the motor direction is derived from the pwm signal. Therefore, a direction swapping isn't required anymore. The code has been optimized for speed.
 
Ok, then I can make a bigger code clean up, because some parts are no longer necessary.
Thank you

Alex
 
Oben