'Valor L' y 'Valor R' describen los atributos del lado izquierdo y del lado derecho, respectivamente, de una asignación. Un valor R es una cantidad de algún tipo (no necesariamente numérico), generalmente el resultado de evaluar una expresión, pero también una constante, como '5' o la cadena "¡Hola, Mundo! \ N". Un valor L es algo a lo que un programa puede asignar un valor R, como una variable nombrada, una memoria sin formato o una dirección de puerto. Este artículo de WikiPedia tiene una descripción más completa.
"lvalue requerido como operando izquierdo de asignación" simplemente significa que el lado izquierdo de su asignación no es una dirección asignable o convertible en una. PA0 es # definido como una constante simple sin propiedades de valor l.
Está en el camino correcto: aquí hay un artículo de Arduino sobre los puertos y los registros de E / S asociados con ellos, y la manipulación directa de esos registros. A pesar de sus advertencias, la manipulación directa de puertos es una técnica útil para reducir tanto el tamaño del programa como el sesgo de tiempo en algunas situaciones.
Estas declaraciones:
#define LED_PORT PORTA
#define RED_ON (PORTA | 0x01)
#define RED_OFF (PORTA & ~0x01)
...
LED_PORT = RED_ON;
definirá un valor l que puede asignar (pero tenga en cuenta que es un puerto completo, no solo un pin) y cambiará su valor para activar el pin-0. La expresión RED_ON lee: lee PORTA, O con '1' (para que no cambies ningún otro bit en el puerto); la asignación vuelve a escribir el nuevo valor en el puerto.
(Tenga en cuenta que su código como está escrito, incluso suponiendo que la declaración de asignación fue correcta, encenderá el LED repetidamente, lo cual no es diferente de encenderlo una vez).