Scrittura sui registri

Sera a tutti

Avrei necessità che il programma commutasse autonomamente un pin settato come input per eseguire una serie di istruzioni che verrebbero fatte premendo ugualmente un pulsante, l'istruzione come riportato nel "port manipolation" non lo consente.

es:

MEGA 2560
il pin 32 appartiene al PORTC bit 5

DDRC = B00100000;  //pin 32 in INPUT

essendo un input non posso usare

digitalWrite(32, 1);

nemmeno 
PORTC |=  _BV(PORTC5);               
PORTC &= ~_BV(PORTC5);

nemmeno 
PORTC=32;

nemmeno
bitWrite(PORTC,5,1);

Queste istruzioni funzionano solo se il pin è settato come output, c'è un modo per scrivere forzatamente sul registro usando un altro sistema?

grazie ciao

pablos:
Avrei necessità che il programma commutasse autonomamente un pin settato come input per eseguire una serie di istruzioni che verrebbero fatte premendo ugualmente un pulsante, l'istruzione come riportato nel "port manipolation" non lo consente.

Per cambiare stato ad un pin questo deve essere settato come Output, se è un input non puoi farlo, e mi pare una cosa logica :slight_smile:
Ovviamente nulla vieta di cambiare la direzione del pin dinamicamente durante l'esecuzione del programma compatibilmente con le condizioni hardware, ovvero non è detto che un pin utilizzato come input si possa settare come output senza fare danni.

se è un input non puoi farlo, e mi pare una cosa logica

Concordo, è logico, ma quel registro diventa 1 quando l’input passa a 1, qualcosa nel core ci va a scrivere, perchè se tengo il pulsante chiuso e leggo il registro 8 bit PINC è =32, pensavo magari ci fosse qualcosa di più profondo a livello assembler.

Cambiare in corsa il pinmode, si ci avevo pensato, ma non conosco l’hardware o meglio non sono tenuto a conoscerlo, so solo che quel pin è usato come output.

pablos:
Concordo, è logico, ma quel registro diventa 1 quando l'input passa a 1, qualcosa nel core ci va a scrivere, perchè se tengo il pulsante chiuso e leggo il registro 8 bit PINC è =32, pensavo magari ci fosse qualcosa di più profondo a livello assembler.

Ti sfugge il fatto che il pin è legato a due registri, PORTx per la scrittura e PINx per la lettura, sono due cose diverse e scrivendo su PORTx non puoi cambiare PINx e non puoi scrivere su PINx perché è un registro di sola lettura.

Mi sa che è sfuggito qualcosa a te di quello che ho scritto :slight_smile:

leggo il registro 8 bit PINC è =32,

il PINx l’ho usato in lettura forse quell’ = ti ha fatto sembrare che gli assegnassi un valore

PORTC |= _BV(PORTC5);
PORTC &= ~_BV(PORTC5);
PORTC=32;
bitWrite(PORTC,5,1);

il PORTx l’ho usato in scrittura

Sto usando da molto il PINx e il PORTx e mi trovo molto bene, nelle ultime versioni degli sketch non ho mai più usato il digitalwrite, digitalread e il pinmode uso solo i registri

pablos:
Mi sa che è sfuggito qualcosa a te di quello che ho scritto :slight_smile:

I casi sono due, o non capito quello che vuoi fare oppure tu non hai capito quello che ti ho detto.
Se ho compreso correttamente il tuo problema è che vuoi simulare un input scrivendo su un pin, bene questo non è possibile farlo perché il registro di input è diverso da quello di output, scrivendo sul secondo non cambi lo stato del primo, non puoi nemmeno scrivere direttamente sul registro di input perché è solo in lettura.

Ad esser sinceri, se setti ad 1 un pin tramite PORTx quando quel pin è settato come input da DDx, ne attivi la pull-up interna.

leo72:
Ad esser sinceri, se setti ad 1 un pin tramite PORTx quando quel pin è settato come input da DDx, ne attivi la pull-up interna.

Si, ma non scrivi su PINx 1, ovvio che se l’input è flottante va a 1 logico per effetto della pull up, però se poi la disattivi non hai alcuna certezza sullo stato logico che va ad assumere il pin di input flottante.

astrobeed:
Si, ma non scrivi su PINx 1, ovvio che se l’input è flottante va a 1 logico per effetto della pull up, però se poi la disattivi non hai alcuna certezza sullo stato logico che va ad assumere il pin di input flottante.

+1

che vuoi simulare un input scrivendo su un pin

Si +/- questo, non voglio scrivere su un pin ma nel registro, cioè analizzando i passaggi logici

  • dall'esterno del chip metto a 1 un input (pin 32)
  • leggendo il reg PINC vediamo il valore 32 o meglio il bit 5 di quel registro assume val 1

mi avrebbe fatto comodo ingannare il chip dall'interno, ma se non è possibile carico i valori di PINx in un altra var e manipolo quella, poi il codice interpreterà il dovuto, grazie lo stesso

Ps: il PORTx può esserie usato anche in lettura

ciao

pablos:
Ps: il PORTx può esserie usato anche in lettura

Sì, insieme a DDx. Solo PINx è a sola lettura.