cómo acceder a los campos de bits de un registro en el microcontrolador

-3

Estoy trabajando con el microcontrolador PIC18f4550. He conectado un lcd en modo de 4 bits al puerto d < 1: 4 > pines. Entonces, ¿cómo puedo enviar datos solo a los 4 bits del puerto d < 1: 4 > regístrese sin afectar los valores de bit (puerto d0, d6, d7).

    
pregunta tamil_innov

4 respuestas

5

Hay cinco enfoques que se pueden usar en las partes de PIC18Fxx para cambiar algún conjunto de bits en un registro.

  1. Lee LATx en W, enmascara los bits adecuados y calcula el valor correcto, luego escribe el valor de nuevo. Esto actualizará todos los bits limpiamente, pero requiere que ninguna interrupción pueda escribir cualquier parte del registro. Todos los bits se actualizarán simultáneamente.

  2. Cargue W con los bits que no son de interés, ANDWF los bits en el registro, cargue W con los valores deseados de los bits de interés e IORWF los bits en el registro. Todos los bits de interés se borrarán simultáneamente, y luego todos los bits que deben configurarse se establecerán simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, o pueden modificar bits de interés de la misma manera que lo está haciendo el código de la línea principal.

  3. Como arriba, pero IORWF todos los bits de interés, y luego ANDWF con un valor que tiene todos los bits establecidos excepto aquellos bits de interés que deben borrarse. Todos los bits de interés se establecerán simultáneamente, y luego todos los bits de interés que no deban establecerse se borrarán simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, o pueden modificar bits de interés de la misma manera que lo está haciendo el código de la línea principal.

  4. Cargue W con el valor del registro, XOR W con los valores de los bits de interés, Y W con los bits de interés, y luego XORWF de vuelta al registro. Esto realizará todas las actualizaciones simultáneamente. Las interrupciones pueden afectar de manera segura a otros bits del registro, pero las interrupciones que cambian cualquier bit de interés pueden tener efectos extraños, incluso si los cambios coinciden con lo que la línea principal está tratando de hacer.

  5. Use una secuencia de instrucciones BSF / BCF para modificar los bits según sea necesario. Este enfoque afectará solo a los bits apropiados; las actualizaciones no serán simultáneas, pero evitarán cualquier borde inapropiado; la combinación de la línea principal y las operaciones de interrupción no tendrá ningún efecto secundario extraño.

Los enfoques # 1 y # 4 generan resultados perfectamente limpios; Solo la aproximación # 4 puede usarse de manera segura con interrupciones. Si el programa se escribiera en lenguaje ensamblador, el enfoque # 1 podría interactuar de manera segura con las interrupciones si el código se escribiera como algo así como:

UpdateBits: ;  Call from main-line to write bits 0-3
  movf   LATA,w,c
  andwf  0xF0
  iorwf  NewLowerBits
  bsf    PortAWFlag,0,c
  mowwf  LATA,c
  bcf    PortAWFlag,0,c


Interrupt:
  movwff WREG,SAVED_W
  ...
  ...  ; Code to write bits 4-7
  movf   _LATA,w,c
  btfsc  PortAWFlag,0,c
   movf  SAVED_W,w,c
  andlw  0x0F
  iorwf  NewUpperBits
  movwf  _LATA,c
  btfsc  PortAWFlag,0,c
   movwf SAVED_W,w,c
  ...
  movff  SAVED_W,WREG
  retfie

No sé si alguna vez encontré escenarios en los que este enfoque sería mejor que simplemente deshabilitar las interrupciones antes de actualizar los bits de puerto en la línea principal, pero si hay un código de interrupción que simplemente no puede soportar la posibilidad de ser demorado unos seis ciclos mientras la línea principal actualiza el puerto, el enfoque anterior podría funcionar.

    
respondido por el supercat
4

El proceso es muy simple:

  1. Lee la hoja de datos.

  2. Haz lo que dice.

Después del paso 1, notarás varias cosas:

  1. El PIC tiene instrucciones que pueden establecer o borrar bits individuales en cualquier registro, incluido un registro de puerto. Busque BCF y BSF.

  2. Incluso sin la instrucción de manipulación de bits, aún puede establecer o borrar bits individuales en un byte ejecutando ORing y ANDing. Por ejemplo, ORing con binario 00101100 establecerá los bits 5, 3 y 2. Del mismo modo, ANDing con 00101100 borrará los bits 7, 6, 4, 1 y 0.

  3. Este PIC tiene un registro LAT para cada puerto. Eso permite realizar operaciones de lectura-modificación-escritura como AND, OR y bit bit set / clear sin el uso involuntario de los valores de pin reales como entrada, según se aplique al último valor que intentó configurar el puerto. En su caso, parece que desea realizar sus operaciones en el registro LATD en lugar del registro PORTD.

respondido por el Olin Lathrop
0

El OP marcó esta pregunta con [C]. Así que voy a asumir que están usando el compilador C18. Creo que la forma más fácil de acceder a los bits en un registro es usar los tipos que se definen en el archivo de encabezado del dispositivo para su procesador. En su caso, eso sería "P18f4550.h".

Puede escribir los bits individualmente utilizando LATDbits.LATD1, LATDbits.LATD2, LATDbits.LATD3, LATDbits.LATD4.

Para escribirlos todos a la vez, usa una máscara como LATD | = (newValue & 0x1E).

La lectura de bits individuales utiliza una nomenclatura similar (PORTDbits.RD1).

    
respondido por el mjh2007
-1

Estoy de acuerdo con Olin. Solo quiero añadir esto:

Si no entiende cómo usar estas instrucciones, puede consultar la documentación del lenguaje de programación que usa.

    
respondido por el agy

Lea otras preguntas en las etiquetas