Go Down

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

superlol



Premetto che ho partecipato marginalmente alla discussione, solo per dare pareri o criticare, quindi c'entro poco con lo sviluppo o non sviluppo della cosa.
Comunque non ragionavo in termini del tipo "non capisco a che serve, ergo non mi piace/la reputo inutile"  :P: ho soppesato l'utilità della cosa raffrontata al costo per metterla in pratica, ed ho valutato che è farla "universale" costa molto più di quel che offre o se realizzata per una specifica architettura oppure ancora mirata ad un uso specifico.

infatti tu hai preso legnate marginali ]:)
Toglimi una curiosità: posto che il comando DDRx fornisce tutte le info relative a IN/OUT e PORTx invece quelle relative a H/L, è davvero così complicato stabilire quante linee data ha il micro i questiore e ciclare questi due comandi per fornire un risultato?

arduino da questo punto di vista semplifica molto le cose grazie a dei define in pins_arduino.h che trovi sotto /hardware/arduino/variants/modello_arduino in quanto fornisce già il numero di pin della scheda e funzioni (come quelle che ho usato) per accedere facilmente ai registri
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

alexdb


quindi in futuro non tirate fuori idee ed ideuzze nella speranza che poi altri le realizzino ;)

ma rileggendo i post sinceramente mi sembra che l'idea della libreria sia stata tua..

menniti



quindi in futuro non tirate fuori idee ed ideuzze nella speranza che poi altri le realizzino ;)

ma rileggendo i post sinceramente mi sembra che l'idea della libreria sia stata tua..

certamente, perché a me piace concretizzare, ciò che intendo è che in seguito ad una richiesta escono fuori una serie di persone che "lanciano" soluzioni senza fornirle, o fornendo molliche di soluzione, allora io dico, visto che lo dite come se non ci volesse nulla postate la soluzione e, nello specifico, ho suggerito che potesse diventare una libreria.
Armiamoci e partite significa questo: suggerire agli agli come risolvere un problema, lavandosene le mani; se nei tuoi interventi non riconosci questo atteggiamento allora non mi rivolgevo a te, mica ho fatto nomi, sei tu che forse ti sei sentito pungere ;)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

superlol

Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

ecco questo dovrebbe essere per leggere gli stati

non l'ho provato però
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

menniti


Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

ecco questo dovrebbe essere per leggere gli stati

non l'ho provato però

se mi fornisci un minisketch completo lo provo io, altrimenti ti devi affidare a qualcuno che sa come implementare queste righe  :)
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

leo72

Bisogna usare le funzioni del core di Arduino per risalire dal numero di porta digitale passato all'effettivo pin e da questo alla porta logica di appartenenza di quel pin. Ciò che ha fatto superlol.
Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

Prima estrapola il bit e la porta del pin digitale passato come input e poi restituisce lo stato.
Ovviamente puoi avere anche indietro solo la porta.
Non serve neanche creare una libreria, il codice è già presente nel core di Arduino, quindi usabile.
Se tu in uno sketch metti
Code: [Select]
byte dimmiLaPorta = digitalPinToPort(pin);
hai già indietro la porta a cui appartiene il pin digitale.
Come vedi, perché creare una libreria che contiene a sua volta una funzione già presente? Le librerie si creano per grossi blocchi di codice, perché anche loro si portano dietro byte e byte di roba extra che appesantiscono il codice finale. Ha senso se hai una lib corposa (esempio: quella per gestire gli LCD o la SD) ma non ha senso se la funzione si riduce ad 1 riga di codice.

superlol

Code: [Select]
boolean dentroFuori(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

void setup() {
 Serial.begin(9600);
 
 for(int i=1; i=13; i++) {
   pinMode(i, OUTPUT);
   Serial.print(dentroFuori(i));
 }
 Serial.println("");

 for(int i=1; i=13; i++) {
   pinMode(i, INPUT);
   Serial.print(dentroFuori(i));
 }
 Serial.println("");

 for(int i=1; i<=13; i=i+2) {
   pinMode(i, OUTPUT);
 }
 for(int i=1; i=13; i++) {
   Serial.print(dentroFuori(i));
 }

}

void loop() { }


i risultati dovrebbero essere
Code: [Select]
0000000000000
1111111111111
0101010101010

(oppure invertiti su 1 e 0)
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

menniti

ottimo, grazie, quindi questo si riferisce alla lettura di 13 dei 20 pin di Arduino, è già un ottimo punto di partenza. Un solo chiarimento, ma il risultato cosa esprime: solo lo stato H/L o anche (e come) quello I/O?
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

igor99480

io sto comunque lavorando a questa cosa, quelel funzioni digitalpintoecc non le conoscevo ma ora ho capito come usarle.
la funzione d sl non funziona, mi restituisce sempre 0.
vedo di trovare qualche altra soluzione.

@menniti: ovviamente la risposta che diedi sul DDRx non era approfondita, ma mi aspettavo che l'utente che ha creato il 3d mi dicesse come si usa. in due pagine non ha deto a il ciò vuol dire che o sa gia come fare o non sta sul forum da parechio tempo.

io comunque qualcosa la sto facendo. la libreria è inutile invece pensavo che uno sketch di esempio da aggiungere nelal cartella examples potrebbe aiutare a ricordare la/e funzioni.
vi farò sapere appena concludo qualcosa

@menniti: dovrebbe indicare se è un pin è i/o

superlol


ottimo, grazie, quindi questo si riferisce alla lettura di 13 dei 20 pin di Arduino, è già un ottimo punto di partenza. Un solo chiarimento, ma il risultato cosa esprime: solo lo stato H/L o anche (e come) quello I/O?

allora
Code: [Select]
boolean dentroFuori(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

indica lo stato della porta se è input o output

per leggere se la porta è settata come HIGH o LOW puoi o usare questa funzione:
Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portInputRegister(port) & bit) == 0) ? 0:1;
}

