6 votos

Escrito a los pines en un puerto sin afectar a los otros pines en el puerto

Yo produzco un número de 6 bits en PORTA (RA0-RA5), ¿cómo puedo escribir los bits sin estropear lo que ya está en RA6 y RA7?

Por ejemplo si quiero a la salida de 0x3F sobre los bits de RA0-RA5. Si utilizo PORTA = 0x3F; que supondrá la salida de 00111111 efectivamente limpiar lo que nunca fue escrito ya a los bits RA6 y RA7.

Estoy de codificación en C con MikroC en un PIC18

10voto

Tom Carpenter Puntos 7192

Un procedimiento que se llama "Leer-Modificar-Escribir".

Lo que implica es totalmente en el nombre. Usted leer. Luego de modificar. Luego de escribir.

Leer:

//Read in the value of the output register
tempVariable = [output register]

Modificar:

//set all bits you want to modify to be 0.
tempVariable &= [some mask];
//or in the values of the bits with those bits you want unchanged set to 0
tempVariable |= [new value of bits];

Escribir:

//Write the new value back to the output register
[output register] = tempVariable;

La clave es, básicamente, para finalizar con los valores de bits que desea ser invariable a ser escrita a la salida de registro junto con los nuevos valores de los bits que no desea cambiar.

Para determinar lo que el registro de salida es para su dispositivo, debe consultar su hoja de datos.


No podemos escribir en el registro directamente porque va a afectar a los bits no queremos cambiar. Así que tenemos una secuencia de operaciones que va a cambiar sólo los bits que queremos. Esto es donde los operadores bit a bit vienen en.

Hay varios operadores bit a bit, pero lo importante son dos & (y) y | (o). Bit a bit y cualquier cosa con un 0 y en ella se establece que el bit a 0, bit a bit y cualquier cosa con 1 y se mantiene la misma. Bit a bit o cualquier cosa con un 1 y se establece que poco a ser un 1, bit a bit o nada con 0 y se mantiene la misma. Estos dos operadores nos permiten hacer los cambios necesarios, porque ahora tenemos una manera de establecer sólo algunos de los bits a 0 y una manera de establecer sólo algunos de los bits a 1.

El nuevo valor que se desea escribir se requieren algunos bits a 0 y algunos bits a 1. Podemos lograr esto haciendo un bit a bit y seguido por un bit a bit o. El y se utiliza para establecer todos los bits que queremos cambiar a ser 0 para que nos permiten hacer la o el que establece que sólo los bits que queremos ser 1 ser 1.

Un ejemplo ayudará. Digamos que usted desea modificar los 5 bits más bajos para un valor de 0b01011 pero deja la parte superior de 3 bits sin cambios. Permite también dicen que el valor actual es 0b10111101. Así que siga el procedimiento:

Paso 1, de la máscara:

Current: 0b101 11101
Bitmask: 0b111 00000 <- remember a 1 means don't change, a 0 means clear.
Result : 0b101 00000

Paso 2, modificar:

Masked : 0b101 00000
New Val: 0b000 01011 <- remember a 1 means set to 1, a 0 means unchanged
Result : 0b101 01011

Y ahí lo tienen - aviso de la parte superior de 3 bits se mantuvieron sin cambios en ambas operaciones, mientras que la parte inferior de bits se han actualizado para que coincida con el nuevo valor.


Para llevar hasta un punto que se menciona en los comentarios y la otra respuesta, que este hecho debe ser hecho en el registro de salida, que era la intención original de mi respuesta. Parece que hay cierta confusión en el supuesto de que por el puerto me estaba refiriendo a la PORTx registra en Fotos - de hecho el registro de salida en algunos dispositivos es el LATx registro. Algunas Fotos no tienen un LATx registro. En los retornos voluntarios asistidos por ejemplo PORTx es el registro de salida. La hoja de datos para su dispositivo le dirá lo que la salida del registro.

Además, la técnica puede ser utilizada para modificar las variables así como la creación de registros, y puede ser usado cuando se modifican los registros para otras cosas que no sean sólo los puertos e/S - usted puede modificar cosas como los registros de control de periféricos seriales y como bien.

Debido a las diferencias en la nomenclatura de los registros y el hecho de que el proceso es un enfoque universal, en el anterior yo había tratado de ser genérico como la misma cosa se aplica no sólo Fotos, sino de cualquier microcontrolador - de hecho, casi cualquier cosa que se requiere de una serie de bits de un registro para ser modificados, pero no a los demás.

10voto

Spehro Pefhany Puntos 90994

En general, en los PIC18 de la arquitectura, usted debe nunca usar leer-modificar-escribir comandos como

PORTA |= 0x3F; // configura los bits 0 a 5

En su lugar, utilice

LATA |= 0x3F; // configura los bits 0 a 5

o

LATA &= ~0x80; // borra el bit 7

La razón es que el PORTA |= xx instrucción lee primero el bit niveles en los pines, los modifica y, a continuación, escribe el resultado en el puerto seguro.

La LATA de instrucción lee los bits en el puerto de pestillo, los modifica, a continuación, escribe el resultado en puerto seguro.

Si, por alguna razón (tal como la carga o los retrasos de propagación), los pines del puerto no están en la posición correcta y válida la lógica de los niveles, el leer-modificar-escribir la instrucción puede inadvertidamente modificar los bits que no tenía intención de modificar. Si va a cambiar los pines de la entrada a la salida para simular drenaje abierto pines, un problema similar se plantea para los pines que se encuentran temporalmente en las entradas - la salida del latch de un pin diferente de lo que son intencionalmente la modificación de los cambios y, a continuación, cuando se cambia el registro TRIS de nuevo a 0 para activar la simulación de drenaje abierto, el pestillo del estado para que poco ha sido alterado.

Para los mayores de Fotos que no tienen LATx, si usted tiene que utilizar RMW, usted puede mantener un registro sombra manualmente, modificar y, a continuación, transferir el resultado al registro del puerto.

Un poco más de detalle acerca de lo que escribí anteriormente, a partir de su compilador proveedor de aquí.

1voto

Para manipular sólo el Bit Menos Significativo (LSB) de un registro

Conjunto

GPIO_DATA = GPIO_DATA | 0x01;

Claro

GPIO_DATA = GPIO_DATA & (~0x01);

A continuación es un conjunto de notas que yo tenga a la mano que pueda ser de utilidad. Preste atención a las notas de Rojo.

enter image description here

Para una explicación detallada sugiero que consulte aquí.


Referencias:

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X