BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   PROBLEMA con programma pic 12f629 (https://www.baronerosso.it/forum/circuiti-elettronici/321196-problema-con-programma-pic-12f629.html)

trabo 19 luglio 14 12:22

PROBLEMA con programma pic 12f629
 
Salve a tutti.
Sono qui per chiedervi una mano se possibile.
da qualche giorno sto studiando il mondo dei PIC.
Ho realizzato un programma in MikroBasic, utilizzando il pic 12f629.
E sono giorni che sto provando ad ultimarlo

E' un piccolo progetto, ovvero una schedina , con il pic centrale, dove c'è collegato un pulsante e 8 led.
Praticamente ho bisogno che questo sistema,quando si preme il pulsante, cambia effetto ai led.
Appena acceso luce fissa, pulsante premuto metà potenza, pulsante premuto strobo, pulsante premuto 4 led accesi e 4 no (si alternano) premo il pulsante deve tornare su fissa.
Il mio problema è che quando premo il pulsante, mi cambia gli effetti, ma non in modo ordinato, ma casuale.
Magari fa 3 volte un effetto poi passa all'altro.

Spero nel vostro aiuto.

Grazie
Ecco il programma

program MyProject


main:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
IF gpio.0=0 THEN
GOTO fissa
end if

fissa:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
while true
gpio.1=1
gpio.2=1
if gpio.0=1 then
goto inizio
end if
wend


inizio:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

while true
if gpio.0=1 then
goto mezzo
end if
GPIO.1=1
gpio.2=1
delay_us(50)
GPIO.2=0
gpio.1=0
delay_us(50)
IF GPIO.0=1 THEN
GOTO mezzo
end if
wend


mezzo:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

while true
if gpio.0=1 then
goto strobo
end if
gpio.2=1
delay_ms(500)
gpio.2=0
delay_ms(500)
gpio.1=1
delay_ms(500)
gpio.1=0
delay_ms(500)
if gpio.0=1 then
goto strobo
end if
wend

strobo:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
while true
if gpio.0=1 then
goto fissa
end if
gpio.1=1
gpio.2=1
delay_ms(50)
gpio.1=0
gpio.2=0
delay_ms(50)
if gpio.0=1 then
goto fissa
end if
wend
end.
non capisco proprio dove sbaglio.

MSchiepp 19 luglio 14 14:15

Citazione:

Originalmente inviato da trabo (Messaggio 4333234)
...non capisco proprio dove sbaglio.

L'errore sta nel fatto che tu impieghi più di 100 mS per premere il pulsante e quindi quello che succede è che tu premi il pulsante, il programma esegue un ciclo dell'effetto selezionato poi arriva in fondo dove trova il pulsante ancora premuto e quindi passa al successivo, finchè non trova il pulsante rilasciato e rimane nell'ultimo effetto selezionato.
Puoi provare due soluzioni:
1) prima del ritardo di 100 mS aspetti che il pulsante venga rilasciato: questo fa partire il nuovo effetto quando rilasci il pulsante; il ritardo di 100 mS serve ad eliminare i rimbalzi del pulsante.

2) Usi una variabile come flag inizializzata a '0' e all'inizio del ciclo di ogni effetto verifichi se il pulsante è rilasciato; se sì metti il flag ad 1 e alla fine passi al ciclo successivo se trovi il pulsante premuto e il flag=1.

Michele

trabo 19 luglio 14 15:10

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4333311)
L'errore sta nel fatto che tu impieghi più di 100 mS per premere il pulsante e quindi quello che succede è che tu premi il pulsante, il programma esegue un ciclo dell'effetto selezionato poi arriva in fondo dove trova il pulsante ancora premuto e quindi passa al successivo, finchè non trova il pulsante rilasciato e rimane nell'ultimo effetto selezionato.
Puoi provare due soluzioni:
1) prima del ritardo di 100 mS aspetti che il pulsante venga rilasciato: questo fa partire il nuovo effetto quando rilasci il pulsante; il ritardo di 100 mS serve ad eliminare i rimbalzi del pulsante.

2) Usi una variabile come flag inizializzata a '0' e all'inizio del ciclo di ogni effetto verifichi se il pulsante è rilasciato; se sì metti il flag ad 1 e alla fine passi al ciclo successivo se trovi il pulsante premuto e il flag=1.

Michele

Per prima cosa ti ringrazio veramente per la pronta risposta.
Se effettuo la modifica che mi indichi al punto 1, devo aumentare il valore di 100ms?
Non so se ho capito bene.

mentre per il punto due, ho scritto un altro programma con una variabile K ma questo va ancora peggio... mi si impunta al secondo effetto eccolo qui:
program Lampeggioled

