Pregunta

Estoy usando un IC, DS1620 para leer datos en serie de 1 bit que vienen en una sola línea. Necesito leer estos datos usando uno de los puertos del microcontrolador ARM (LPC2378). Los puertos ARM son de 32 bits. ¿Cómo obtengo este valor en una variable de 1 bit?

Editar: en otras palabras, necesito una referencia directa a un pin de puerto.

¿Fue útil?

Solución

no hay variables de 1 bit, pero podría aislar un bit en particular, por ejemplo:

uint32_t original_value = whatever();
uint32_t bit15 = (original_value >> 15) & 1; /*bit15 now contains either a 1 or a 0 representing the 15th bit */

Nota: no sé si estaba contando números de bits que comienzan en 0 o 1, por lo que > > 15 puede estar apagado por uno, pero entiendes la idea.

La otra opción es usar campos de bits, pero eso se complica y la OMI no vale la pena a menos que cada bit en el valor sea útil de alguna manera. Si solo quieres uno o dos bits, desplazarte y enmascarar es el camino a seguir.

En general, este artículo puede ser de utilidad para usted.

Otros consejos

Para su CPU, se debe utilizar la respuesta de Evan Teran. Solo quería mencionar la función de banda de bits de algunas otras CPU ARM como la Cortex-M3. Para alguna región de RAM / Periféricos, todos los bits se asignan a una dirección separada para facilitar el acceso.

Consulte http: / /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html para obtener más información.

Es simple si puede acceder al registro de puertos directamente (no tengo experiencia con ARM), solo a modo de bit Y con la máscara binaria que corresponde al bit que desea:

var = (PORT_REGISTER & 0x00008000);

Ahora var contiene 0 si el bit 15 es '0' o 0x00008000 si el bit 15 es '1'.

Además, puedes cambiarlo si quieres tener '0' o '1':

var = ((PORT_REGISTER & 0x00008000) >> 15);

Los archivos de encabezado que vienen con su compilador contendrán declaraciones para todos los registros del microcontrolador y los bits en esos registros.

En este artículo específico, simulemos que el registro de entrada del puerto se denomina PORTA , y el bit que desea tiene una máscara definida, denominada PORTA15 .

Luego, para leer el estado de ese pin:

PinIsSet = (PORTA & PORTA15) == PORTA15;

O de manera equivalente, utilizando el operador ternario :

PinIsSet = (PORTA & PORTA15) ? 1 : 0;

Como punto general, consulte el manual de referencia para lo que hacen todos los registros y bits. También, mira algunos ejemplos. ( Esta página en el sitio web de Keil contiene ambos, y hay muchos otros ejemplos en la web.)

En LPC2378 (como la otra familia de microcontroladores LPC2xxxx), los puertos de E / S están en la memoria del sistema, por lo que debe declarar algunas variables como esta:

#define  DALLAS_PIN (*(volatile unsigned long int *)(0xE0028000)) /* Port 0 data register */
#define  DALLAS_DDR (*(volatile unsigned long int *)(0xE0028008)) /* Port 0 data direction reg */
#define  DALLAS_PIN (1<<15)

Tenga en cuenta que 0xE0028000 es la dirección para el registro de datos del puerto 0, y 0xE0028008 es la dirección del registro de dirección de datos para el puerto 0. Debe modificar esto de acuerdo con el puerto y el bit utilizado en su aplicación. Después de eso, en su función de código, el código o las macros para escribir 1, escribir 0 y leer deben ser algo como esto:

#define  set_dqout()    (DALLAS_DDR&=~DALLAS_PIN)   /* Let the pull-up force one, putting I/O pin in input mode */
#define  reset_dqout()  (DALLAS_DDR|=DALLAS_PIN,DALLAS_PORT&=~DALLAS_PIN) /* force zero putting the I/O in output mode and writing zero on it */
#define  read_dqin()    (DALLAS_DDR&=~DALLAS_PIN,((DALLAS_PORT & DALLAS_PIN)!= 0)) /* put i/o in input mode and test the state of the i/o pin */

Espero que esto pueda ayudar.

Saludos!

Si se realizan pruebas de bits, es bueno tener en cuenta el orden de evaluación del operador de C, por ejemplo.

if( port & 0x80 && whatever() )

puede provocar un comportamiento inesperado, como acabas de escribir

if( port & (0x80 && whatever()) )

pero probablemente ment

if( (port & 0x80) && whatever() )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top