Go Down

Topic: Controllare stato dei pin (Read 11 times) previous topic - next topic

salvob

Salve ragazzi,

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

Michele Menniti


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

alexdb

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

leo72


igor10^12

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

Michele Menniti

#5
Aug 26, 2012, 08:29 pm Last Edit: Aug 26, 2012, 11:49 pm by Michele Menniti Reason: 1
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
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

igor10^12


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.

alexdb

#7
Aug 26, 2012, 10:01 pm Last Edit: Aug 26, 2012, 10:08 pm by alexdb Reason: 1
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: [Select]

stato=PORTB & 0x40;

//oppure

stato=PORTB & 0b0100000;

stato vale true se l'uscita è alta e false se è bassa...

igor10^12

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. ;)

Michele Menniti

IGOR come la fai lunga, a buon rendere ]:D
@ 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? ]:D
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

superlol


IGOR come la fai lunga, a buon rendere ]:D
@ 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? ]:D

basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  :P
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Michele Menniti



IGOR come la fai lunga, a buon rendere ]:D
@ 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? ]:D

basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  :P

quindi ancora più semplice! bene, bene, ci pensi tu allora?
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

superlol




IGOR come la fai lunga, a buon rendere ]:D
@ 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? ]:D

basterebbe riprendere il codice usato per il digitalWrite in teoria ma invece che in scrittura va in lettura  :P

quindi ancora più semplice! bene, bene, ci pensi tu allora?

Code: [Select]

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: [Select]
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: [Select]
0
32
0
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

superlol

#13
Aug 27, 2012, 12:31 am Last Edit: Aug 27, 2012, 12:39 am by superlol Reason: 1
ho aggirato il problema  XD
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 XD
Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
       int rimanda = *portInputRegister(port) & bit;
return rimanda >> pin;
}
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

leo72

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?

Go Up