Jump to content
PLC Forum


Sign in to follow this  
Seonic

Problemi Controllo Motore Costrutto For Con Pic

Recommended Posts

Seonic

Ciao a tutti, mi sono avvicinato al mondo dei microcontrollori da poco e pian piano sto progredendo con vari esercizi, adesso però mi sono bloccato. Sono entrato in loop :smile: con un programma che dovrebbe muovere un motore in avanti per tot cicli per poi tornare indietro. Ho provato a cercare nel forum ma non ho trovato qualcosa che mi potesse aiutare.

il problema e che non capisco perchè con il costrutto for il programma cicla e non passi all'istruzione if, ho provato a mettere la variabile a

all'interno di avanti,a cambiare l'istruzione del while ma niente, se faccio il programma usando l'if funziona ma non capisco perche il for mi crea questo problema. Se qualcuno mi può aiutare lo ringrazio.

Ecco il programma:

__CONFIG (HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT); //Fuses

int i,a;
#define A RC0
#define B RC1
#define C RC2
#define D RC3
#define time 50

void avanti() { //funzione motore avanti
settaggi();
while(1) {
A=1;B=0;C=1;D=0; //home
DelayMs(time);

A=0;B=1;C=1;D=0;
DelayMs(time);
A=0;B=1;C=0;D=1;
DelayMs(time);
A=1;B=0;C=0;D=1;
DelayMs(time);
}
}
void indietro() { //funzione motore indietro
settaggi();
while(1) {
A=1;B=0;C=0;D=1;
DelayMs(time);
A=0;B=1;C=0;D=1;
DelayMs(time);
A=0;B=1;C=1;D=0;
DelayMs(time);
A=1;B=0;C=1;D=0;
DelayMs(time);
}
}
void main() {
settaggi();
while(1) {

a=0;
for (i=0; i<=5; i++) {
a++;
avanti();
}
if (a==5){
indietro();
}
}
}

Share this post


Link to post
Share on other sites

Livio Orsini
costrutto for il programma cicla e non passi all'istruzione if,

Smplicemente perchè non arriva mai a 5, tu hai scritto:

              for (i=0; i<=5; i++)

ed il ciclo si ferma a 4, se vuoi che arrivi a 5 devi scrivere i==5, o i<6.

Share this post


Link to post
Share on other sites
drugo66

Ciao,

premetto che non so per quale micro stai scrivendo o quale ambiente stai utilizzando, però non mi torna quel while(1) all'interno delle funzioni avanti() e indietro(); nel main chiami avanti() dopo il for, ma da quella funzione non puo' più uscire, perchè continuerà ad eseguire le istruzioni all'interno del while(1) nella funzione all'infinito (non esiste nulla che lo faccia uscire), a meno di qualche interrupt non specificato ...

Se ho affermato una castroneria, chiedo scusa in anticipo.

Share this post


Link to post
Share on other sites
simuffa

Dov'è la funzione settaggi() ?

ha ragione drugo66 da quel while non uscirà mai..

Share this post


Link to post
Share on other sites
Livio Orsini
ha ragione drugo66 da quel while non uscirà mai.

ma questo è lo scopo del main, dopo una serie di istruzioni che sie seguono una sola volta, si cicla in un loop infinito richiamando eventualmente le varie funzioni in modo condizionale o incondizionale, funzioni che in questo caso sono "avanti" ed "indietro"

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
simuffa

ma questo è lo scopo del main, dopo una serie di istruzioni che sie seguono una sola volta, si cicla in un loop infinito richiamando eventualmente le varie funzioni in modo condizionale o incondizionale, funzioni che in questo caso sono "avanti" ed "indietro"

ovviamente non mi riferivo a quello del main, ma a quello nelle funzioni avanti/indietro..

mentre il ciclo for non ha problemi, funziona come è scritto nel programma di Seonic

Edited by simuffa

Share this post


Link to post
Share on other sites
simuffa

quindi se elimini quei while(1) (tranne quello nel main) dovrebbe funzionare!

Edited by simuffa

Share this post


Link to post
Share on other sites
Seonic

Ciao a tutti e grazie.

Allora utilizzo mplabx e per il momento finchè non mi compro una scheda di sviluppo simulo il codice con real pic simulator.

La funzione settaggi è un header file che utilizzo per impostare porte e registri #include "settaggi.h"

Ho provato a cambiare l'istruzione for che era scritta male come diceva livio ma il problema rimane.

Volevo capire meglio il discorso del while perchè il mio grado di conoscenza è basso e da come state dicendo nelle funzioni avanti e indietro non passo qualche istruzione per uscire dal ciclo, ho provato a mettere all'interno del while di avanti l'istruzione while (a<6) ma non cambia niente, di sicuro sbaglio.

Non basterebbe passare ad avanti la variabile a?, scritta in questa maniera:

avanti (a) cosi avanti si muove per tot cicli per poi uscire?..

Share this post


Link to post
Share on other sites
simuffa

l'istruzione for era giusta,

se le istruzioni dentro avanti/indietro vanno eseguite una sola volta il ciclo while non serve..

basta richiamare la funzione avanti col for per quante volte ti serve come hai fatto.

altrimenti spiega meglio quello che vuoi fare

void avanti() { //funzione motore avanti
settaggi();
while(1) {
A=1;B=0;C=1;D=0; //home
DelayMs(time);

A=0;B=1;C=1;D=0;
DelayMs(time);
A=0;B=1;C=0;D=1;
DelayMs(time);
A=1;B=0;C=0;D=1;
DelayMs(time);
}
}
void indietro() { //funzione motore indietro
settaggi();
while(1) {
A=1;B=0;C=0;D=1;
DelayMs(time);
A=0;B=1;C=0;D=1;
DelayMs(time);
A=0;B=1;C=1;D=0;
DelayMs(time);
A=1;B=0;C=1;D=0;
DelayMs(time);
}
}
void main() {
settaggi();
while(1) {

a=0;
for (i=0; i<=5; i++) {
a++;
avanti();
}
if (a==5){
indietro();
}
}
}

intendo che basta togliere le righe segnate in rosso

Edited by simuffa

Share this post


Link to post
Share on other sites
simuffa

in pratica l'if dentro il main neanche serve, quando il for ha finito (dopo 6 volte) passa all'istruzione successiva, potrebbe essere semplificata così

void main() 
{
    settaggi();
    while(1) 
    {
        for (i=0; i<=5; i++) 
        {                       
             avanti();
        }
        indietro();
    }
}
Edited by simuffa

Share this post


Link to post
Share on other sites
drugo66

Io aggiungerei anche che la funzione settaggi(), se è quella che penso, va chiamata una volta sola prima del ciclo while(1) nel main()

La funzione settaggi è un header file che utilizzo per impostare porte e registri #include "settaggi.h"

Porte, registri e timer si impostano una volta sola (o meno di non doverli cambiare nuovamente, ma non credo sia il tuo caso) prima di eseguire il ciclo vero e proprio (o almeno io ho fatto sempre così); che senso ha impostare il tutto, poi impostarlo nuovamente in avanti() e poi in indietro() ?

Quindi farei così:

__CONFIG (HS & WDTDIS & PWRTDIS & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT);  //Fuses

#define A RC0
#define B RC1
#define C RC2
#define D RC3
#define time 50

int i;

//funzione motore avanti
void avanti()
{                             
    A=1;B=0;C=1;D=0;                   //home
    DelayMs(time); 
    A=0;B=1;C=1;D=0;                    
    DelayMs(time);
    A=0;B=1;C=0;D=1;     
    DelayMs(time);
    A=1;B=0;C=0;D=1;     
    DelayMs(time);
}

//funzione motore indietro
void indietro()
{
    A=1;B=0;C=0;D=1;
    DelayMs(time);
    A=0;B=1;C=0;D=1;
    DelayMs(time);
    A=0;B=1;C=1;D=0;
    DelayMs(time);
    A=1;B=0;C=1;D=0;
    DelayMs(time);
}

// funzione main
void main()
{
    settaggi();

    while(1)
    {
        for (i=0; i<=5; i++)
        {
           avanti();
        }
   
        indietro();
    }
}

Ci sarebbe anche da capire perchè esegui avanti() 6 volte e, invece, indietro() solo una, ma puo' essere una scelta mirata a qualcosa che non hai specificato ...

Edited by drugo66

Share this post


Link to post
Share on other sites
Seonic

Ciao, grazie mille a tutti!!!..sono proprio contento, grazie a voi adesso il programmino funziona, per rispondere a drugo66 non ho in mente un programma con i motori semplicemente dovendo imparare un esercizio era con essi, intanto ho imparato qualcosa di nuovo ed è gia un bel passo in avanti :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...