¿Cómo cambia su estado un pin específico en un puerto (microcontrolador PIC)? Software frente a hardware

¿Cómo, por ejemplo PortB.B0 = 1; comando cambiar el estado de un pin específico en un microcontrolador.

El microcontrolador generalmente tiene una línea de datos de 8 bits, lo que significa que escribirá y leerá desde todo el puerto simultáneamente. Mi pregunta es, ¿es el trabajo del compilador leer todo el puerto , configurar el bit especificado y escribir el byte completo en el puerto o puede el microcontrolador cambiar un solo bit por sí solo?

No creo que sea trabajo del compilador hacer eso ni nada directamente con el hardware.
Los microcontroladores PIC tienen operaciones de código de máquina a nivel de bits (BTS y BTC, entre otros) que operan en bits individuales. No es necesario leer/escribir todo el puerto.
Creo que la mayoría o al menos muchos PIC tienen instrucciones de operación de bits en los registros.

Respuestas (2)

Supongo que está hablando de los registros PORT en los PIC comunes de pasatiempos. Estos chips tienen un conjunto de niveles de bits e instrucciones claras, y se puede esperar que un compilador traduzca

PuertoB.B0 = 1;

a

PUERTO BSF, 0

PERO PERO PERO PERO PERO PERO

Estas instrucciones de establecimiento y borrado de bits se ejecutan como un ciclo completo de lectura, modificación y escritura de 8 bits. La CPU lee el puerto de 8 bits, borra el bit más bajo y vuelve a escribir el resultado. Esto sería solo de interés académico si no fuera por el hecho de que leer PORTB lee los niveles lógicos en los pines de los chips. (En la mayoría de las otras arquitecturas, leería el registro de salida PORTB). Cuando el pin está tan cargado que su nivel externo no lee el nivel donde el búfer de entrada lo reconoce correctamente, el valor leído puede diferir del valor escrito por última vez. él. Este es el temido problema de lectura-modificación-escritura. La solución canónica es realizar sus operaciones de bits en una ubicación de RAM (llamada la sombra del puerto) y luego escribir el búfer de sombra en el puerto usando operaciones normales de 8 bits.

Si no utiliza este enfoque canónico, vivirá tiempos interesantes: configurar un pin más en un puerto de salida puede, por ejemplo, borrar los pines que configuró anteriormente. Y, por supuesto, lo hará solo en una situación de producción, nunca en su banco de pruebas.

nota al margen: en el lenguaje Jal (que diseñé e implementé hace mucho tiempo, ahora lo mantienen otros) hay algo de magia de lenguaje y biblioteca para hacer

pin_a_5 = true

significar

port_a_shadow |= (1 << 5 )
port_a = port_a_shadow

Nota al margen 2:

Los PIC modernos tienen un registro LAT para cada puerto. La lectura de estos registros produce el último valor que se escribió en ellos, por lo que no sufren el problema de lectura, modificación y escritura. AFAIK Jal en esos chips no se molesta en usar un registro de sombra.

Si observa el desensamblaje de esa línea de código, lo más probable es que se compile hasta bsf LATB,0. Esa es la instrucción de conjunto de bits. La forma en que los compiladores manejan este tipo de escenario varía según la arquitectura del procesador. Cada compilador y conjunto de instrucciones es diferente.

... cada conjunto de instrucciones es diferente ... pero es bastante común en microcontroladores (no solo PIC) e incluso Z80 si la memoria sirve, para poder direccionar bits individuales.