¿Cómo un pin específico en un puerto cambia su estado (Microcontrolador PIC)? Software vs Hardware

1

¿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 tarea del compilador leer todo el puerto establecido el bit especificado y escribir todo el byte de nuevo en el puerto o el microcontrolador puede cambiar un solo bit? ¿Es propio?

    
pregunta Hassan Nadeem

2 respuestas

5

Supongo que está hablando de los registros PORT en los PIC de pasatiempo común. Estos chips tienen un nivel de bits establecido e instrucciones claras, y se puede esperar que un compilador se traduzca

  

PortB.B0 = 1;

a

  

BSF PORTB, 0

PERO PERO PERO PERO PERO PERO PERO PERO

Este conjunto de bits y las instrucciones de borrado de bits se ejecutan como un ciclo completo de lectura-modificación-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 solo sería de interés académico si no fuera por el hecho de que leer el 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 de PORTB). Cuando el pin se carga tan fuertemente que su nivel externo no lee el nivel donde el búfer de entrada lo reconoce correctamente, el valor leído puede diferir del último valor escrito eso. Este es el temido problema de lectura-modificación-escritura. La solución canónica es realizar las 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 mediante operaciones normales de 8 bits.

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

lado enote: En el lenguaje Jal (que diseñé e implementé hace mucho tiempo, ahora es mantenido por otros) hay algo de magia de lenguaje y biblioteca para hacer

pin_a_5 = true

significa

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 les escribió, por lo que no sufren el problema de lectura-modificación-escritura. AFAIK Jal en esos chips no se molesta en usar un registro sombra.

    
respondido por el Wouter van Ooijen
0

Si observa el desmontaje 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 bit set. La forma en que los compiladores manejan este tipo de escenario varía con la arquitectura del procesador. Cada compilador y conjunto de instrucciones es diferente.

    
respondido por el Matt Young

Lea otras preguntas en las etiquetas