Come ottenere valore dal 15 ° pin della porta a 32 bit in ARM?
-
05-07-2019 - |
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.
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() )