Vai al contenuto
PLC Forum


Misura del Tempo di pressione di un tasto con PIC16F628A


satori

Messaggi consigliati

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


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

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

Che linguaggio usi? While...Wend non è C. Sembra visual basic.

In C dovresti scrivere 

while (PORTB.2 == 0)

{

...

}

= è un'assegnazione

== è un confronto

Modificato: da Ctec
Link al commento
Condividi su altri siti

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

non mi piace molto io farei così

 

tick=0
while 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 if
wend

 

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

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