Go Down

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

superlol


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?

hai ragione. Addirittura potrei non usare la variabile rimanda così da risparmiare anche 1 byte di ram XD piuttosto credo di aver fatto un errore sullo shift del bit. Funziona per le prime 8 porte ma poi correggo solo che non so se è più utile fare una cosa del tipo
Code: [Select]

Rimanda = (rimanda == 0) ? 0:rimanda/rimanda;
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

sono arrivato troppo tardi; vedo se mi metto al lavoro pure io tanto per fare qualcosa..
non ho  visto  bene, @sl hai fatto una funziona da mettere drettamente nello sketch?

alexdb



Code: [Select]

Rimanda = (rimanda == 0) ? 0:rimanda/rimanda;



si è molto meglio..., però scrivilo così:
Code: [Select]

rimanda= (rimanda==0)?0:1;

così risparmi una divisione.. ;)

superlol


sono arrivato troppo tardi; vedo se mi metto al lavoro pure io tanto per fare qualcosa..
non ho  visto  bene, @sl hai fatto una funziona da mettere drettamente nello sketch?


si ma puoi anche metterla in un file a parte e chiamarla "libreria"  XD solo che mettere una libreria per una funzione mi pare brutto,sarebbe carino se si facesse qualche altra funzione e si ingloba il tutto, allora avrebbe senso  :)




Code: [Select]

Rimanda = (rimanda == 0) ? 0:rimanda/rimanda;



si è molto meglio..., però scrivilo così:
Code: [Select]

rimanda= (rimanda==0)?0:1;

così risparmi una divisione.. ;)

vero, le cose più faicili non mi vengono mai  XD

ok allora il codice diventa
Code: [Select]
boolean whatWritten(int pin) {
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
       
return ((*portInputRegister(port) & bit) == 0) ? 0:1;
}
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!


si ma puoi anche metterla in un file a parte e chiamarla "libreria"  XD solo che mettere una libreria per una funzione mi pare brutto,sarebbe carino se si facesse qualche altra funzione e si ingloba il tutto, allora avrebbe senso  :)

cavolo  :smiley-mr-green:
io pensavo di fae così:
chiamo funzione e li dico il pin in questione
la funzione fa quel ch deve
il return sarà di due valori se è possibile ovvero sia la direzione del pin che il suo valore (alto o basso), altrimenti una funzine in piu

leo72

Difatti una libreria per una funzione di 3 righe di codice è assurdo  :smiley-yell: :smiley-yell:


superlol



si ma puoi anche metterla in un file a parte e chiamarla "libreria"  XD solo che mettere una libreria per una funzione mi pare brutto,sarebbe carino se si facesse qualche altra funzione e si ingloba il tutto, allora avrebbe senso  :)

cavolo  :smiley-mr-green:
io pensavo di fae così:
chiamo funzione e li dico il pin in questione
la funzione fa quel ch deve
il return sarà di due valori se è possibile ovvero sia la direzione del pin che il suo valore (alto o basso), altrimenti una funzine in piu

è fattibile.

Code: [Select]
int digitalRead(uint8_t pin)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);

if (port == NOT_A_PIN) return LOW;

// If the pin that support PWM output, we need to turn it off
// before getting a digital reading.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);

if (*portInputRegister(port) & bit) return HIGH;
return LOW;
}

questa è la funzione di digitalRead che è la stessa che ho ripreso io in pratica
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Michele Menniti

Io avevo chiesto qualcosa che mi permettesse di interrogare (INPUT/OUTPUT-->H/L), a mio piacere:
- un pin, indicando linea e numero (sto pensando in generale a chip ATMEL), es D7, B4, ecc
- una linea di pin (PORT) indicando la sola lettera della linea
- tutte le linee di PIN indicando una sorta di "*".

Il risultato deve essere caricato in una variabile nel primo caso (I o OH o OL)
Nel secondo è terzo caso deve andare in un array

Sia il secondo che il terzo caso vengono eseguiti SOLO che la pinature del micro selezionato prevede la/e linea/e di pin, quindi deve interrogare il core attivo.

Allora basta una funzione o serve una lib, piccola che sia?
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


Io avevo chiesto qualcosa che mi permettesse di interrogare (INPUT/OUTPUT-->H/L), a mio piacere:
- un pin, indicando linea e numero (sto pensando in generale a chip ATMEL), es D7, B4, ecc
- una linea di pin (PORT) indicando la sola lettera della linea
- tutte le linee di PIN indicando una sorta di "*".

Il risultato deve essere caricato in una variabile nel primo caso (I o OH o OL)
Nel secondo è terzo caso deve andare in un array

Sia il secondo che il terzo caso vengono eseguiti SOLO che la pinature del micro selezionato prevede la/e linea/e di pin, quindi deve interrogare il core attivo.

Allora basta una funzione o serve una lib, piccola che sia?


