MSP430, Microcontrollori 16 bit Ultra Low Power

Una base , ma base-base

  • Cosimix
  • Elit Utente
  • Elit Utente
Di più
6 Anni 11 Mesi fa #11 da Cosimix
Risposta da Cosimix al topic Una base , ma base-base
@simoblack, ho semplificato il codice proprio perché volevo essere sicuro che in ingresso ci fossero fisicamente i resistori di pull-down (o di pull-up). Quindi il codice che ho scritto funzionava al contrario?

Saluti,
Cosimo

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • simoblack
  • Autore della discussione
  • Nuovo Utente
  • Nuovo Utente
Di più
6 Anni 11 Mesi fa #12 da simoblack
Risposta da simoblack al topic Una base , ma base-base
Si, il tuo codice funzionava, come già detto avevo fatto delle prove e sono passato anche da lì. Una precisazione: se io scrivo P2out &= ~(BIT0 + BIT1) non avrò i due bit a 0, ma un'inversione dei bit come se scrivessi P2OUT ^= BIT0 + BIT1. Almeno questo è quello che mi sembra di riscontrare. I bit a zero li ottengo P2OUT = !(BIT0 + BIT1). Ora non vorrei aver detto cavolate, ovviamente ciò che ho scritto nel mio caso è tutto all'inverso, ma non riesco a trovare molto riscontro con la sintassi proposta nelle varie guide sugli msp430

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Cosimix
  • Elit Utente
  • Elit Utente
Di più
6 Anni 11 Mesi fa - 6 Anni 11 Mesi fa #13 da Cosimix
Risposta da Cosimix al topic Una base , ma base-base
Salve!

Quando dici che i due bit non vanno a zero intendi che non si spengono i led? Se non si spengono i led, evidentemente sono connessi con l'anodo all'alimentazione e con il catodo ai vari pin del microcontrollore.
L'istruzione:
Code:
P2OUT &= ~(BIT0 + BIT1);
esegue la somma di BIT0 con BIT1 (ossia 00000011), poi l'inversione dei singoli bit con l'operatore ~ (ossia 11111100) e poi esegue l'AND logico (bit a bit) con il valore di P2OUT. In questo modo, gli unici bit di P2OUT che saranno forzati a zero saranno proprio quelli meno significativi, mentre tutti gli altri resteranno invariati.

Con l'istruzione:
Code:
P2OUT ^= BIT0 + BIT1
esegui la somma di BIT0 con BIT1 (ossia 00000011), poi calcoli l'OR ESCLUSIVO con i bit di P2OUT e il risultato lo assegni a P2OUT. Quando hai un bit generico X (di valore 0 o 1) ed esegui l'OR ESCLUSIVO con il valore 0, il risultato del bit X non cambia. Il risultato invece si inverte se esegui l'OR ESCLUSIVO con il bit 1.
Esempio - Se P2OUT vale 01001101, allora il risultato di P2OUT ^= BIT0 + BIT1 è 01001110.

Con l'istruzione:
Code:
P2OUT = !(BIT0 + BIT1)
esegui invece la somma di BIT0 con BIT1 (ossia 00000011), applichi l'operatore logico NOT a tutta la parentesi (ottenendo quindi 00000000) e il valore lo assegni a P2OUT. Nota che 00000011 è "un qualcosa di vero", perché diverso da zero, quindi lo rendi falso se applichi l'operatore logico NOT (tutto falso!, perché non è un operatore bit a bit), ottenendo quindi 00000000.
In quest'ultimo caso devi fare un po' più di attenzione, perché mentre con |= e &= vai a mettere mani sui singoli bit, con l'operatore = applicato alla porta vai a forzare tutti i bit, e spesso il valore di alcuni di questi non vanno modificati (ad esempio quando utilizzi i resistori di pull-up interni).

Per vedere cosa succede con questi operatori, puoi utilizzare lo strumento di debug di Code Composer Studio.

Saluti,
Cosimo
Ultima Modifica 6 Anni 11 Mesi fa da Cosimix.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Cosimix
  • Elit Utente
  • Elit Utente
Di più
6 Anni 11 Mesi fa #14 da Cosimix
Risposta da Cosimix al topic Una base , ma base-base
Mi sono espresso male quando ho scritto:

mentre con |= e &= vai a mettere mani sui singoli bit, con l'operatore = applicato alla porta vai a forzare tutti i bit, e spesso il valore di alcuni di questi non vanno modificati

Anche con l'istruzione:
Code:
P2OUT = ...
vai a modificare i singoli bit, ma lo fai senza curarti di quello che potrebbe accadere agli altri bit della porta, mentre con
Code:
P2OUT |= ...
e
Code:
P2OUT &= ...
vai ad agire sul singolo bit senza fare danni a tutto il resto, proprio in virtù delle caratteristiche degli operatori logici.

Forse ho complicato ancor di più il concetto... :silly:

Saluti,
Cosimo

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi