cloe Inserito: 31 maggio 2006 Segnala Share Inserito: 31 maggio 2006 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 pulsantea che può essere dovuto? dove sbaglio? poichè dovrò usare + switch c'è un modo per gestirli + facilmente?grazie millecloe Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 31 maggio 2006 Segnala Share Inserita: 31 maggio 2006 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 capoPer 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 More sharing options...
cloe Inserita: 31 maggio 2006 Autore Segnala Share Inserita: 31 maggio 2006 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 armigrazie Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 31 maggio 2006 Segnala Share Inserita: 31 maggio 2006 (modificato) Se non dici cosa stai usando. Un micro? Che micro? Assembler? C? e con quale compilatore? Modificato: 31 maggio 2006 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
cloe Inserita: 31 maggio 2006 Autore Segnala Share Inserita: 31 maggio 2006 scusami...sto usando un pic 16f876 e lo sto programmando in C con ccs. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 31 maggio 2006 Segnala Share Inserita: 31 maggio 2006 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 More sharing options...
ifachsoftware Inserita: 1 giugno 2006 Segnala Share Inserita: 1 giugno 2006 il problema è che a volte mi si accende il led anche se non premo il pulsante Link al commento Condividi su altri siti More sharing options...
cloe Inserita: 1 giugno 2006 Autore Segnala Share Inserita: 1 giugno 2006 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 More sharing options...
Gariel Inserita: 3 giugno 2006 Segnala Share Inserita: 3 giugno 2006 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 More sharing options...
ifachsoftware Inserita: 4 giugno 2006 Segnala Share Inserita: 4 giugno 2006 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 More sharing options...
Livio Orsini Inserita: 4 giugno 2006 Segnala Share Inserita: 4 giugno 2006 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 More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora