Jump to content
PLC Forum


Misura del Tempo di pressione di un tasto con PIC16F628A


Recommended Posts

Posted

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

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

Posted (edited)

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

In C dovresti scrivere 

while (PORTB.2 == 0)

{

...

}

= è un'assegnazione

== è un confronto

Edited by Ctec
DavidOne71
Posted
29 minuti fa, Ctec scrisse:

== è un confronto

è già

Livio Orsini
Posted
11 ore fa, DavidOne71 scrisse:

embrerebbe che non è cosi

ma tu ti stai riferendo a Visual basic.

Posted
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

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?

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...