Pergunta

Eu estou usando um IC, DS1620 para ler um bit de dados seriais que vêm em uma única linha. Eu preciso ler esses dados usando uma das portas de ARM microcontrolador (LPC2378). portos ARM são de 32 bits. Como faço para obter esse valor em uma variável de 1 bit?

Edit: Em outras palavras eu preciso referência direta a um pino da porta .

Foi útil?

Solução

não há variáveis ??de 1 bit, mas você poderia isolar um pouco particular, por exemplo:

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:. Eu não sei se você estivesse contando números de bits a partir de 0 ou 1, de modo que o >> 15 podem estar fora por um, mas você começa a idéia

A outra opção é a campos utilização bits, mas isso fica confuso e IMO não vale a pena a menos que cada bit do valor é útil de alguma forma. Se você quer apenas um ou dois bits, deslocamento e mascaramento é o caminho a percorrer.

No geral, este artigo podem ser de utilidade para você.

Outras dicas

Para o seu CPU a resposta de Evan Teran deve ser usado. Eu só queria mencionar o recurso de banda pouco de alguma outra CPU ARM de como o Cortex-M3. Por alguma região de RAM / Periféricos todos os bits são mapeados para um endereço separado para facilitar o acesso.

Consulte http: / /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html para obter mais informações.

É simples se você pode acessar a porta registrar diretamente (eu não tenho nenhuma experiência com ARM), apenas bit a bit E com a máscara binária que corresponde ao bit que você quer:

var = (PORT_REGISTER & 0x00008000);

Agora var contém ou 0 se o bit 15 é '0' ou 0x00008000 Se o bit 15 é '1'.

Além disso, você pode transferi-lo se você quiser ter ou '0' ou '1':

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

O arquivo de cabeçalho (s) que vêm com o seu compilador contém declarações para todos os registradores do microcontrolador, e os bits nesses registos.

Neste artigo específico, vamos fingir que o registo de entrada da porta é chamado PORTA, eo pouco que você quer tem uma máscara definida para ele chamado PORTA15.

Depois de ler o estado de que o pino:

PinIsSet = (PORTA & PORTA15) == PORTA15;

ou equivalentemente, usando o ternário operador :

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

Como ponto geral, consulte o manual de referência para que todos os registros e pedaços fazer. Além disso, olhar para alguns exemplos. ( Esta página no site Keil contém ambos, e há uma abundância de outros exemplos na web).

Em LPC2378 (como a outra família de microcontroladores LPC2xxxx), I / portas S estão na memória do sistema, de modo que você precisa declarar algumas variáveis ??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)

Por favor note que 0xE0028000 é o endereço para registro de port0 os dados e 0xE0028008 é o endereço de registro direção de dados para port0. Você precisa modificar este acordo com a porta e pouco usado em seu aplicativo. Depois disso, na sua função de código, o código ou macros para gravação 1, write 0 e de leitura deve ser algo como isto:

#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 isso pode ajudar.

Saudações!

Se o teste para bits, é bom ter em mente a ordem de avaliação do operador de C, por exemplo,

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

pode resultar em um comportamento inesperado, como você acabou de escrever

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

mas provavelmente ment

if( (port & 0x80) && whatever() )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top