Jump to content
PLC Forum


Sign in to follow this  
Spillo87

Mikrobasic E While True... Per Più Funzioni

Recommended Posts

Spillo87

Visto come funzionano le scuole professionali probabilmente è una fortuna, per te. :smile:

Anche su questo, ragione assoluta... al corso con me ho "periti elettronici" che se gli dico microcontrollore, non sanno se parlo di elettronica o pasta asciutta... :toobad:

tornando all'argomento... questo è il codice rifatto con controllo delle variabile sui pulsanti:

program provasub 'Marco Ago***spillo87
 'PIC12F675
 'GP0=led 1
 'GP1=led 2
 'GP2=led 3
 'GP3=sw1 cambio prog
 'GP4=sw2 start/stop
 'GP5=led 4 attiv prog

 dim k as byte
 dim tempo as byte
 dim avvio as byte
 dim pronto as byte

sub procedure interrupt            'interrupt tasti sw1 sw2
    if testbit(INTCON,GPIF) then
       if testbit(GPIO,3) then     'se premo sw1 "gp3" allora
        delay_ms(100)              'attesa antirimbalzo
        if GPIO.5=1 then           'se led prog "GP5" è on allora
         if (tempo>0) then         'se var "tempo" maggiore di 0 allora
          inc(tempo)               'incrementa tempo
         end if
         if (tempo>3) then         'se var "tempo" maggiore di 3 allora
          tempo=1                  'var "tempo" va a 1
         end if
        end if
       end if
       if testbit(GPIO,4) then     'se premo sw2 "gp4" allora
         delay_ms(100)
         if pronto=1 then          'se var "pronto" è 1
          if avvio=0 then          'se var "avvio" è 0 allora
           avvio=1                 'porta var "avvio" a 1
          else                     'sennò
          if avvio=1 then          'se var "avvio" è 1 allora
           avvio=0                 'porta var "avvio" a 0
          end if
          end if
         end if
       end if
     clearbit(INTCON,GPIF)      'azzero bit GPIF
    end if
end sub

sub procedure pausa1s          'sub procedura per temporiz 1sec
    delay_ms(1000)
end sub

sub procedure tempog           'sub procedura per impostazione 3 programmi
    if tempo = 1 then          'se variab "tempo" è uguale a 1 allora
     GPIO=33                   'attiva Led 1 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
    if tempo = 2 then          'se variab "tempo" è uguale a 1 allora
     GPIO=34                   'attiva Led 2 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
    if tempo = 3 then          'se variab "tempo" è uguale a 1 allora
     GPIO=36                   'attiva Led 3 e 4
     for k= 1 to 5             'per 5 sec
      pausa1s
     next k
    end if
end sub

main:
 CMCON=%011000          'comparatori off
 ANSEL=%000000          'tutti I/O digitali
 TRISIO=%011000         'GP3 e GP4 input
 GPIO=0                 'spengo porte GPIO
 IOC=%011000            'scelta ingressi IOC che genereranno
                        'interrupt nel registro IOC
 setbit(INTCON,GPIE)    'attivo interrupt su porte GPIO
 setbit(INTCON,GIE)     'abilita tutti gli interrupt
 tempo=1
 k=0
 pronto=0
 avvio=0

inizio:
if pronto=1 then
  pronto=0
end if
 GPIO=0                 'tutto spento
 pausa1s                'sub
 GPIO=39                'tutti i led on
 pausa1s                'sub
 GPIO=0                 'tutto spento
 pausa1s                'sub
if pronto=0 then
  pronto=1
end if

while true
 GPIO=7               'lampeggio dei 3 led velocità
 delay_ms(350)
 GPIO=0               'azzera porte
 delay_ms(150)
 if pronto=1 then     'se var "pronto" è 1
  GPIO.5=1            'fai lampeggiare led prog
  delay_ms(100)
  GPIO.5=0
  delay_ms(100)
 end if
 if avvio=1 then         'se var "avvio" è 1 allora esegui il prog
    delay_ms(100)        'attesa antirimbalzo sw2 "GP4"
    GPIO.5=1             'accende led prog "GP5"
    pausa1s              'attesa 2 sec
    pausa1s
    tempog               'vai a routine "tempog"
    pausa1s              'pausa 1 sec
 end if
wend

end.

suggerimenti??? è migliorata la situazione secondo voi?

comunque, ora sto cercando di studiare l'interrupt timer (TMR0 o 1) ma al momento non riesco a trovare niente che lo spieghi bene, come funzionamento e implementazione...

mi potete aiutare? vi faccio perdere un pò di tempo dietro a me :worthy: ... approfitto un pò delle vostre conoscenze, pazienza e disponibilità... sempre se si può e se non sono troppo O.T.

grazie ancora...

Share this post


Link to post
Share on other sites

simuffa

Se da quel che ho capito il problema è fermare il programma senza aspettare la fine del programma puoi usare fare una cosa più semplice rispetto agli interrupt:

prima di tutto non usare la pausa da 1 secondo perché in quel periodo il microcontrollore farà solo pausa e puoi fermarlo soltanto con l'interrupt, ti basta fare la pausa di 100ms e il ciclo for da 1 a 50.

dentro il for controlli il pulsante di stop, se è premuto setti avvio a 0 e facendo break e il for finisce.

Anche la selezione e l'avvio lo farei dentro il main senza scomodare gli interrupt però vedi tu :smile:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...