Go Down

Topic: Controllare stato dei pin (Read 16334 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


http://www.arduino.cc/en/Reference/PortManipulation
leggi lo stato dal registro..

Quoto

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
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

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
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

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;
}
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy