Vai al contenuto
PLC Forum


Rilevazione Finecorsa


cloe

Messaggi consigliati

ciao a tutti,

sto usando un semplice switch con la levetta per rilevare il raggiungimento di un finecorsa.

vorrei fare in modo che quando il pulsante viene premuto si accenda un led.

mi rendo conto che la cosa dovrebbe essere di una banalità sconfinata ma non ci riesco :(

mi sn mossa così: in un while(TRUE) controllo il risultato della funzione input(PIN_A0) (ho messo un piedino dello switch su A0) e se è 1 (pulsante premuto) faccio accendere il led posto su un altro pin.

il problema è che a volte mi si accende il led anche se non premo il pulsante

a che può essere dovuto? dove sbaglio? poichè dovrò usare + switch c'è un modo per gestirli + facilmente?

grazie mille

cloe

Link al commento
Condividi su altri siti


Quando si devono gestire processi (accessione del LED nel tuo esempio) legati ad evinti di ingresso è buona norma agire in modo differente da come hai agito tu.

Supponiamo che il LED si accenda alla pressione del pulsante (A0 == 1), rimanga acceso sini alla prossima pressione, poi riprenda da capo

Per prima cosa si crea un timer da 10ms, che il ritardo standard per gli antirimbalzo. Sull'interrupt del timer si leggono gli ingressi, si confrontano con la memoria degli ingressi precedenti in modo da ricavare gli ingressi che hanno uno stato stabile da almeno 10 ms, poi si copia la lettura nella memoria. Se l'ingresso che deve scatenare l'evento, A0 nel tuo caso, è stabilizzato a "1" allora leggi l'Uscita che pilota il LED e la neghi.

Nella routine di interrupt devi leggere gli ingressi e memorizzarli in un registro. Poi con un programma richiamato ciclicamente andrai ad analizzare, confrontare ed eventualmente settare le uscite.

Spero ti sia chiaro il meccanismo, in caso contrario chiedimi cosa non ti è chiaro.

Link al commento
Condividi su altri siti

se ho ben capito il fatto che si accendesse il led anche se non premevo il pulsante è dovuto al fatto che non ho considerato l'antirimbalzo...

scusami se approfitto del tuo aiuto...come faccio a generare il timer di cui parli? perdonami ma sn alle prime armi

grazie

Link al commento
Condividi su altri siti

Se non dici cosa stai usando. Un micro? Che micro? Assembler? C? e con quale compilatore?

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Perfetto, allora è semplicissimo. Guarda sull'help in linea del compilatore, nelle built in function e/o negli esempi. Trovi senz'altro la funzione e l'esempio per avere un interrupt sul timer0 e su come programmare il timer per avere 10ms di periodo.

Prova e, se proprio non ci riesci, vedrò di recuperare qualche cosa da postarti.

Link al commento
Condividi su altri siti

grazie mille!

il problema era proprio la resistenza di pull-up! (purtroppo l'ignoranza in materia si fa sentire :-) ma come dico sempre "la curiosità è figlia dell'ignoranza e madre della scienza") )

per livio: resta il fatto che l'antirimbalzo lo devo mettere! perfezionerò anche su Questo'aspetto. se ho difficoltà vi faccio saxe :-)

grazie ancora

Link al commento
Condividi su altri siti

Riferendomi al metodo descritto da Livio Orsini vorrei sottoporre a lui stesso o a chiunque altro vorrà rispondere, il seguente quesito:

Nel caso di implementazione della routine su interrupt per la rilevazione dei tasti premuti, ed avendo anche nel sistema la ricezione da seriale, è necessario fermare il timer prima di andare a ricevere dalla seriale per poi riattivarlo subito dopo, oppure si può evitare?

In altre parole, l'interruzione ogni 10 msec, può disturbarmi la ricezione dalla seriale?

Grazie

Link al commento
Condividi su altri siti

ifachsoftware

Se hai una seriale hardware non dovresti avere nessun problema (a meno di gestire malamente gli interrupt ossia facendogli eseguire funzioni molto lunghe) in quanto che il processamento dei tasti non dovrebbe necessitare piu' di pochi micro secondi (naturalmente cio' dipende dalla potenza del micro utilizzato)

Ciao :)

Link al commento
Condividi su altri siti

Come ti ha scritto Ifach la routine di riconoscimento-debouncing ingressi dovrebbe accupare meno di 1ms ogni 10ms, cioè <10%. Se il programma è stato organizzato in modo almeno decente non ci sono problemi di hung up del processore per ricevere dati da un seriale.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...