const tasto as byte[4]=(0,1,2,3)
dim K as byte
dim premuto as byte

main:
gpio.0=0
gpio.1=0
gpio.2=0
K=0
premuto=0
trisio.1=0
trisio.2=0
trisio.0=1
cmcon=7
while true
if gpio.0=0 then
premuto=0
end if

if (gpio.0=1)and (K<3) and (premuto=0) then
K=K+1
premuto=1
end if

if(gpio.0=1) and (K=3)and(premuto=0)then
K=0
end if

if K=0 then
gpio.1=1
gpio.2=1
end if

if K=1 then
gpio.1=1
gpio.2=1
delay_us(50)
gpio.1=0
gpio.2=0
delay_us(50)
end if

if K=2 then
gpio.1=1
delay_ms(500)
gpio.1=0
delay_ms(500)
gpio.2=1
delay_ms(500)
gpio.2=0
delay_ms(500)
end if

if K=3 then
gpio.1=1
gpio.2=1
delay_ms(50)
gpio.1=0
gpio.2=0
delay_ms(50)
end if
wend
end.

MSchiepp 19 luglio 14 18:04

Mi pare che manchi un incremento di K prova a riscrivere i due 'IF' iniziali così:

if (gpio.0=1) and (premuto=0) then
premuto=1
K=K+1
if (K>3) then
K=0
end if
end if

e poi considera che hai sempre lo stesso problema di prima: se torni a valutare l'ingresso immediatamente (effetto 0) o dopo 50 + 50 uS (effetto 1), prendi sicuramente dei rimbalzi...

Michele

trabo 19 luglio 14 18:09

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4333516)
Mi pare che manchi un incremento di K prova a riscrivere i due 'IF' iniziali così:

if (gpio.0=1) and (premuto=0) then
premuto=1
K=K+1
if (K>3) then
K=0
end if
end if

e poi considera che hai sempre lo stesso problema di prima: se torni a valutare l'ingresso immediatamente (effetto 0) o dopo 50 + 50 uS (effetto 1), prendi sicuramente dei rimbalzi...

Michele

GRAZIE GRAZIE E GRAZIE :D
Eseguo subito la modifica.
Comunque per eliminare questi rimbalzi... utilizzo il primo o il secondo?
se vuoi ti mando anche lo schema elettrico del circuito.

mentre all'altro cosa intendi per
1) prima del ritardo di 100 mS aspetti che il pulsante venga rilasciato: questo fa partire il nuovo effetto quando rilasci il pulsante; il ritardo di 100 mS serve ad eliminare i rimbalzi del pulsante.
----------------------------------------
Niente mi fa la stessa cosa...
Si blocca al secondo effetto.
ecco come ho modificato:
program Lampeggioled

const tasto as byte[4]=(0,1,2,3)
dim K as byte
dim premuto as byte

main:
gpio.0=0
gpio.1=0
gpio.2=0
K=0
premuto=0
trisio.1=0
trisio.2=0
trisio.0=1
cmcon=7
while true
if gpio.0=0 then
premuto=0
end if

if (gpio.0=1) and (premuto=0) then
premuto=1
K=K+1
if (K>3) then
K=0
end if
end if

if K=0 then
gpio.1=1
gpio.2=1
end if

if K=1 then
gpio.1=1
gpio.2=1
delay_us(50)
gpio.1=0
gpio.2=0
delay_us(50)
end if

if K=2 then
gpio.1=1
delay_ms(500)
gpio.1=0
delay_ms(500)
gpio.2=1
delay_ms(500)
gpio.2=0
delay_ms(500)
end if

if K=3 then
gpio.1=1
gpio.2=1
delay_ms(50)
gpio.1=0
gpio.2=0
delay_ms(50)
end if
wend
end.

MSchiepp 20 luglio 14 00:48

Allora prova così:

main:
gpio.0=0
gpio.1=0
gpio.2=0
K=0
trisio.1=0
trisio.2=0
trisio.0=1
cmcon=7
while true

if (gpio.0=1) then
while(gpio.0=1)
delay_ms(100)
wend
K = K+1
if (K>3) then
K=0
end if
end if

if (K=0)...

in questo modo l'effetto cambia quando rilasci il pulsante e non quando lo premi...

Michele

trabo 22 luglio 14 10:30

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4333881)
Allora prova così:

main:
gpio.0=0
gpio.1=0
gpio.2=0
K=0
trisio.1=0
trisio.2=0
trisio.0=1
cmcon=7
while true

if (gpio.0=1) then
while(gpio.0=1)
delay_ms(100)
wend
K = K+1
if (K>3) then
K=0
end if
end if

if (K=0)...

in questo modo l'effetto cambia quando rilasci il pulsante e non quando lo premi...

Michele

Ciao.
per prima cosa vorrei ringraziarti per il tempo che mi stai dedicando.
Ma anche in questo modo , mi si impunta al secondo effetto.
Quindi mi chiedo, sto sbagliando a settare le porte del pic?
il pic è un 12f629 ho scelto questo perchè molto piccolo.
Allora ho deciso di ricominciare da zero.
ecco come ho scritto il programma:

program prova

while true
main:
trisio.0=1
trisio.1=0
trisio.2=0
gpio.0=0
gpio.1=0
gpio.2=0



while gpio.0=0
gpio.1=1
gpio.2=0
delay_ms(1000)
gpio.1=0
gpio.2=1
delay_ms(1000)
wend


while gpio.0=0

gpio.1=1
gpio.2=1
delay_us(1000)
gpio.1=0
gpio.2=0
delay_us(1000)
wend

wend

end.

in questo modo ho notato che 2 effetti me li fa perfettamente, non da problemi neanche il pulsante, cambia l'effetto immediatamente.
Non ho avuto bisogno di inserire nessun goto, perchè quando cambio lo stato di gpio.0, esce dal while e non so per quale profezia, va al while successivo, ho messo il while totale perchè superato l'ultimo while, non tornerebbe all'inizio.
HO il problema che quando aggiungo il 3 effetto, non me lo legge assolutamente,io non capisco dove sbaglio, cioè esegue perfettamente i primi 2 poi bam.... torna all'inizio.
Ho provato anche ad aggiungere al 2 while un goto, ma non legge nulla.
Come posso fare per eseguire 3 semplici effetti?
O hai qualche consiglio per modificare questo ultimo che ho fatto e che al 75% funziona?

Grazie ancora

microcontrollorepic 22 luglio 14 11:20

Citazione:

Originalmente inviato da trabo (Messaggio 4336296)
Ciao.
per prima cosa vorrei ringraziarti per il tempo che mi stai dedicando.
Ma anche in questo modo , mi si impunta al secondo effetto.
Quindi mi chiedo, sto sbagliando a settare le porte del pic?
il pic è un 12f629 ho scelto questo perchè molto piccolo.
Allora ho deciso di ricominciare da zero.
ecco come ho scritto il programma:

program prova

while true
main:
trisio.0=1
trisio.1=0
trisio.2=0
gpio.0=0
gpio.1=0
gpio.2=0



while gpio.0=0
gpio.1=1
gpio.2=0
delay_ms(1000)
gpio.1=0
gpio.2=1
delay_ms(1000)
wend


while gpio.0=0

gpio.1=1
gpio.2=1
delay_us(1000)
gpio.1=0
gpio.2=0
delay_us(1000)
wend

wend

end.

in questo modo ho notato che 2 effetti me li fa perfettamente, non da problemi neanche il pulsante, cambia l'effetto immediatamente.
Non ho avuto bisogno di inserire nessun goto, perchè quando cambio lo stato di gpio.0, esce dal while e non so per quale profezia, va al while successivo, ho messo il while totale perchè superato l'ultimo while, non tornerebbe all'inizio.
HO il problema che quando aggiungo il 3 effetto, non me lo legge assolutamente,io non capisco dove sbaglio, cioè esegue perfettamente i primi 2 poi bam.... torna all'inizio.
Ho provato anche ad aggiungere al 2 while un goto, ma non legge nulla.
Come posso fare per eseguire 3 semplici effetti?
O hai qualche consiglio per modificare questo ultimo che ho fatto e che al 75% funziona?

Grazie ancora

ciao,
non so che tipo di programmatore usi ma se hai la EasyPIC, "io ho la 5"
ha la possibilita del debag, in pratica controlli linea per linea in tempo reale il tuo programma variabili comprese.......

io di solito per i pulsanti uso la funzione case select

Flavio

trabo 22 luglio 14 11:25

Citazione:

Originalmente inviato da microcontrollorepic (Messaggio 4336347)
ciao,
non so che tipo di programmatore usi ma se hai la EasyPIC, "io ho la 5"
ha la possibilita del debag, in pratica controlli linea per linea in tempo reale il tuo programma variabili comprese.......

io di solito per i pulsanti uso la funzione case select

Flavio

Grazie .
Io utilizzo mikrobasic per scrivere il programma, mentre per programmare il pic, ho comprato il PICKit2 2,61 con connessione USB.
Comunque, quello che dici lo eseguo anche con mikrobasic, ovvero ''simulo'' il programma, ma diciamo che è reale al 50%.
Io credo che sto sbagliando a livello di concetti, o di qualche variabile che non ho impostato.

Grazie

microcontrollorepic 22 luglio 14 11:39

Citazione:

Originalmente inviato da trabo (Messaggio 4336351)
Grazie .
Io utilizzo mikrobasic per scrivere il programma, mentre per programmare il pic, ho comprato il PICKit2 2,61 con connessione USB.
Comunque, quello che dici lo eseguo anche con mikrobasic, ovvero ''simulo'' il programma, ma diciamo che è reale al 50%.
Io credo che sto sbagliando a livello di concetti, o di qualche variabile che non ho impostato.

Grazie

adesso sono in ufficio, questa sera scarico il listato e li do un occhio.......

se usi mikrobasic, guardati gli esempi da cui puoi trarre molte soluzioni.........

Flavio

n.b che versione hai di mikrobasic?

trabo 22 luglio 14 11:47

Citazione:

Originalmente inviato da microcontrollorepic (Messaggio 4336370)
adesso sono in ufficio, questa sera scarico il listato e li do un occhio.......

se usi mikrobasic, guardati gli esempi da cui puoi trarre molte soluzioni.........

Flavio

n.b che versione hai di mikrobasic?

Sto usando mikrobasic 6.4.0 ,quello che si trova free fino a 2kb sul sito ufficiale.
Dato che il programma che ho realizzato non raggiunge neanche un kb, va piu che bene.
Uso questo perchè a scuola ho utilizzato questo programma proprio con la scheda che hai tu, programmavo l'LCD, o facevo giochi con i led.
Ora pero' dopo qualche anno sto incontrando problemi.
Se avete bisogno anche dello schema che ho realizzato , ve la posto.
Se serve , dato che il pic 12f629, lavora a circa 4mhz, ho inserito un quarzo da 4mhz, per evitare di inserire l'oscillatore interno.

Vi ringrazio.
Buona giornata
attendo notizie

microcontrollorepic 22 luglio 14 12:15

Citazione:

Originalmente inviato da trabo (Messaggio 4336386)
Sto usando mikrobasic 6.4.0 ,quello che si trova free fino a 2kb sul sito ufficiale.
Dato che il programma che ho realizzato non raggiunge neanche un kb, va piu che bene.
Uso questo perchè a scuola ho utilizzato questo programma proprio con la scheda che hai tu, programmavo l'LCD, o facevo giochi con i led.
Ora pero' dopo qualche anno sto incontrando problemi.
Se avete bisogno anche dello schema che ho realizzato , ve la posto.
Se serve , dato che il pic 12f629, lavora a circa 4mhz, ho inserito un quarzo da 4mhz, per evitare di inserire l'oscillatore interno.

Vi ringrazio.
Buona giornata
attendo notizie

prima cosa devi essere sicuro che la parte hardware sia settata correttamente intendo come registri altrimenti parti con il piede sbagliato, vedo che questo pic ha molte 8 porte e molti piedini multifunzionale che se settati nel modo errato creano problemi.....

domanda ma perchè usi questo pic per un lavoro cosi semplice?

io ti consiglio di usare un 16f84 classico e molto semplice per testare il programma, è un piccolo trucco per togliersi dei dubbi.....

Flavio

trabo 22 luglio 14 12:50

Citazione:

Originalmente inviato da microcontrollorepic (Messaggio 4336412)
prima cosa devi essere sicuro che la parte hardware sia settata correttamente intendo come registri altrimenti parti con il piede sbagliato, vedo che questo pic ha molte 8 porte e molti piedini multifunzionale che se settati nel modo errato creano problemi.....

domanda ma perchè usi questo pic per un lavoro cosi semplice?

io ti consiglio di usare un 16f84 classico e molto semplice per testare il programma, è un piccolo trucco per togliersi dei dubbi.....

Flavio

ho usato questo pic perchè vorrei inserire la schedina dove è alloggiato , all'interno di un cilindro di 5cm di diametro, quindi essendo il 16f84 molto grande, per necessità di spazio ho optato per questo pic.
A livello hardware , sto usando le porte gp0-gp1-gp2, dove gp0 ho collegato il pulsante, gp1 ho collegato 4 led, gp2 altri 4 led.
in poche parole vorrei realizzare un piccolo cilindro con gli 9 led che escono sopra, ho preparato un dischetto con 8 buchi, dove andranno alloggiati i led.
e centrale il pulsante.

romoloman 22 luglio 14 13:50

a mio giudizio vanno disabilitati i comparatori sulle porte gpio 0,1,2 non ricordo a memoria il registro, dopo a casa verifico.
Inoltre come pic presenta un notevole vantaggio rispetto al 16f84... non ha bisogno di oscillatore esterno, tuttavia ricordati che per ottenete timing decenti devi caricare la calibrazione in OSCCAL.

trabo 22 luglio 14 14:16

Citazione:

Originalmente inviato da romoloman (Messaggio 4336530)
a mio giudizio vanno disabilitati i comparatori sulle porte gpio 0,1,2 non ricordo a memoria il registro, dopo a casa verifico.
Inoltre come pic presenta un notevole vantaggio rispetto al 16f84... non ha bisogno di oscillatore esterno, tuttavia ricordati che per ottenete timing decenti devi caricare la calibrazione in OSCCAL.

ti ringrazio...
il comparatore dovrei averli disabilitati, con cmcon=7
quindi tolgo il quarzo da 4mhz?
Attendo notizie

romoloman 22 luglio 14 14:30

Citazione:

Originalmente inviato da trabo (Messaggio 4336551)
ti ringrazio...
il comparatore dovrei averli disabilitati, con cmcon=7
quindi tolgo il quarzo da 4mhz?
Attendo notizie

avevo visto l'ultima copia del sorgente e crcom non c'era...
non è che puoi postare il codice che effettivamente stai usando ?

Inoltre per debuggare il programma ti consiglio un ottimo programma che si chiama pic simulator ide. che simula anche l'hardware attorno (ingressi pulsanti etc)

trabo 22 luglio 14 14:40

Citazione:

Originalmente inviato da romoloman (Messaggio 4336561)
avevo visto l'ultima copia del sorgente e crcom non c'era...
non è che puoi postare il codice che effettivamente stai usando ?

Inoltre per debuggare il programma ti consiglio un ottimo programma che si chiama pic simulator ide. che simula anche l'hardware attorno (ingressi pulsanti etc)


allora questo è quello che ho scritto da 0... con soli 2 effetti e funziona.
Se aggiungo il 3 effetto lo salta:

[program Lampeggioled



main:


while TRUE
trisio.1=0
trisio.2=0
trisio.0=1

gpio.1=1
gpio.2=1
cmcon=7



delay_ms(2000)

while gpio.0=0
gpio.1=1
delay_ms(1000)
gpio.1=0
delay_ms(1000)
wend



while gpio.0=0
delay_ms(2000)
gpio.2=0
delay_ms(2000)
wend



wend


Mentre questo è il primo in assoluto che ho realizzato...
Solo che ogni volta che premo il pulsante, mi va random:

program MyProject


main:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
IF gpio.0=0 THEN
GOTO fissa
end if

fissa:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
while true
gpio.1=1
gpio.2=1
if gpio.0=1 then
goto inizio
end if
wend


inizio:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

while true
if gpio.0=1 then
goto mezzo
end if
GPIO.1=1
gpio.2=1
delay_us(50)
GPIO.2=0
gpio.1=0
delay_us(50)
IF GPIO.0=1 THEN
GOTO mezzo
end if
wend


mezzo:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

while true
if gpio.0=1 then
goto strobo
end if
gpio.2=1
delay_ms(500)
gpio.2=0
delay_ms(500)
gpio.1=1
delay_ms(500)
gpio.1=0
delay_ms(500)
if gpio.0=1 then
goto strobo
end if
wend

strobo:
delay_ms(100)
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7
while true
if gpio.0=1 then
goto fissa
end if
gpio.1=1
gpio.2=1
delay_ms(50)
gpio.1=0
gpio.2=0
delay_ms(50)
if gpio.0=1 then
goto fissa
end if
wend
end.


INFINE, questo è quello che ho provato inserendo la variabile K ed eliminando i goto.
Questo si blocca al secondo effetto e da li non si muove:


program Lampeggioled

const tasto as byte[4]=(0,1,2,3)
dim K as byte
dim premuto as byte

main:
gpio.0=0
gpio.1=0
gpio.2=0
K=0
premuto=0
trisio.1=0
trisio.2=0
trisio.0=1
cmcon=7
while true
if gpio.0=0 then
premuto=0
end if

if (gpio.0=1)and (K<3) and (premuto=0) then
K=K+1
premuto=1
end if

if(gpio.0=1) and (K=3)and(premuto=0)then
K=0
end if

if K=0 then
gpio.1=1
gpio.2=1
end if

if K=1 then
gpio.1=1
gpio.2=1
delay_us(50)
gpio.1=0
gpio.2=0
delay_us(50)
end if

if K=2 then
gpio.1=1
delay_ms(500)
gpio.1=0
delay_ms(500)
gpio.2=1
delay_ms(500)
gpio.2=0
delay_ms(500)
end if

if K=3 then
gpio.1=1
gpio.2=1
delay_ms(50)
gpio.1=0
gpio.2=0
delay_ms(50)
end if
wend
end.

Ora tutti e 3 hanno dei problemi, e fino ad ora, l'unico che cambia perfettamente è quello con i soli while, ma non legge (se lo aggiungo ) il 3o effetto[/COLOR]

MSchiepp 23 luglio 14 18:09

Citazione:

Originalmente inviato da trabo (Messaggio 4336564)
allora questo è quello che ho scritto da 0... con soli 2 effetti e funziona.
Se aggiungo il 3 effetto lo salta:

Supponendo che non ci siano problemi nell'hardware, c'è sicuramente un problema sui rimbalzi dell'interruttore e su come lo utilizzi.
In pratica hai due cicli while uno dietro l'altro con la condizione di ripetizione data dallo stato del pulsante.
Adesso immagina di essere nel primo while: fino a che l'ingresso è zero continua ad eseguire il codice contenuto nel while, ma quando l'ingresso diventa 1 esegue l'istruzione while, trova l'ingresso a 1 ed esegue subito l'istruzione seguente il wend, che è un altro while e se l'ingresso è ancora a 1 lo salta ed esce subito al wend...
In pratica il cambio dell'effetto lo fa sui rimbalzi del pulsante e sfruttando i ritardi dei vari effetti.
Prova a mettere la condizione in fondo all'effetto, invece che all'inizio: non uso il mikrobasic, ma dovresti avere una struttura do ... while(condizione); in questo caso tra quando trova il pulsante chiuso e quando lo va a testare la volta successiva hai il tutto il tempo di ritardo dell'effetto che dovrebbe annullarti i rimbalzi.

Michele

trabo 30 luglio 14 13:39

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4338073)
Supponendo che non ci siano problemi nell'hardware, c'è sicuramente un problema sui rimbalzi dell'interruttore e su come lo utilizzi.
In pratica hai due cicli while uno dietro l'altro con la condizione di ripetizione data dallo stato del pulsante.
Adesso immagina di essere nel primo while: fino a che l'ingresso è zero continua ad eseguire il codice contenuto nel while, ma quando l'ingresso diventa 1 esegue l'istruzione while, trova l'ingresso a 1 ed esegue subito l'istruzione seguente il wend, che è un altro while e se l'ingresso è ancora a 1 lo salta ed esce subito al wend...
In pratica il cambio dell'effetto lo fa sui rimbalzi del pulsante e sfruttando i ritardi dei vari effetti.
Prova a mettere la condizione in fondo all'effetto, invece che all'inizio: non uso il mikrobasic, ma dovresti avere una struttura do ... while(condizione); in questo caso tra quando trova il pulsante chiuso e quando lo va a testare la volta successiva hai il tutto il tempo di ritardo dell'effetto che dovrebbe annullarti i rimbalzi.

Michele

Niente di niente...
A questo punto credo sia lo schema...
POSTO lo schema qui... se potete vedere se ho errato qualcosa
Image - TinyPic - Servizio di hosting d'immagini, condivisione immagini & hosting di video gratuito


Grazie ancora

MSchiepp 30 luglio 14 17:16

qualche ritocco sull'hardware si può fare...

- aggiungi un condensatore elettrolitico 10uF 16V all'uscita del regolatore
- aggiungi un condensatore di filtro da 47 nF tra il pin 1 e il pin 8 del micro
- il condensatore C1 non serve a molto... se vuoi filtrare il pulsante devi mettere anche una resistenza in serie (t=RC, ma se R=0...)

visto che hai già messo i transistor, lasciali, ma puoi pilotare direttamente i led dai pin del micro (con la dovuta resistenza) con correnti fino a 20mA.

Michele

trabo 30 luglio 14 17:37

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4345695)
qualche ritocco sull'hardware si può fare...

- aggiungi un condensatore elettrolitico 10uF 16V all'uscita del regolatore
- aggiungi un condensatore di filtro da 47 nF tra il pin 1 e il pin 8 del micro
- il condensatore C1 non serve a molto... se vuoi filtrare il pulsante devi mettere anche una resistenza in serie (t=RC, ma se R=0...)

visto che hai già messo i transistor, lasciali, ma puoi pilotare direttamente i led dai pin del micro (con la dovuta resistenza) con correnti fino a 20mA.

Michele

quindi... con queste modifiche che mi dici, credi che riesca a risolvere il problema?
E tra i programmi che ho scritto.... quale dunque mi consigli di utilizzare?
Aggiungo la resistenza??

Grazie

romoloman 30 luglio 14 18:13

Citazione:

Originalmente inviato da MSchiepp (Messaggio 4345695)
qualche ritocco sull'hardware si può fare...

- aggiungi un condensatore elettrolitico 10uF 16V all'uscita del regolatore
- aggiungi un condensatore di filtro da 47 nF tra il pin 1 e il pin 8 del micro
- il condensatore C1 non serve a molto... se vuoi filtrare il pulsante devi mettere anche una resistenza in serie (t=RC, ma se R=0...)

