Author Topic: MEGA2560  (Read 413 times)

ulmtn

  • Newbie
  • *
  • Posts: 2
    • View Profile
MEGA2560
« on: January 28, 2017, 01:43:31 PM »
My Balanduino clone is based on an Arduino Mega 2560 ADK (works also with the Mega 2560 and USB host shield). For encoder interrupts the Ports B, K and J corresponding to interrupt vectors PCINT0, PCINT1 and PCINT2 can be used as on the original Mega 1284P .But the most stable balancing is achieved with PCINT0 (PCINT0, pin 13 and pin 10). When switching to PCINT1 (pin 14 and 15) or PCINT 2 (A8, A9 analog pins) the reaction to pushing the robot is much weaker. Is there a reason, that other Pin Change interrupts behave differently than PCINT0?
The only configuration that shows the same performance as the original Balanduino robot is using the attachInterrupts 0 and 1 (pin2 and 3) together with PCINT0 on PortB pins, like in Balanduino Revision 1.2. However, I wanted to implement the improvements of Revision 1.3 with different Ports for each encoder. How is this possible on the Mega2560 without loss in performance?

Lauszus

  • Administrator
  • Full Member
  • *****
  • Posts: 132
    • View Profile
Re: MEGA2560
« Reply #1 on: February 03, 2017, 10:52:29 AM »
Hmm I don't really know. Maybe those interrupts has a lower priority? Unfortunately I don't know anyway to solve your problem. Please keep me posted if you find a solution.

Regards
Kristian Sloth Lauszus

ulmtn

  • Newbie
  • *
  • Posts: 2
    • View Profile
Re: MEGA2560
« Reply #2 on: February 04, 2017, 10:09:12 AM »
Thank you for the reply. The priority  is highest in PortB. I am happy, that there is a solution using four external interrupts of the Mega2560 to count encoder :
 #define leftEncoder1Pin   2  // Used for attachInterrupt
 #define leftEncoder2Pin  19 // Used for attachInterrupt
 #define rightEncoder1Pin 3  // Used for attachInterrupt 
 #define rightEncoder2Pin 18 // Used for attachInterrupt

  attachInterrupt(digitalPinToInterrupt(leftEncoder1Pin), leftEncoder, CHANGE);
  attachInterrupt(digitalPinToInterrupt(rightEncoder1Pin), rightEncoder, CHANGE);
  attachInterrupt(digitalPinToInterrupt(leftEncoder2Pin), leftEncoder, CHANGE);
  attachInterrupt(digitalPinToInterrupt(rightEncoder2Pin), rightEncoder, CHANGE);

This gives the same performance as Revision 1.2 with separate encoder functions. Not sure if it really better than Rev 1.2.
The defines for PIN_CHANGE_INTERRUPT_VECTOR can be deleted, but all the #if defined statements must be deleted, too
« Last Edit: February 05, 2017, 01:38:57 PM by ulmtn »