Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 19 luglio 14, 11:22   #1 (permalink)  Top
User
 
Data registr.: 19-07-2014
Messaggi: 17
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.

Ultima modifica di trabo : 19 luglio 14 alle ore 11:25
trabo non è collegato   Rispondi citando
Vecchio 19 luglio 14, 13:15   #2 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da trabo Visualizza messaggio
...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
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 19 luglio 14, 14:10   #3 (permalink)  Top
User
 
Data registr.: 19-07-2014
Messaggi: 17
Citazione:
Originalmente inviato da MSchiepp Visualizza messaggio
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.
trabo non è collegato   Rispondi citando
Vecchio 19 luglio 14, 17:04   #4 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
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
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 19 luglio 14, 17:09   #5 (permalink)  Top
User
 
Data registr.: 19-07-2014
Messaggi: 17
Citazione:
Originalmente inviato da MSchiepp Visualizza messaggio
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
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.

Ultima modifica di trabo : 19 luglio 14 alle ore 17:16
trabo non è collegato   Rispondi citando
Vecchio 19 luglio 14, 23:48   #6 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
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
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 22 luglio 14, 09:30   #7 (permalink)  Top
User
 
Data registr.: 19-07-2014
Messaggi: 17
Citazione:
Originalmente inviato da MSchiepp Visualizza messaggio
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
trabo non è collegato   Rispondi citando
Vecchio 22 luglio 14, 10:20   #8 (permalink)  Top
User
 
L'avatar di microcontrollorepic
 
Data registr.: 18-07-2007
Residenza: milano
Messaggi: 1.448
Citazione:
Originalmente inviato da trabo Visualizza messaggio
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
__________________
SITO INTERNET:
Taglio cnc,
microcontrollorepic non è collegato   Rispondi citando
Vecchio 22 luglio 14, 10:25   #9 (permalink)  Top
User
 
Data registr.: 19-07-2014
Messaggi: 17
Citazione:
Originalmente inviato da microcontrollorepic Visualizza messaggio
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
trabo non è collegato   Rispondi citando
Vecchio 22 luglio 14, 10:39   #10 (permalink)  Top
User
 
L'avatar di microcontrollorepic
 
Data registr.: 18-07-2007
Residenza: milano
Messaggi: 1.448
Citazione:
Originalmente inviato da trabo Visualizza messaggio
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?
__________________
SITO INTERNET:
Taglio cnc,
microcontrollorepic non è collegato   Rispondi citando
Rispondi

Bookmarks



Strumenti discussione
Visualizzazione

Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
pic 12F629 faustog_2 Circuiti Elettronici 2 07 ottobre 13 11:52
ESC con PIC Italia Circuiti Elettronici 4 23 marzo 13 16:27
Problema con programma MPX per aggiornamento Royal PRO picman Radiocomandi 0 29 agosto 10 20:27
Programma facile per pic Orso82 Circuiti Elettronici 20 27 febbraio 05 16:44
Regolatore con PIC rapis Circuiti Elettronici 1 26 novembre 01 11:15



Tutti gli orari sono GMT +1. Adesso sono le 21:37.


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