Pages: [1] 2 3 ... 11   Go Down
Author Topic: Controllare stato dei pin  (Read 9866 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 20
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salve ragazzi,

esiste una funzione oppure un modo per capire se un determinato pin è impostato come OUTPUT oppure INPUT?
Logged

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 564
Posts: 12459
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Offline Offline
Sr. Member
****
Karma: 2
Posts: 328
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Quoto
Logged


Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 Offline
Shannon Member
****
Karma: 564
Posts: 12459
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Taranto, Puglia
Offline Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sweat

stasera faccio una prova io per vedere se DDR restituisce il valore.
Logged


Offline Offline
Sr. Member
****
Karma: 2
Posts: 328
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
Code:
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 Offline
God Member
*****
Karma: 1
Posts: 758
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 564
Posts: 12459
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

IGOR come la fai lunga, a buon rendere smiley-twist
@ 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? smiley-twist
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

IGOR come la fai lunga, a buon rendere smiley-twist
@ 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? smiley-twist
basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  smiley-razz
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Lamezia Terme
Offline Offline
Shannon Member
****
Karma: 564
Posts: 12459
Le domande di chi vuol imparare rappresentano la sua sete di sapere
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

IGOR come la fai lunga, a buon rendere smiley-twist
@ 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? smiley-twist
basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  smiley-razz
quindi ancora più semplice! bene, bene, ci pensi tu allora?
Logged

Guida alla programmazione ISP e seriale dei micro ATMEL (Caricare bootloader e sketch):
http://www.michelemenniti.it/Arduino_burn_bootloader.php
Guida alla Programmazione ATmega328 noP:
http://www.michelemenniti.it/atmega328nop.html
Articoli su Elettronica In:
http://www.michelemenniti.it/elettronica_in.html

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

IGOR come la fai lunga, a buon rendere smiley-twist
@ 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? smiley-twist
basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  smiley-razz
quindi ancora più semplice! bene, bene, ci pensi tu allora?
Code:
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

Code:
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
Code:
0
32
0
Logged

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Riva del Garda, TN / Forlì
Offline Offline
Edison Member
*
Karma: 8
Posts: 2246
Il piu' modesto al mondo
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ho aggirato il problema  smiley-lol
modo poco elegante lo so ma ammetto che operazioni coi bit non le so fare  smiley-roll-blue


testate ma dovrebbe andare

EDIT:
ok ok usiamo il bit shift smiley-lol
Code:
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

Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

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

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


Pages: [1] 2 3 ... 11   Go Up
Jump to: