Offline
Newbie
Karma: 0
Posts: 17
|
 |
« on: August 25, 2012, 08:23:00 am » |
Salve ragazzi,
esiste una funzione oppure un modo per capire se un determinato pin è impostato come OUTPUT oppure INPUT?
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #1 on: August 25, 2012, 08:33:19 am » |
Salve ragazzi,
esiste una funzione oppure un modo per capire se un determinato pin è impostato come OUTPUT oppure INPUT?
Ho trovato questo nel PlayGround, prova a vedere se ti può tornare utle.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 2
Posts: 328
|
 |
« Reply #2 on: August 25, 2012, 09:59:16 am » |
hai due modi:
1) quando setti una porta alta o bassa ti salvi lo stato su una variabile 2)http://www.arduino.cc/en/Reference/PortManipulation leggi lo stato dal registro..
|
|
|
|
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #3 on: August 25, 2012, 04:35:14 pm » |
|
|
|
|
|
Logged
|
|
|
|
|
Taranto, Puglia
Offline
God Member
Karma: 1
Posts: 755
|
 |
« Reply #4 on: August 26, 2012, 06:43:02 am » |
come ti hanno detto prima dei usare il port manipulation, in particolare con DDRx x sta per il nome della porta quale a,b,c,d ecc a sconda del microcontrollore. se un pin è settato a 1 allora significa che è un output. DDRx ti restituisce mi pare un byte, ogni bit corrisponde a un pindi quella porta
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #5 on: August 26, 2012, 01:29:12 pm » |
Dunque: PORTD = 0x00; resetta le linee DATA ponendole a LOW (0xFF = tutte HIGH) DDRD = 0x00; imposta le linee DATA come ingressi (0xFF = tutte uscite)
Naturalmente è possibile scrivere il dato in formato binario tipo 0b00000000 Sinceramente non ho mai provato se scrivendo semplicemente
DDRD PORTD
viene restituito il valore attuale o meno, sarebbe interessante saperlo, oltretutto si risolverebbe all'istante il problema di salvob.
Ma al limite credo lo si possa assegnare ad una variabile e risovere facilmente
|
|
|
|
« Last Edit: August 26, 2012, 04:49:45 pm by Michele Menniti »
|
Logged
|
|
|
|
|
Taranto, Puglia
Offline
God Member
Karma: 1
Posts: 755
|
 |
« Reply #6 on: August 26, 2012, 01:35:31 pm » |
Dunque: PORTD = 0x00; resetta le linee DATA ponendole a LOW (0xFF = tutte HIGH) DDRD = 0x00; imposta le linee DATA come ingressi (0xFF = tutte uscite)
Naturalmente è possibile scrivere il dato in formato binario tipo b00000000 Sinceramente non ho mai provato se scrivendo semplicemente
DDRD PORTD
viene restituito il valore attuale o meno, sarebbe interessante saperlo, oltretutto si risolverebbe all'istante il problema di salvob.
Ma al limite credo lo si possa assegnare ad una variabile e risovere facilmente
michele ti correggo, non si puo scrivere b00000000 ma B00000000 o 0b0000000, altrimenti andiamo di hex  stasera faccio una prova io per vedere se DDR restituisce il valore.
|
|
|
|
|
Logged
|
|
|
|
|
Offline
Sr. Member
Karma: 2
Posts: 328
|
 |
« Reply #7 on: August 26, 2012, 03:01:06 pm » |
si restituisce il valore...dovete vederlo come se fosse una variabile qualsiasi... in pratica: supponiamo che devi leggere il valore del digital pin 9.. il digital pin 9 è il bit 1 della porta B, cioè PB1..(vedi Datasheet) quindi: stato=PORTB & 0x40;
//oppure
stato=PORTB & 0b0100000;
stato vale true se l'uscita è alta e false se è bassa...
|
|
|
|
« Last Edit: August 26, 2012, 03:08:07 pm by alexdb »
|
Logged
|
|
|
|
|
Taranto, Puglia
Offline
God Member
Karma: 1
Posts: 755
|
 |
« Reply #8 on: August 26, 2012, 03:10:24 pm » |
poco fa ho provato e posso confermare che si puo usare come uan variabile. ovviamente se vuoi vedere i singoli bit devi farti delel conversioni da decimale a binario. leggiti il prot mapping così ti sarà faile avere lo stato di tutti i pin in poche righe di codice. 
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #9 on: August 26, 2012, 04:54:45 pm » |
IGOR come la fai lunga, a buon rendere  @ entrambi: grazie delle prove fatte, ora potreste anche essere così gentili e scrivere una piccola lib con cui si possa interrogare lo stato di un QUALSIASI PIN del micro (prevedete le porte da A a D), di una qualsiasi "linea" (0-7A,B,C,D) o dell'intero gruppo di linee? Ve la cavate con poco e rendete un bel servizio al Forum. Chi se la prende la responsabilità? O devo al solito mettermi io mentre voi state a divertirvi? 
|
|
|
|
|
Logged
|
|
|
|
|
Riva del Garda, TN / Forlì
Offline
Edison Member
Karma: 7
Posts: 2071
Il piu' modesto al mondo
|
 |
« Reply #10 on: August 26, 2012, 04:58:32 pm » |
IGOR come la fai lunga, a buon rendere  @ entrambi: grazie delle prove fatte, ora potreste anche essere così gentili e scrivere una piccola lib con cui si possa interrogare lo stato di un QUALSIASI PIN del micro (prevedete le porte da A a D), di una qualsiasi "linea" (0-7A,B,C,D) o dell'intero gruppo di linee? Ve la cavate con poco e rendete un bel servizio al Forum. Chi se la prende la responsabilità? O devo al solito mettermi io mentre voi state a divertirvi?  basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura 
|
|
|
|
|
Logged
|
|
|
|
|
Lamezia Terme
Offline
Shannon Member
Karma: 386
Posts: 10228
Le domande di chi vuol imparare rappresentano la sua sete di sapere
|
 |
« Reply #11 on: August 26, 2012, 05:21:05 pm » |
IGOR come la fai lunga, a buon rendere  @ entrambi: grazie delle prove fatte, ora potreste anche essere così gentili e scrivere una piccola lib con cui si possa interrogare lo stato di un QUALSIASI PIN del micro (prevedete le porte da A a D), di una qualsiasi "linea" (0-7A,B,C,D) o dell'intero gruppo di linee? Ve la cavate con poco e rendete un bel servizio al Forum. Chi se la prende la responsabilità? O devo al solito mettermi io mentre voi state a divertirvi?  basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  quindi ancora più semplice! bene, bene, ci pensi tu allora?
|
|
|
|
|
Logged
|
|
|
|
|
Riva del Garda, TN / Forlì
Offline
Edison Member
Karma: 7
Posts: 2071
Il piu' modesto al mondo
|
 |
« Reply #12 on: August 26, 2012, 05:25:19 pm » |
IGOR come la fai lunga, a buon rendere  @ entrambi: grazie delle prove fatte, ora potreste anche essere così gentili e scrivere una piccola lib con cui si possa interrogare lo stato di un QUALSIASI PIN del micro (prevedete le porte da A a D), di una qualsiasi "linea" (0-7A,B,C,D) o dell'intero gruppo di linee? Ve la cavate con poco e rendete un bel servizio al Forum. Chi se la prende la responsabilità? O devo al solito mettermi io mentre voi state a divertirvi?  basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  quindi ancora più semplice! bene, bene, ci pensi tu allora? boolean whatWritten(int pin) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin);
return *portInputRegister(port) & bit; }
per ora sono arrivato a questo, i fase di test in quanto sembra funzionare ma non mi pare fare lo shift del bit ad esempio boolean whatWritten(int pin) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin);
return *portInputRegister(port) & bit; }
void setup() { Serial.begin(9600); pinMode(5, OUTPUT); Serial.println(whatWritten(5)); digitalWrite(5, HIGH); Serial.println(whatWritten(5)); digitalWrite(5, LOW); Serial.println(whatWritten(5)); }
void loop() { }; in seriale printa 0 32 0
|
|
|
|
|
Logged
|
|
|
|
|
Riva del Garda, TN / Forlì
Offline
Edison Member
Karma: 7
Posts: 2071
Il piu' modesto al mondo
|
 |
« Reply #13 on: August 26, 2012, 05:31:28 pm » |
ho aggirato il problema  modo poco elegante lo so ma ammetto che operazioni coi bit non le so fare  testate ma dovrebbe andare EDIT: ok ok usiamo il bit shift  boolean whatWritten(int pin) { uint8_t bit = digitalPinToBitMask(pin); uint8_t port = digitalPinToPort(pin); int rimanda = *portInputRegister(port) & bit; return rimanda >> pin; }
|
|
|
|
« Last Edit: August 26, 2012, 05:39:43 pm by superlol »
|
Logged
|
|
|
|
|
Forum Moderator
Italy
Offline
Brattain Member
Karma: 219
Posts: 16431
Don't know what I do
|
 |
« Reply #14 on: August 27, 2012, 03:11:19 am » |
Non l'ho testato ma ho una domanda. Perché usi un integer quando i registri sono ad 8 bit, quindi gestibili con un semplice tipo byte?
|
|
|
|
|
Logged
|
|
|
|
|
|