Seonic Inserito: 7 febbraio 2015 Segnala Share Inserito: 7 febbraio 2015 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 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 More sharing options...
Livio Orsini Inserita: 7 febbraio 2015 Segnala Share Inserita: 7 febbraio 2015 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 More sharing options...
drugo66 Inserita: 7 febbraio 2015 Segnala Share Inserita: 7 febbraio 2015 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 More sharing options...
simuffa Inserita: 7 febbraio 2015 Segnala Share Inserita: 7 febbraio 2015 Dov'è la funzione settaggi() ? ha ragione drugo66 da quel while non uscirà mai.. Link al commento Condividi su altri siti More sharing options...
Livio Orsini Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) 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: 8 febbraio 2015 da Livio Orsini Link al commento Condividi su altri siti More sharing options...
simuffa Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) 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: 8 febbraio 2015 da simuffa Link al commento Condividi su altri siti More sharing options...
simuffa Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) quindi se elimini quei while(1) (tranne quello nel main) dovrebbe funzionare! Modificato: 8 febbraio 2015 da simuffa Link al commento Condividi su altri siti More sharing options...
Seonic Inserita: 8 febbraio 2015 Autore Segnala Share Inserita: 8 febbraio 2015 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 More sharing options...
simuffa Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) 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: 8 febbraio 2015 da simuffa Link al commento Condividi su altri siti More sharing options...
simuffa Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) 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: 8 febbraio 2015 da simuffa Link al commento Condividi su altri siti More sharing options...
drugo66 Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 (modificato) 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: 8 febbraio 2015 da drugo66 Link al commento Condividi su altri siti More sharing options...
simuffa Inserita: 8 febbraio 2015 Segnala Share Inserita: 8 febbraio 2015 condivido in toto! Link al commento Condividi su altri siti More sharing options...
Seonic Inserita: 10 febbraio 2015 Autore Segnala Share Inserita: 10 febbraio 2015 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 Link al commento Condividi su altri siti More sharing options...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora