There is a prefined macro/function for the bitmask on every Arduino:
digitalPinToBitMask();
I simplified the code, but did only a rough test on several pins on the MEGA:
(the last 2 lines replaces many lines)
CircularLED::CircularLED( int data, int clk) {
_data= data;
_clk = clk;
pinMode(_data, OUTPUT);
pinMode(_clk, OUTPUT);
PORT_Data = portOutputRegister(digitalPinToPort(_data));
PORT_Clk = portOutputRegister(digitalPinToPort(_clk));
// changed to digitalPinToBitMask() to work on MEGA - 5.1.16 NR maybe works also on UNO
BIT_Data = digitalPinToBitMask(_data);
BIT_Clk = digitalPinToBitMask(_clk);
}
Maybe it will help someone, Norbert