Hi,
I am going through the fast IO macros defined in Marlin's fastio.h file. I have largely understood the macros but I'm not able to grasp the below code.
My understanding is _WRITE_NC sets the value 1 or 0 to the corresponding IO bit by accessing the PORT register.
_WRITE_C toggles the bits if V = 1. But, shouldn't the mask be taken from the PIN register and finally written to the PORT register. I think the code should be this:
Please help me out with this.
I am going through the fast IO macros defined in Marlin's fastio.h file. I have largely understood the macros but I'm not able to grasp the below code.
#define _WRITE_NC(IO,V) do{ \ if (V) SBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ else CBI(DIO ## IO ## _WPORT, DIO ## IO ## _PIN); \ }while(0) #define _WRITE_C(IO,V) do{ \ uint8_t port_bits = DIO ## IO ## _WPORT; /* Get a mask from the current port bits */ \ if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \ DIO ## IO ## _RPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \ }while(0)
My understanding is _WRITE_NC sets the value 1 or 0 to the corresponding IO bit by accessing the PORT register.
_WRITE_C toggles the bits if V = 1. But, shouldn't the mask be taken from the PIN register and finally written to the PORT register. I think the code should be this:
#define _WRITE_C(IO,V) do{ \ uint8_t port_bits = DIO ## IO ## _RPORT; /* Get a mask from the current port bits */ \ if (V) port_bits = ~port_bits; /* For setting bits, invert the mask */ \ DIO ## IO ## _WPORT = port_bits & _BV(DIO ## IO ## _PIN); /* Atomically toggle the output port bits */ \ }while(0)
Please help me out with this.