satori Inserito: 26 maggio 2021 Segnala Share Inserito: 26 maggio 2021 Salve a tutti ho un problema apparentemente semplice, ma che non riesco a risolvere. Devo misurare il tempo di pressione di un tasto collegato alla PORTB.2 chiaramente programmata come ingresso. La porta RB2 ha una resistenza di pull-up di 10K ed il tasto chiudendosi porta a 0 RB2. Ho già un Fw che funzionain questo modo: Con un if verfico lo stato della porta RB2, se sta a 0 faccio un pò di cose .... io volevo fare in modo che "queste cose" partissero solo se il tasto fosse stato premuto per almeno due secondi ... Ho provato così: while (PORTB.2=0) tick=tick+1 '(è una variabile word) delay_ms(10) wend if tick>=200 then 'spingo il pulsante START (collegato a massa) per oltre 2 sec ......... .......... end if Purtroppo non va .... anzi mi sono accorto che si alluppa nel while, infatti inserendo questo codice di verifica dove alla porta RB1 è conesso un LED: while (PORTB.2=0) tick=tick+1 '(è una variabile word) delay_ms(10) PORTB.1=1 delay_ms(250) PORTB.1=0 'delay_ms(250) wend Appena accendo il PIC ho il lampeggio del led come se il pulsante fosse premuto ... cosa che non è Non capisco perchè .... Qualcuno potrebbe darmi un suggerimento o indicarmi dove sbaglio? Grazie a tutti Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 26 maggio 2021 Segnala Share Inserita: 26 maggio 2021 mi vien da dire che l'if lo devi mettere nel ciclo while while (PORTB.2=0) tick=tick+1 '(è una variabile word) delay_ms(10) if tick>=200 then tick=0 'il pulsante è stato premuto per oltre 2 sec ......... .......... end if wend Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 26 maggio 2021 Segnala Share Inserita: 26 maggio 2021 53 minuti fa, satori scrisse: Appena accendo il PIC ho il lampeggio del led come se il pulsante fosse premuto sicuro di aver configurato bene le porte? Ps con il C sono un in difficolta ricordo poco Link al commento Condividi su altri siti More sharing options...
Ctec Inserita: 26 maggio 2021 Segnala Share Inserita: 26 maggio 2021 (modificato) Che linguaggio usi? While...Wend non è C. Sembra visual basic. In C dovresti scrivere while (PORTB.2 == 0) { ... } = è un'assegnazione == è un confronto Modificato: 26 maggio 2021 da Ctec Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 26 maggio 2021 Segnala Share Inserita: 26 maggio 2021 29 minuti fa, Ctec scrisse: == è un confronto è già Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 26 maggio 2021 Segnala Share Inserita: 26 maggio 2021 1 ora fa, Ctec scrisse: == è un confronto sembrerebbe che non è cosi Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 27 maggio 2021 Segnala Share Inserita: 27 maggio 2021 11 ore fa, DavidOne71 scrisse: embrerebbe che non è cosi ma tu ti stai riferendo a Visual basic. Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 27 maggio 2021 Segnala Share Inserita: 27 maggio 2021 non so che linguaggio è Link al commento Condividi su altri siti More sharing options...
satori Inserita: 27 maggio 2021 Autore Segnala Share Inserita: 27 maggio 2021 21 ore fa, DavidOne71 scrisse: mi vien da dire che l'if lo devi mettere nel ciclo while while (PORTB.2=0) tick=tick+1 '(è una variabile word) delay_ms(10) if tick>=200 then tick=0 'il pulsante è stato premuto per oltre 2 sec ......... .......... end if wend Ciao a tutti, sto programmando in basic usando Mikrobasic per semplificarmi mi sono fatto un programmino a parte ... dopo un pò di magheggi sono a giunto a questo codice: tick=0 while true 'Ciclo infinito if PORTB.2= 0 then tick= tick+1 delay_ms(10) end if if tick>=200 then portb.3 = 0 'led blue off portb.1 = 1 'led rosso on portb.4=0 'ventola on portb.6=0 'ventola on end if wend Così sembra funzionare ... ora lo devo integrare nel codice del firmware che avevo già fatto.... Link al commento Condividi su altri siti More sharing options...
DavidOne71 Inserita: 27 maggio 2021 Segnala Share Inserita: 27 maggio 2021 non mi piace molto io farei così tick=0while true 'Ciclo infinito if PORTB.2= 0 then if tick>=200 then portb.3 = 0 'led blue off portb.1 = 1 'led rosso on portb.4= 0 'ventola on portb.6=0 'ventola on tick=0 end if tick= tick+1 delay_ms(10) end ifwend Tre note: 1) il "delay_ms(10)" possibilmente non va mai usato, adesso va bene perche è un programma semplice, ma se il prog. diventa più complesso, non si può far attendere il ciclo senza che non accada niente. Non deve essere bloccante deve scorrere. Pensa se devi gestire 10 pulsanti, rallenta tutto. 2) Meglio non elaborare il codice se non serve 3 ore fa, satori scrisse: if tick>=200 then portb.3 = 0 'led blue off portb.1 = 1 'led rosso on portb.4=0 'ventola on portb.6=0 'ventola on end if l'if, se lo metti dentro qui 3 ore fa, satori scrisse: if PORTB.2= 0 then verrà eseguito solo se premi il tasto, altrimenti verrà eseguito sempre, nei PIC di piccola taglia come quello che stai usando, non si deve sprecare nulla. 3) I pulsanti si potrebbero gestire con degli interrupt Fammi sapere se funziona Ps. Ma sul microbasic c'è un simulatore? 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