Question

J'utilise un circuit intégré, le DS1620, pour lire les données série à 1 bit arrivant sur une seule ligne. J'ai besoin de lire ces données en utilisant l'un des ports du microcontrôleur ARM (LPC2378). Les ports ARM sont en 32 bits. Comment puis-je obtenir cette valeur dans une variable de 1 bit?

Modifier: En d’autres termes, j’ai besoin d’une référence directe à une broche de port.

Était-ce utile?

La solution

il n'y a pas de variable 1 bit, mais vous pouvez isoler un bit particulier, par exemple:

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

Remarque: je ne sais pas si vous comptiez des nombres de bits commençant à 0 ou à 1, le > > 15 peut être un par un, mais vous avez l'idée.

L’autre option consiste à utiliser des champs de bits, mais cela devient confus et IMO n’en vaut la peine que si chaque bit de la valeur est utile. Si vous voulez juste un ou deux bits, le décalage et le masquage sont la voie à suivre.

Dans l’ensemble, cet article peut vous être utile.

Autres conseils

Pour votre processeur, utilisez la réponse d’Evan Teran. Je voulais juste mentionner la fonctionnalité de bande de bits de certains autres processeurs ARM tels que le Cortex-M3. Pour certaines régions de RAM / périphériques, tous les bits sont mappés sur une adresse distincte pour un accès facile.

Voir http: / /infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/Behcjiic.html pour plus d'informations.

C’est simple si vous pouvez accéder directement au registre de ports (je n’ai aucune expérience d’ARM), il suffit de le faire au niveau du bit ET avec le masque binaire qui correspond au bit que vous souhaitez:

var = (PORT_REGISTER & 0x00008000);

Maintenant, var contient 0 si le 15ème bit est à "0" ou 0x00008000 si le 15ème bit est à "1".

De plus, vous pouvez le décaler si vous voulez avoir "0" ou "1":

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

Le ou les fichiers d’en-tête fournis avec votre compilateur contiennent des déclarations relatives à tous les registres du microcontrôleur et aux bits qu’ils contiennent.

Dans cet article spécifique, supposons que le registre d'entrée de port s'appelle PORTA et que le bit que vous souhaitez comporte un masque appelé PORTA15 .

Ensuite, pour lire l'état de cette broche:

PinIsSet = (PORTA & PORTA15) == PORTA15;

Ou, de manière équivalente, à l'aide de opérateur ternaire :

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

De manière générale, reportez-vous au manuel de référence pour connaître le fonctionnement de tous les registres et bits. Regardez aussi quelques exemples. ( cette page du site Web de Keil contient les deux, et il existe de nombreuses autres exemples sur le Web.)

Dans LPC2378 (comme l’autre famille de microcontrôleurs LPC2xxxx), les ports d’E / S sont dans la mémoire système. Vous devez donc déclarer certaines variables comme ceci:

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

Veuillez noter que 0xE0028000 est l'adresse du registre de données du port0 et 0xE0028008 l'adresse du registre de direction des données pour le port0. Vous devez modifier cela en fonction du port et du bit utilisés dans votre application. Après cela, dans votre fonction de code, le code ou les macros pour écrire 1, écrire 0 et lire doivent ressembler à ceci:

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

J'espère que cela peut aider.

Cordialement!

Si vous testez des bits, il est bon de garder à l'esprit l'ordre d'évaluation de l'opérateur de C, par exemple.

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

peut entraîner un comportement inattendu, comme vous venez de l'écrire

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

mais probablement

if( (port & 0x80) && whatever() )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top