avevo capito dovesse essere una cosa destinata al solo arduino, quindi mi sono messo per quello (ed ora che vedo meglio in effetti fastava fare un digitalRead() sulla porta di cui si voleva sapere lo stato e potrebbe andche funzionare).

comunque sinceramente non capisco l'utilità di tutto ciò, capisco solo se bisogna capire se un pin è output/input high o low potrebbe tornare utile ma sapere tutti i pin in una volta sola sinceramente non ne vedo l'utilità
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

alexdb



Allora basta una funzione o serve una lib, piccola che sia?


be le funzioni cominciano già a crescere di numero e forse una piccola libreria avrebbe senso..
però prima una considerazione: vale sul serio la pena sprecare così tante risorse hardware con l'array e con tutte quelle funzioni quando basta che ad ogni cambio d'uso e di stato del pin si aggiorni una variabile? :smiley-roll:


leo72


comunque sinceramente non capisco l'utilità di tutto ciò, capisco solo se bisogna capire se un pin è output/input high o low potrebbe tornare utile ma sapere tutti i pin in una volta sola sinceramente non ne vedo l'utilità

Sinceramente trovo poco utile anche sapere lo stato di 1 pin: siccome i pin non cambiano di stato da soli ma solo dietro esplicito comando dato da codice (pinMode), è facile sapere in che stato siano... non trovate?  ;)

Michele Menniti

Beh ragazzi, voi avete lanciato l'idea e voi state facendo marcia indietro. Leo, non è da te ragionare in termini del tipo "quello che ho da sapere lo so", altrimenti non avresti fatto tanto per il Forum, ad iniziare dalla Guida sugli ATtiny ;)
Io non ho in mente niente, ma pensavo che se stessi testando un bel sistemone di sensori ed attuatori sfruttando tutte le porte di un 644, mi piacerebbe moltissimo poter premete un pulsante ed attivare un interrupt che mi mandi tutta la situazione attuale sul serial monitor mentre l'aggeggio continua a funzionare.
Non vi garba l'idea? lasciate perdere, vuol dire che se mai dovessi trovare un po' di tempo mi ci metterò io, alla fine non mi pare che sia troppo oltre la mia portata, vi farò lavorare lo stesso (osereste non aiutarmi? ]:D) e mi piglio il merito di aver scritto una LIB $)
Però imparate anche una cosa (a quelli che si sono lanciati...), la tecnica dell'<armiamoci e partite!> non è mai stata una cosa elegante; quindi in futuro non tirate fuori idee ed ideuzze nella speranza che poi altri le realizzino ;)
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

leo72

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.


Michele Menniti


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


Beh ragazzi, voi avete lanciato l'idea e voi state facendo marcia indietro. Leo, non è da te ragionare in termini del tipo "quello che ho da sapere lo so", altrimenti non avresti fatto tanto per il Forum, ad iniziare dalla Guida sugli ATtiny ;)
Io non ho in mente niente, ma pensavo che se stessi testando un bel sistemone di sensori ed attuatori sfruttando tutte le porte di un 644, mi piacerebbe moltissimo poter premete un pulsante ed attivare un interrupt che mi mandi tutta la situazione attuale sul serial monitor mentre l'aggeggio continua a funzionare.
Non vi garba l'idea? lasciate perdere, vuol dire che se mai dovessi trovare un po' di tempo mi ci metterò io, alla fine non mi pare che sia troppo oltre la mia portata, vi farò lavorare lo stesso (osereste non aiutarmi? ]:D) e mi piglio il merito di aver scritto una LIB $)
Però imparate anche una cosa (a quelli che si sono lanciati...), la tecnica dell'<armiamoci e partite!> non è mai stata una cosa elegante; quindi in futuro non tirate fuori idee ed ideuzze nella speranza che poi altri le realizzino ;)


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

chi è che ha dato l'idea?  XD


comunque non ho detto che mi ritiro, se c'è da fare faccio volentieri il problema è che da oggi avrò meno tempo a causa di un'altro progetto (anzi un progetto ed un apprendimento) in quanto la IMU sta girando per la città in mano al mio postino  :*

la cosa su cui però vorrei prestare più attenzione è il fatto che scrivere una libreria per un comando simile diventa solo uno spreco di spazio (in termini di flash anche) in quanto comunque viene inclusa nel codice.

in più se vuoi riavere lo stato di tutte le porte, una volta che hai una funzione che ti legge lo stato di una porta, ti basta fare un ciclo di for e mettere i risultati in un array, lo dico perchè credo sia un metodo più efficiente rispetto all'implementarlo nella funzione in quanto nella funzione verrebbe comunque dichiarato l'array e fatto il ciclo (o comunque vi sarebbe un if ma occupa spazio) e quindi poco efficiente.

spero tu capisca ciò che intendo.

fare una funzione che oltre a leggere lo stato dei pin legge anche se sono input output te la faccio volentieri  ;) ma solo per in pin  XD (eeeeh c'è crisi :P )
Il nuovo forum italiano sull'elettronica: http://www.electroit.tk/ <--- Nuovamente online!

Go Up