Pagina 1 di 3

Gestione input PIC 16f

MessaggioInviato: 30 gen 2013, 13:22
da maxtronic
Salve a tutti , mi sono appena iscritto al forum . spero qualcuno mi possa aiutare .

ho realizzato un programmino con Mikrobasic , in pratica ho usato tutti i piedini del chip . avendo un ottimo risultato , maaaaaa :
Ho impostato il tutto , porte uscite e tutto va bene .
in pratica alla pressione di un tasto equivale un gioco di luci nell'uscita corrispondente ed in più , l'uscita corrispondente rimane accesa . l'unico problema è che vorrei che alla pressione di un altro tasto accadesse il successivo gioco di luci . ma avendo fermato con un wend il programma sulla pressione di un tasto non posso far fare il controllo sulle altre uscite. vi posto il listato . io non riesco + ad andare avanti.

Codice: Seleziona tutto
progam giocoluci
  main:
trisa=%11111
trisb=%00000011
porta=0
portb=00000000
inizio:
    delay_ms(50)
    portb=0

      if porta.0=1 then
      gosub uno
      while porta.0=1
      wend
       end if

      if porta.1=1 then
      gosub due
      while porta.1=1
      wend
       end if

      if porta.2=1 then
      gosub tre
      while porta.2=1
      wend
       end if

      if porta.3=1 then
      gosub quattro
      while porta.3=1
      wend
       end if

        if porta.4=1 then
      gosub cinque
      while porta.4=1
      wend
       end if

      if portb.0=1 then
      gosub sei
      while portb.0=1
      wend
       end if

    goto inizio
  uno:
     portb.2=1
     delay_ms(300)
     portb.3=1
     delay_ms(150)
     portb.4=1
     delay_ms(150)
     portb.5=1
     delay_ms(150)
     portb.6=1
     delay_ms(150)
     portb.7=1
     delay_ms(150)
     portb=0
     portb.2=1

     return
due:
     portb.3=1
     delay_ms(300)
     portb.2=1
     portb.4=1
     delay_ms(150)
     portb.5=1
     delay_ms(150)
     portb.6=1
     delay_ms(150)
     portb.7=1
     delay_ms(150)
     portb=0
     portb.3=1

      return
tre:
     portb.4=1
     delay_ms(300)
     portb.3=1
     portb.5=1
     delay_ms(150)
     portb.2=1
     portb.6=1
     delay_ms(150)
     portb.7=1
     delay_ms(150)
     portb=0
     portb.4=1

     return
quattro:
     portb.5=1
     delay_ms(300)
     portb.4=1
     portb.6=1
     delay_ms(150)
     portb.3=1
     portb.7=1
     delay_ms(150)
     portb.2=1
     delay_ms(150)
     portb=0
     portb.5=1

     return
cinque:
     portb.6=1
     delay_ms(300)
     portb.5=1
     portb.7=1
     delay_ms(150)
     portb.4=1
     delay_ms(150)
     portb.3=1
     delay_ms(150)
     portb.2=1
     delay_ms(150)
     portb=0
     portb.6=1

     return
sei:
     portb.7=1
     delay_ms(300)
     portb.6=1
     delay_ms(150)
     portb.5=1
     delay_ms(150)
     portb.4=1
     delay_ms(150)
     portb.3=1
     delay_ms(150)
     portb.2=1
     delay_ms(150)
     portb=0
     portb.7=1

     return
end.


Grazie anticipate

Re: Gestione input PIC 16f

MessaggioInviato: 30 gen 2013, 14:15
da Dryden
Ciao, forse ti sei spiegato male ma con queste istruzioni:
Codice: Seleziona tutto
     
      if porta.0=1 then
      gosub uno
      while porta.0=1
      wend
       end if


