Vai al contenuto
PLC Forum


Problemi Controllo Motore Costrutto For Con Pic


Seonic

Messaggi consigliati

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();
}
}
}

Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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"

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

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

Modificato: da simuffa
Link al commento
Condividi su altri siti

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?..

Link al commento
Condividi su altri siti

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

Modificato: da simuffa
Link al commento
Condividi su altri siti

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();
    }
}
Modificato: da simuffa
Link al commento
Condividi su altri siti

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 ...

Modificato: da drugo66
Link al commento
Condividi su altri siti

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:

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...