oppure in teoria basterebbe anche fare un semplice digitalRead sulla porta

puoi inglobare le 2 funzioni comunque in modo che ritorni un array ma andresti a sprecare 4byte  XD (o almeno, non credo sia possibile fare array di boolean   :smiley-roll-sweat: )
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

superlol


io sto comunque lavorando a questa cosa, quelel funzioni digitalpintoecc non le conoscevo ma ora ho capito come usarle.
la funzione d sl non funziona, mi restituisce sempre 0.
vedo di trovare qualche altra soluzione.

@menniti: ovviamente la risposta che diedi sul DDRx non era approfondita, ma mi aspettavo che l'utente che ha creato il 3d mi dicesse come si usa. in due pagine non ha deto a il ciò vuol dire che o sa gia come fare o non sta sul forum da parechio tempo.

io comunque qualcosa la sto facendo. la libreria è inutile invece pensavo che uno sketch di esempio da aggiungere nelal cartella examples potrebbe aiutare a ricordare la/e funzioni.
vi farò sapere appena concludo qualcosa

@menniti: dovrebbe indicare se è un pin è i/o

prova a modificare da
Code: [Select]
boolean dentroFuori(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

a
Code: [Select]
int dentroFuori(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return *portModeRegister(port) & bit;
}

e printa il risultato (a me è arrivata la imu quindi sto giocherellando, poi sto pomeriggio giocata a softair quindi..  XD )
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

igor99480

in realtà l'ultimo sketch dovrebbe essere scritto così:
Code: [Select]

boolean dentroFuori(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portModeRegister(port) & bit) == 0) ? 0:1;
}

void setup() {
  Serial.begin(9600);
 
  for(int i=0; i<=13; i++) {
    pinMode(i, OUTPUT);
    Serial.print(dentroFuori(i));
  }
  Serial.println("");

  for(int i=0; i<=13; i++) {
    pinMode(i, INPUT);
    Serial.print(dentroFuori(i));
  }
  Serial.println("");
 
  for(int i=0; i<=13; i++) {
    pinMode(i, OUTPUT);
    Serial.print(dentroFuori(i));
  }
}

void loop() { }

altrimenti ti partonoo le print all'infinito o quasi. adesso funziona e il risultato è
11111111111111
00000000000000
11111111111111

ti eri dimenticato di mettere nel for che i=0 e non 1; i<=13 e non i=13; i++ e qui ci siamo.

non resta che includere un digital read e poi dare come return non il solito 0 o 1 ma input o output/high o low

superlol

l'ultimo era +2 e il print era a parte per verificare la "lettura alterna" e vedere se rompeva, comunque hai ragione colpa mia  XD
http://www.aug-altogarda.it/ <- Il nuovo AUG per basso trentino e dintorni!

menniti

4 byte? sono rovinato :smiley-mr-green: . No scherzi a parte, anche l'idea di Ogor non è male, cioè di fare uno sketch d'esempio, però mi piacerebbe molto arrivare ad un unico lavoro che possa dare un quadro istantaneo per come dicevo: singolo pin, intera linea, tutte le linee.
Quindi ora prendo queste informazioni ed al rientro (tra alcuni giorni), dopo aver sbrigato un paio di cose molo importanti, vedrò di lavorarci facendo un po' di prove.
Grazie.

Naturalmente se aggiungere altro codice prendo a piene mani, vi chiedo di aggiungere sempre due parole di spiegazione.

@ IGOR: e perché non fino a 19? così si leggerebbero anche gli altri 6 pin, certo poi bisognerebbe capire se sono usato o meno come input analogici
Manuale "Arduino e le tecniche di programmazione dei microcontrollori ATMEL"
http://www.michelemenniti.it/manuale_di_programmazione.html
http://www.michelemenniti.it/offerta.html
Articoli ElettronicaIN
http://www.michelemenniti.it/elettronica_in.html

igor99480


l'ultimo era +2 e il print era a parte per verificare la "lettura alterna" e vedere se rompeva, comunque hai ragione colpa mia  XD

ah già l'ho tolto io  :smiley-mr-green:
vabbè comunque funziona tutto. ora vedo di aggiungere i read degl stati e cambiare i return

@menniti: la funzione di sl ti restituisce lo stato di un singolo pin. lo sketch mette insieme tutti i pin perchè è fatto in quel modo.
certo il conto lo si puo fare fino a 19 bisogna vedere cosa esce. di certo non un valore analogico
ah se èun pin è in modalità pwm la laettura sarà 0 (intendo del valore high low)

Go Up