Tu testi il pulsante, se premuto vai ad una sub routine (l'utilizzo del GOSUB e GOTO è sconsigliatissimo), finita la sub il programma torna a questa istruzione:
Codice: Seleziona tutto
     
      while porta.0=1
      wend
       end if


Chiaro che se la porta = 1 lui rimarrà sempre piantato nel ciclo while wend, che non ho capito a cosa ti serve...

Comunque il programma è scritto molto male, usa sub procedure chiamandole direttamente.

Se il tuo intento è saltare da un gioco al altro durante l'esecuzione del primo, bisogna che testi i pulsanti.

Se spieghi bene cosa devi fare, per filo e per segno, buttare giù quelle 4 righe di codice non ci vuole molto.

Che versione di MB usi?

Re: Gestione input PIC 16f

MessaggioInviato: 30 gen 2013, 18:07
da maxtronic
Grazie innanzitutto per la risposta .
La versione di mb è la 2.0.0.4
Ho messo il ciclo per piantare il programma in quei punti solo perché se il pulsante rimane premuto
ho di continuo il gioco di luci .
In pratica premendo un pulsante va bene che attivi le uscite e rimanga acceso il led relativo al pulsante. ma vorrei che se rimane premuto il pulsante alla pressione di un altro facesse lo stesso con l'altro pulsante.
Come mai mi sconsigli di usare le suddette istruzioni??
Non sono un programmatore per lavoro , mi diletto a fare qualcosina per hobby , solo che la passione è tanta.

Re: Gestione input PIC 16f

MessaggioInviato: 30 gen 2013, 18:27
da Dryden
Innanzitutto aggiornati, l'ultima versione di MB è la 7.0.0.2 . Oltre al fatto che non è più supportato è uscita la nuova versione MBPro....

Da come è scritto il codice se premi porta.1 e la lasci a 1 il PIC ti fa il giochetto di luci ma poi rimane piantato nel ciclo while senza fare ulteriori giochi.

Non sono io che sconsiglio il GOSUB o GOTO ma è la stessa mikroe a sconsigliarlo!

Dovresti fare una cosa del genere:

Codice: Seleziona tutto
sub procedure uno
codice del gioco 1
end sub
...
...
metti tutte le sub con i giochi e poi fai:

main:
trisa
trisb
ecc..
while true
if porta.1 = 1 then
uno
end if
...
...
stessa cosa per tutti i pulsanti

wend


in questo modo se porta.1 è 1 fa il giochetto e se rimane 1 continua il ciclo altrimenti si ferma e aspetta un altro pulsante....

Re: Gestione input PIC 16f

MessaggioInviato: 30 gen 2013, 19:25
da maxtronic
proverò a fare come dici . ma se rimane premuta la porta.1 deve fermarsi e no ripetere il giochetto di luci . solo se nuovamente premuto .
in ogni caso ti farò sapere
grazie mille

Re: Gestione input PIC 16f

MessaggioInviato: 31 gen 2013, 19:41
da maxtronic
Buonasera , ho riscritto il programma con le sub procedure ma come accennavo sull'altro post , il gioco di luci fino a che resta premuta la potra.0 non si ferma mai . come avevo scritto io il programma faceva questo:
porta.1 premuto = gioco di luci 1 e il relativo led della porta rimaneva acceso . e va bene così .
solo che alla pressione di un altro ingresso tipo porta.1 si accendeva solo il relativo led senza fare il gioco .

Re: Gestione input PIC 16f

MessaggioInviato: 1 feb 2013, 9:56
da Dryden
Ciao, basta che metti una variabile di controllo per vedere se il pulsante è stato già premuto una volta. In caso positivo inibisci il l'effetto, in caso negativo fai il giochetto. Quando poi premi un altro pulsante azzeri la variabile del pulsante precedente....

Re: Gestione input PIC 16f

MessaggioInviato: 2 feb 2013, 13:35
da maxtronic
Salve , ho letto il messaggio . potresti farmi qualche esempio su come usare le variabili ????
Ho paura comunque che poi non mi basti la memoria del chip. Ma in tal caso passerei al 16f628 .
Non riesco ad impostare la variabile .....

Re: Gestione input PIC 16f

MessaggioInviato: 4 feb 2013, 14:36
da Dryden
il discorso è abbastanza semplice:

Codice: Seleziona tutto
if porta.x = 1 then
  if variabile_controllo_porta.x = 0 then
     gioco1
     variabile_controllo_porta.x = 1
     variabile_controllo_porta.y = 0
     variabile_controllo..... per ogni porta
  end if
end if

if porta.y = 1 then
  if variabile_controllo_porta.y = 0 then
     gioco2
     variabile_controllo_porta.y = 1
     variabile_controllo_porta.x = 0
     variabile_controllo..... per ogni porta
  end if
end if


il giochetto è molto semplice.... provaci e in caso non ci stai come spazio nella rom ti faccio vedere qualche trucchetto per risparmiare spazio....

Re: Gestione input PIC 16f

MessaggioInviato: 4 feb 2013, 18:56
da maxtronic
Ciao , ho appena letto il post . Proverò quanto prima a fare come dici .
Ti terrò aggiornato
grazie tante .
Maaaa hai provato per caso il mio primo programma su di una board ??? io uso la esay PIC 3
ciao