Pages: [1]   Go Down
Author Topic: Scrittura sui registri  (Read 664 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
DDRC = B00100000;  //pin 32 in INPUT

essendo un input non posso usare
Code:
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

« Last Edit: March 03, 2013, 03:33:06 pm by pablos » Logged

no comment

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 124
Posts: 9329
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
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.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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.

Logged

no comment

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 124
Posts: 9329
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Quote
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

Quote
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
« Last Edit: March 03, 2013, 05:12:21 pm by pablos » Logged

no comment

Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 124
Posts: 9329
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 124
Posts: 9329
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3389
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
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
« Last Edit: March 03, 2013, 05:51:44 pm by pablos » Logged

no comment

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 327
Posts: 22651
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Ps: il PORTx può esserie usato anche in lettura
Sì, insieme a DDx. Solo PINx è a sola lettura.
Logged


Pages: [1]   Go Up
Jump to: