12 votos

¿Puede asignar pins individuales de diferentes puertos de un microcontrolador a un registro y sus valores puede cambiar cuando cambia el valor del registro?

P: ¿los pines individuales de puerto diferente de un micro-controlador de ser asignado a un registro y sus valores se han cambiado al cambiar el valor del registro?

Escenario: he utilizado hasta algunos pines de cada puerto(8 bits) de la micro-controlador. Ahora quiero interfaz de un dispositivo que necesita un bus de 8 bits (supongamos D0 a D7 EN la SECUENCIA), es decir, necesito 8 pines del controlador, así que me puedo conectar en uno-a-uno de la moda

portx0  -> D0 // x is the name of port followed by bit location on that port
portx1  -> D1
...
portx7  -> D7

pero no tengo todo un puerto de 8 pines que me puedo conectar con este dispositivo, más bien tengo algunos pines de portx, algunos de porty y algunos pines de portz. El nuevo escenario de conexión es como (conexión de un micro-controlador de dispositivo respectivamente )

portx0  -> D0
portx1  -> D1
portx2  -> D2
porty4  -> D3
porty5  -> D4
porty6  -> D5
porty7  -> D6
portz1  -> D7

En esta condición, si quiero enviar un valor de decir

unsigned char dataReg = 0xFA;

a mi dispositivo de controlador que tengo que realizar poco sabio operaciones en el valor de ser enviados y configurar cada pin de acuerdo con el valor en el registro de forma individual. Por ejemplo

portx0 = ((dataReg & 0x01) >> 0 );  // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );

Ahora, llegando a la cuestión principal, para evitar estos cálculos individuales en cada uno de los bits en los diferentes puertos, puede clavijas individuales de puerto diferente de un micro-controlador de ser asignado a un registro y sus valores se han cambiado al cambiar el valor del registro?

6voto

RelaXNow Puntos 1164

Parece que tu pregunta viene con tener un 8 bits valor en el firmware, y el deseo de leer y escribir los que de una colección arbitraria de los pines del puerto.

No hay ninguna directo al hardware manera de hacer esto. Usted tiene que escribir dos rutinas, una para leer los 8 bits de valor y escribir. Otros han mencionado que el uso de los sindicatos, sino que es una mala idea. Con los sindicatos, usted tiene que tratar con cada parte por separado, y el código se vuelve dependiente de la orden de bits de la micro. Este podría ser el camino a seguir de todos modos si todos los 8 bits se dispersa de forma totalmente independiente. Si es así, poco se puede hacer, pero para hacer un código especial para cada bit.

La mejor manera de hacer esto, especialmente si usted puede agrupar los bits en un par de fragmentos contiguos en los puertos físicos es el uso de enmascaramiento, cambiando, y ORing. Por ejemplo, si la baja de tres de los bits internos byte en bits <6-4> de un puerto, a la derecha cambio de que el puerto de valor por 4 y con 7 para obtener los bits en su posición final. Cambio y la máscara (o de la máscara y de cambio) bits de otros puertos en el lugar y montaje final de 8 bits byte por ORing los resultados en ella.

Este tipo de bajo nivel de bits con los que es más fácil de hacer en ensamblador de C. probablemente me ponga el byte leer y escribir rutinas en un único módulo de ensamblador y hacer que la interfaz se puede llamar desde C.

4voto

Armandas Puntos 552

En general esto no es posible. Que yo sepa, no es posible con Fotos.

Sólo hay un microcontrolador sé que puede hacerlo, el Ciprés PSoC. Es altamente configurable sistema en chip. De las muchas cosas que te permite hacer es literalmente definir su propio registro (1-8 bits) y conectarlo a alguna de las patillas que te gusta, o incluso a los circuitos internos.

PSoC Wiring

Por ejemplo, aquí he creado un 6 bits del registro de control. 5 de los bits ir directamente a los pines, mientras que el 6 de bits que estoy usando para XOR con la entrada de un 7 pin.

PSoC Pins

En el chip, me pueden optar por asignar estos pines a cualquiera de los pines GPIO. (Los grises de una imagen)

-1voto

Kaushik Gopal Puntos 779

Puedes probar el siguiente. Escriba una estructura de su propio mapas a los respectivos pines de los 2 puertos (que se van a utilizar) ahora actualizar el valor de este registro serán set/reset los pasadores de los 2ports. Acabo de probar y háganos saber si funciono!!

Estoy seguro de que esto debería funcionar.

-1voto

Mario Puntos 191

Si he entendido la pregunta correctamente, es bastante fácil en C:

Genérico de declaración de tipo, puede ser re-utilizado para cualquiera de los registros:

typedef union    // Generic 8-bit register Type
{
  uint8 reg; // Whole register
  struct
  {
    unsigned  bit7     : 1;  // Bit 7 
    unsigned  bit6     : 1;  // Bit 6 
    unsigned  bit5     : 1;  // Bit 5 
    unsigned  bit4     : 1;  // Bit 4 
    unsigned  bit3     : 1;  // Bit 3 
    unsigned  bit2     : 1;  // Bit 2 
    unsigned  bit1     : 1;  // Bit 1 
    unsigned  bit0     : 1;  // Bit 0 
  } bit;
} typ_GENERIC_REG8;

Entonces, para definir un puerto que queremos abordar:

#define MCU_GPO_PORTx   (*(volatile typ_GENERIC_REG8 *)(0x12345678)) // Number is address

Y directamente a juguetear con un pin en el puerto:

#define MCU_PORTx_PINn  (MCU_GPO_PORTx.bit.bit0)

En el código:

MCU_PORTx_PINn = 1; // Set pin high

Todo el registro:

MCU_GPO_PORTx.reg = 0xF; // All pins high

Bien vale la pena leer sobre las estructuras, los sindicatos, las definiciones de tipos y las enumeraciones - todos estos hacen la vida mucho más agradable en embedded & en general!

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