Newsgroup: it.hobby.elettronica.digitale
Titolo: Toggle di un pin su un ARM

Salve a tutti,
sto facendo delle prove con un ARM NXP cortex M3.
Rispetto ai micro della Microchip però, con cui ho piu familiarità,
non riesco a trovare un modo rapido per fare il toggle di un pin
perchè non ci sono i dati di tipo bit.
Come posso fare ad eseguire un'istruzione tipo questa? pin_A=!pin_A;
N.B per settare un'uscita devo alzare un bit su un registro, mentre
per resettarla devo agire su un altro registro!
 
grazie
 

 per resettarla devo agire su un altro registro!
 
Non so se ho capito bene la tua domanda, comunqe nell'stm32
ci sono i registri BSRR e BRR che mappano la porta bit per bit.
Credo che NXP sia simile se non uguale.
BRR e' da 16 bit e resetta i pin corrispondenti ai bit che
metti a 1.
BSRR e' da 32 bit, si comporta come BRR nei 16 bit alti (31:16)
mentre setta il pin corrispondente ai bit messi a 1 nei 16
bit inferiori (15:0).
Per fare un toggle su GPIOA 4 la sequenza e':
 
GPIOA->BSRR=(1<<4); //pin a 1
GPIOA->BRR=(1<<4); //pin a 0
 
oppure
 
GPIOA->BSRR=GPIO_Pin_4; //pin a 1
GPIOA->BRR=GPIO_Pin_4; //pin a 0
 
Cmq non aspettarti di vedere il pin
andare su e giu alla frequenza di clock :)
 
Fabio.
 
 


 
Mai sentita una cosa del genere... sei sicuro?

 Mai sentita una cosa del genere... sei sicuro?
 
sembra strano anche a me, ma se vedi la risposta di Fabio, sembra
essere così anche per lui ...

 GPIOA->BRR=GPIO_Pin_4; //pin a 0
 
 
Ecco appunto ... ma se devo fare il toggle allora, devo andare a
leggere in quale stato si trova il bit e fare a seconda del caso una
di queste due sequenze?
Altra domanda: si può mappare il registro BSRR o BRR con accesso a bit
(usando strutture con i bitfield?)
 
grazie

 andare su e giu alla frequenza di clock :)
 
 
Questa è stata la prima delusione di quando ho avuto a che fare con 
microcontrollori più cicci di un normale AVR 8-bit ;)
 
Marco
 

 essere cosě anche per lui ...
 
sugli LPC17xx ( se dici di usare un M3 NXP dovrebbero essere loro ) puoi
 
1) scrivere un valore nel registro d'uscita ( a 8 /16/32 bit ),
   FIOxPIN = valore
2) settare uno o piu' 1 nel registro d'uscita
   FIOxSET = maschera
3) settare uno o piu' 0 nel registro d'uscita
   FIOxCLR = maschera
4) commutare uno o piu' bit del registro d'uscita tramite una xor con 
una opportuna maschera
   FIOxPIN ^= maschera
 
x varia tra 0 e 4 per le varie porte di io
( i dettagli della effettiva sintassi C sono stati "omessi" )
ti consiglio CALDAMENTE di scaricarti e LEGGERE l'user manual ;-)

 di queste due sequenze?
 
Ecco, allora non avevo capito, fai lo xor sul registro di uscita,
per l'stm32 e' ODR, qualcosa tipo:
GPIOA->ODR ^=  ( 1 << 4 );
per il micro che usi tu mmm ti ha dato una risposta esaustiva
e un buon consiglio ;)
 
Per l'altra domanda credo tu possa farlo, se poi e' una scelta saggia
non so, non sono esperto, ma la libreria dovrebbe darti gia' gli
strumenti per accedere ai singoli pin.
 
Fabio.
 
 

    FIOxPIN ^= maschera
 
Ok grazie.
Secondo te, posso fare qualcosa per mappare il registro usando una struttura con bitfield in modo da rendere utilizzabile una scrittura del tipo
pinA=!pinA;
 
Te lo chiedo perchè ho la necessità di riutilizzare del codice C scritto per microchip dove si poteva fare questa operazione, essendoci i dati di tipo bit.
 
grazie 
 

 
 
mi correggo, a livello assembler i PIC HANNO istruzioni di bit set e 
probabilmente il compilatore ne tiene conto quando accede ai bitfield ( 
l'ho appena notato su una discussione sulla densita di codice in un NG 
americano ;-) )


Certo, con gli NPX hai i registri FIOxCLR e FIOxSET di
manipolazione di uno o piu' bit di una porta :
è l'equivalente del bitclr / bitset solo che possono
operare contemporameamente su tutti i bit della porta:
L' operazione e' atomica e immediata :
  FIOxCLR= 0x11    Azzera il bit #16 e il bit #0
  FIOxSET= 0x21    alza il bit #17 e il bit #1
I bit a 0 sono ignorati e mantengono il loro stato.
 
Puo anche usare il registro FIOxPIN, che rappresenta
lo stato della porta: in questo caso tutto il valore
è significativo.
 
AA.