Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Gestione input PIC 16f

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 30 gen 2013, 13:22

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
Ultima modifica di Foto UtenteDADO91 il 30 gen 2013, 13:29, modificato 1 volta in totale.
Motivazione: Incluso codice nei tag code
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[2] Re: Gestione input PIC 16f

Messaggioda Foto UtenteDryden » 30 gen 2013, 14:15

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?
Avatar utente
Foto UtenteDryden
20 4
New entry
New entry
 
Messaggi: 97
Iscritto il: 1 gen 2011, 14:37
Località: Bolzano

0
voti

[3] Re: Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 30 gen 2013, 18:07

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.
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[4] Re: Gestione input PIC 16f

Messaggioda Foto UtenteDryden » 30 gen 2013, 18:27

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....
Avatar utente
Foto UtenteDryden
20 4
New entry
New entry
 
Messaggi: 97
Iscritto il: 1 gen 2011, 14:37
Località: Bolzano

0
voti

[5] Re: Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 30 gen 2013, 19:25

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
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[6] Re: Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 31 gen 2013, 19:41

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 .
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[7] Re: Gestione input PIC 16f

Messaggioda Foto UtenteDryden » 1 feb 2013, 9:56

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....
Avatar utente
Foto UtenteDryden
20 4
New entry
New entry
 
Messaggi: 97
Iscritto il: 1 gen 2011, 14:37
Località: Bolzano

0
voti

[8] Re: Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 2 feb 2013, 13:35

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 .....
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

0
voti

[9] Re: Gestione input PIC 16f

Messaggioda Foto UtenteDryden » 4 feb 2013, 14:36

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....
Avatar utente
Foto UtenteDryden
20 4
New entry
New entry
 
Messaggi: 97
Iscritto il: 1 gen 2011, 14:37
Località: Bolzano

0
voti

[10] Re: Gestione input PIC 16f

Messaggioda Foto Utentemaxtronic » 4 feb 2013, 18:56

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
Avatar utente
Foto Utentemaxtronic
0 4
 
Messaggi: 22
Iscritto il: 30 gen 2013, 0:43

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti