Domanda

Sto usando un IC, DS1620 per leggere i dati seriali a 1 bit che arrivano su una sola riga. Ho bisogno di leggere questi dati usando una delle porte del microcontrollore ARM (LPC2378). Le porte ARM sono a 32 bit. Come posso ottenere questo valore in una variabile da 1 bit?

Modifica: in altre parole ho bisogno di un riferimento diretto a un pin della porta.

È stato utile?

Soluzione

non ci sono variabili da 1 bit, ma è possibile isolare un bit particolare, ad esempio:

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: non so se stavi contando i numeri di bit a partire da 0 o 1, quindi > > 15 potrebbe essere disattivato da uno, ma ti viene l'idea.

L'altra opzione è quella di utilizzare i campi di bit, ma diventa disordinato e IMO non ne vale la pena a meno che ogni bit del valore non sia utile in qualche modo. Se vuoi solo uno o due bit, spostare e mascherare è la strada da percorrere.

Nel complesso, questo articolo potrebbe esserti utile.

Altri suggerimenti

Per la tua CPU dovrebbe essere usata la risposta di Evan Teran. Volevo solo menzionare la funzionalità bit-band di alcune altre CPU ARM come Cortex-M3. Per alcune regioni di RAM / periferiche tutti i bit sono mappati su un indirizzo separato per un facile accesso.

Vedi http: / /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html per ulteriori informazioni.

È semplice se puoi accedere direttamente al registro delle porte (non ho alcuna esperienza con ARM), solo bit a bit E con la maschera binaria che corrisponde al bit che desideri:

var = (PORT_REGISTER & 0x00008000);

Ora var contiene 0 se il 15 bit è '0' o 0x00008000 se il 15 bit è '1'.

Inoltre, puoi spostarlo se vuoi avere '0' o '1':

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

I file di intestazione forniti con il compilatore conterranno dichiarazioni per tutti i registri del microcontrollore e i bit in tali registri.

In questo articolo specifico, facciamo finta che il registro di input della porta sia chiamato PORTA e che il bit desiderato abbia una maschera definita per esso chiamata PORTA15 .

Quindi per leggere lo stato di quel pin:

PinIsSet = (PORTA & PORTA15) == PORTA15;

O in modo equivalente, utilizzando operatore ternario :

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

Come punto generale, fare riferimento al manuale di riferimento per ciò che fanno tutti i registri e i bit. Inoltre, guarda alcuni esempi. ( Questa pagina sul sito Web Keil contiene entrambi, e ce ne sono molti altri esempi sul Web.)

In LPC2378 (come l'altra famiglia di microcontrollori LPC2xxxx), le porte I / O sono nella memoria di sistema, quindi è necessario dichiarare alcune variabili come questa:

#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)

Si noti che 0xE0028000 è l'indirizzo per il registro dati della porta0 e 0xE0028008 è l'indirizzo del registro di direzione dati per la porta0. Devi modificarlo in base alla porta e al bit utilizzati nella tua app. Dopodiché, nella tua funzione di codice, il codice o le macro per scrivere 1, scrivere 0 e leggere devono essere qualcosa del genere:

#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 */

Spero che questo possa aiutare.

Saluti!

Se si esegue il test per i bit, è bene tenere presente l'ordine di valutazione dell'operatore di C, ad es.

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

può provocare comportamenti imprevisti, come hai appena scritto

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

ma probabilmente ment

if( (port & 0x80) && whatever() )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top