visto che hai già messo i transistor, lasciali, ma puoi pilotare direttamente i led dai pin del micro (con la dovuta resistenza) con correnti fino a 20mA.

Michele

già che uno c'è per non complicarsi la vita può ben pensare di rimuovere il quarzo, i due condensatori e usare l'oscillatore interno. in questo caso ricordarsi di caricare la calibrazione di fabbrica dell'oscillatore interno nell'apposito registro:

asm
{
bsf _status,RP0
call 0x3FF
movwf _osccal
bcf _status,RP0
}

Il grosso vantaggio è che si liberano ben due piedini di I/O

trabo 30 luglio 14 18:18

Citazione:

Originalmente inviato da romoloman (Messaggio 4345755)
già che uno c'è per non complicarsi la vita può ben pensare di rimuovere il quarzo, i due condensatori e usare l'oscillatore interno. in questo caso ricordarsi di caricare la calibrazione di fabbrica dell'oscillatore interno nell'apposito registro:

asm
{
bsf _status,RP0
call 0x3FF
movwf _osccal
bcf _status,RP0
}

Il grosso vantaggio è che si liberano ben due piedini di I/O

credi che il quarzo esterno dia problemi?
E poi? come dovrei rifare la calibrazione... scusa sono alle prima armi

romoloman 30 luglio 14 18:27

Citazione:

Originalmente inviato da trabo (Messaggio 4345763)
credi che il quarzo esterno dia problemi?
E poi? come dovrei rifare la calibrazione... scusa sono alle prima armi

Il vantaggio di usare quei micro pic si ha proprio nella presenza dell'oscillatore interno,
soprattutto nell'uso modellistico togliere il quarzo consente di ridurre ulteriormente le dimensioni del circuito.
La calibrazione la carichi con quelle righe di assembler che ti ho postato, la calibrazione viene fatta in fabbrica e normalmente non viene sovrascritta dal programmatore.
Se viene sovrascritta esiste la possibilità con il pikkit2 o il pickit3 di ricalcolarla.

Con il proton basic esiste un istruzione Set_OSCCAL che fa la stessa cosa. tuttavia non mi sembra presente nel mikrobasic, per quello ti ho postato l'assembly.

trabo 30 luglio 14 22:42

Citazione:

Originalmente inviato da romoloman (Messaggio 4345778)
Il vantaggio di usare quei micro pic si ha proprio nella presenza dell'oscillatore interno,
soprattutto nell'uso modellistico togliere il quarzo consente di ridurre ulteriormente le dimensioni del circuito.
La calibrazione la carichi con quelle righe di assembler che ti ho postato, la calibrazione viene fatta in fabbrica e normalmente non viene sovrascritta dal programmatore.
Se viene sovrascritta esiste la possibilità con il pikkit2 o il pickit3 di ricalcolarla.

Con il proton basic esiste un istruzione Set_OSCCAL che fa la stessa cosa. tuttavia non mi sembra presente nel mikrobasic, per quello ti ho postato l'assembly.


si ma questo significa che devo iniziare a studiare l'assembler.. giusto?
ho usato mikrobasic, perche a scuola lo ho studiato, quindi non sono partito completamente da 0..
Non so.. ditemi voi

romoloman 30 luglio 14 22:51

Citazione:

Originalmente inviato da trabo (Messaggio 4346032)
si ma questo significa che devo iniziare a studiare l'assembler.. giusto?
ho usato mikrobasic, perche a scuola lo ho studiato, quindi non sono partito completamente da 0..
Non so.. ditemi voi

No, basta che tu includa quel codice nel tuo programma basic...

romoloman 31 luglio 14 02:19

Puoi provare questo codice ?
Codice:

program MyProject

' Declarations section

main:
TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto mezzo
  end if
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF GPIO.0=1 THEN
    while (gpio.0=1)
    wend
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
  gpio.2=1
  delay_ms(500)
  gpio.2=0
  delay_ms(500)
  gpio.1=1
  delay_ms(500)
  gpio.1=0
  delay_ms(500)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
wend
end.


se invecevuoi usarlo senza oscillatore esterno, usa questo, ricordantoti di settare nelle preferenze di progetto (project->edit project) di usare l'oscillatore interno, ed inoltre gia che ci sei di disabilitare le funzioni sul GP3/MCLR (recuperi 3 pin)

Codice:

program MyProject

' Declarations section

main:
asm
bsf status,RP0;
call 0x3FF
movwf osccal
bcf status,RP0
end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto mezzo
  end if
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF GPIO.0=1 THEN
    while (gpio.0=1)
    wend
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
  gpio.2=1
  delay_ms(500)
  gpio.2=0
  delay_ms(500)
  gpio.1=1
  delay_ms(500)
  gpio.1=0
  delay_ms(500)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if gpio.0=1 then
    while (gpio.0=1)
    wend
    goto fissa
  end if
wend
end.


romoloman 31 luglio 14 03:40

Ti ho ripulito un po il codice...
ho fra l'altro notato che c'era un problema in "mezzo" il controllo del tasto veniva fatto solo ogni 2 secondi...

Normalmente per far lampeggiare un led quando c'è di mezzo il controllo di eventi esterni l'uso dei delay non è la cosa più corretta da fare... si usano anzi gli interrupt sui timers ma visto che sei alle prime armi evitiamo di complicarti la vita:

Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as integer
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1) and (count<200))
    delay_ms(1)
    count=count+1
  wend
  if (count=200) then
    result=1
  else
    result=0
  end if
end sub

main:
' RIMUOVERE I COMMENTI SUcCESSIVI IN CASO DI OSCILLATORE INTERNO
'asm
' bsf status,RP0;
' call 0x3FF
' movwf osccal
' bcf status,RP0
'end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if controlla_gpio()=1 then
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF controlla_gpio()=1 THEN
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  gpio.2=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.2=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if controlla_gpio()=1 then
    goto fissa
  end if
wend
end.


trabo 31 luglio 14 16:00

Citazione:

Originalmente inviato da romoloman (Messaggio 4346254)
Ti ho ripulito un po il codice...
ho fra l'altro notato che c'era un problema in "mezzo" il controllo del tasto veniva fatto solo ogni 2 secondi...

Normalmente per far lampeggiare un led quando c'è di mezzo il controllo di eventi esterni l'uso dei delay non è la cosa più corretta da fare... si usano anzi gli interrupt sui timers ma visto che sei alle prime armi evitiamo di complicarti la vita:

Codice:

program MyProject
' Declarations section
sub function controlla_gpio() as integer
  dim count as integer
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1) and (count<200))
    delay_ms(1)
    count=count+1
  wend
  if (count=200) then
    result=1
  else
    result=0
  end if
end sub

main:
' RIMUOVERE I COMMENTI SUcCESSIVI IN CASO DI OSCILLATORE INTERNO
'asm
' bsf status,RP0;
' call 0x3FF
' movwf osccal
' bcf status,RP0
'end asm

TRISIO.1=0
TRISIO.2=0
TRISIO.0=1
cmcon=7

fissa:
while true
  gpio.1=1
  gpio.2=1
  if controlla_gpio()=1 then
    goto inizio
  end if
wend


inizio:
delay_ms(100)
while true
  GPIO.1=1
  gpio.2=1
  delay_us(50)
  GPIO.2=0
  gpio.1=0
  delay_us(50)
  IF controlla_gpio()=1 THEN
    GOTO mezzo
  end if
wend


mezzo:
delay_ms(100)
while true
  gpio.2=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.2=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=1
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
  gpio.1=0
  delay_ms(500)
  if controlla_gpio()=1 then
    goto strobo
  end if
wend

strobo:
delay_ms(100)
while true
  gpio.1=1
  gpio.2=1
  delay_ms(50)
  gpio.1=0
  gpio.2=0
  delay_ms(50)
  if controlla_gpio()=1 then
    goto fissa
  end if
wend
end.


Il primo codice che mi hai postato, rimane fisso sul primo effetto, mentre

il secondo parte, premo il pulsante, mi cambia effetto e dopo 2 secondi torna al primo effetto... oppure se premo un po' di piu cambia effetto poi torna al primo

romoloman 31 luglio 14 17:38

Citazione:

Originalmente inviato da trabo (Messaggio 4346709)
Il primo codice che mi hai postato, rimane fisso sul primo effetto, mentre

il secondo parte, premo il pulsante, mi cambia effetto e dopo 2 secondi torna al primo effetto... oppure se premo un po' di piu cambia effetto poi torna al primo

prova a cambiare il codice in questo modo:
Codice:

sub function controlla_gpio() as integer
  dim count as long
  count=0
  'semplice procedura di debouncing....
  while ((gpio.0=1))
    delay_ms(1)
    count=count+1
  wend
  if (count>200) then
    result=1
  else
    result=0
  end if
end sub

tieni presente che il cambio effetto ce l'hai sul rilascio del pulsante....

ps non sono sicuro di long... ma count deve essere dichiarato in modo da supportare un valore di almeno 65000 (unsigned integer ??)

Non ho il mikrobasic sottomano...


Tutti gli orari sono GMT +2. Adesso sono le 18:39.

Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002