satori Posted May 26, 2021 Report Posted May 26, 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
DavidOne71 Posted May 26, 2021 Report Posted May 26, 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
DavidOne71 Posted May 26, 2021 Report Posted May 26, 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
Ctec Posted May 26, 2021 Report Posted May 26, 2021 (edited) Che linguaggio usi? While...Wend non è C. Sembra visual basic. In C dovresti scrivere while (PORTB.2 == 0) { ... } = è un'assegnazione == è un confronto Edited May 26, 2021 by Ctec
DavidOne71 Posted May 26, 2021 Report Posted May 26, 2021 29 minuti fa, Ctec scrisse: == è un confronto è già
DavidOne71 Posted May 26, 2021 Report Posted May 26, 2021 1 ora fa, Ctec scrisse: == è un confronto sembrerebbe che non è cosi
Livio Orsini Posted May 27, 2021 Report Posted May 27, 2021 11 ore fa, DavidOne71 scrisse: embrerebbe che non è cosi ma tu ti stai riferendo a Visual basic.
satori Posted May 27, 2021 Author Report Posted May 27, 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....
DavidOne71 Posted May 27, 2021 Report Posted May 27, 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?
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now