Progettare con la logica dell'operatore bitwise

Sfruttare la potenza dei segnali digitali e dell'hardware digitale

Le seguenti informazioni hanno lo scopo di introdurre la logica bitwise AND (&) e chiarire i concetti presentati nel blog: La manipolazione diretta delle porte. Questo esempio illustra il funzionamento di un cursore per telecamera azionata da un motore passo-passo con diversi pulsanti e controllo con potenziometro. Il microcontroller scelto ha un I/O limitato distribuito su molte porte, che viene gestito assemblando l'I/O in singoli valori digitali.

Panoramica

La valutazione degli input degli interruttori nel software spesso inizia con le dichiarazioni if/then. Se questo potrebbe andar bene per un ingresso standalone, non può dirsi lo stesso nel caso di più ingressi interattivi. Coprire tutte le combinazioni di pressione dei pulsanti con istruzioni if/then potrebbe generare centinaia di righe di codice e una moltitudine di esecuzioni per ogni ciclo. L'implementazione della logica bitwise riduce il codice al minimo e aumenta la velocità del ciclo.

Parametri di progetto

Il progetto del cursore per telecamera prevede cinque interruttori SPST a contatto momentaneo per selezionare la direzione e la velocità nel funzionamento del motore di azionamento con il cursore. L'ingresso viene convertito nell'uscita SPEED/ENABLE/DIRECTION. Le pressioni degli interruttori sono memorizzate nel software insieme alla discriminazione delle pressioni dei vari interruttori.

Operatore bitwise AND

Il principale operatore bitwise usato per il cursore della telecamera è AND, che usa il simbolo ampersand (&) nella programmazione del linguaggio C e utilizza la tabella di verità nella Figura 1.

Figura 1: Tabella di verità dell'operatore bitwise AND ed esempi. (Immagine per gentile concessione di Don Johanneck)

Combinazione di I/O

Per costruire un singolo valore che rappresenti tutti gli interruttori, i bit vengono spostati nel posto desiderato, sommati e confrontati usando l'operatore AND (Figura 2). Un altro valore che rappresenta lo stato attuale dei sensori di limite viene confrontato con il valore della pressione dell'interruttore per negare l'uscita se viene raggiunto un limite.

Figura 2: Configurazione degli interruttori del cursore della telecamera, compilazione di bit e uso dell'operatore AND. (Immagine per gentile concessione di Don Johanneck)

In questo scenario, se viene premuto qualsiasi pulsante o una qualsiasi combinazione di pulsanti, buttonValues non è uguale a zero e l'azione viene presa nel software usando le tabelle limitValue e lookup per determinare l'uscita esattamente come descritto nel blog Manipolazione diretta delle porte ricordato prima.

Programmazione

Il programma utilizza una tabella di valori di uscita indicizzati dal valore di ingresso elaborato. Il programmatore può stabilire l'azione che risulta da qualsiasi combinazione di pulsanti premuti cambiando i valori della tabella, eliminando la necessità di modificare la struttura del programma, cosa che può essere scoraggiante. I valori della tabella nella Figura 3 per questo esempio rappresentano azioni di pulsanti singoli, multipli e opposti senza una singola istruzione IF (Figura 4).

Figura 3: Tabella di valori di uscita unici indicizzati dal valore di ingresso.

Figura 4: Codice principale; leggere i valori e stabilire l'uscita.

Il controllo del motore si ottiene usando una routine di servizio di interrupt del timer che determina la frequenza di passo e un metodo di "salto" che facilita il controllo della velocità impostando il pin STEP sulla scheda di controllo del motore solo quando la variabile stepGo è uguale o maggiore della variabile stepFreq (Figura 5). Con valori del potenziometro più bassi, la routine salta più STEP.

Figura 5: Routine di servizio di interrupt del controllo del motore.

Conclusione:

L'uso di operatori bitwise come AND (&) semplifica il codice e riduce enormemente il numero di istruzioni IF necessarie per analizzare gli ingressi digitali. Creare la tabella di uscita è un'operazione semplice e flessibile. L'utilizzo di più bit di uscita espande rapidamente la tabella e offre un maggior numero di opzioni di uscita. Ogni bit di uscita in più richiede un gestore aggiuntivo nel codice principale. Una volta stabilita, la tabella viene usata solo una volta per ciclo e il codice principale si fa carico del lavoro pesante. La routine di servizio dell'interrupt opera costantemente in background aggiornando il pin STEP del controller del motore, ma il movimento avviene solo quando il codice principale attiva il pin di abilitazione (ENN) del controller del motore.

Informazioni su questo autore

Image of Don Johanneck

Don Johanneck, Technical Content Developer presso DigiKey, lavora in azienda dal 2014. Di recente promosso alla sua attuale posizione, è responsabile delle descrizioni per i video e dei contenuti di prodotto. Don ha conseguito una laurea tecnico-scientifica in Electronics Technology & Automated Systems presso Northland Community & Technical College attraverso il programma di borse di studio DigiKey. Ama il modellismo radiocomandato, il restauro di auto d'epoca e il bricolage.

More posts by Don Johanneck
 TechForum

Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.

Visit TechForum