| |
| | #1 (permalink) Top |
| User Data registr.: 07-10-2009
Messaggi: 20
|
bene inizio a rompervi le bolas in attesa che mi arrivi il programmatore ![]() dunque partendo dal codice sorgente che mi sembra gia una buona base di partenza, allego il codice con le modifiche, che secondo me fanno quello che voglio io cioe ritardare di 5 secondi la rotazione del servo dopo la pressione del pulsante, il problema e poi come dico ritorna alla posizione iniziale dopo che ha fatto la rotazione di tot gradi impostato dal trimer? Codice: int tempo, gradi, x, y, valore, gradiRil, i;
void main (void){
ANSEL = 1; // configurazione input alanogico
TRISIO = 0b001011; // gpio0-1-3 in input gpio2 in output
valore = 40;
i=0;
while (1){
inizio:
tempo = ADC_READ(0);
delay_ms(5);
gradiRil = ADC_READ(1);
delay_ms(5000); //qui dico di ritardare 5secondi dopo la pressione tasto
tempo = (tempo+50)/50;
gradiRil = (gradiRil+50)/7;
for(x=0;x<tempo;x++){
for(y=0;y<valore;y++){
gpio.f2 = 1;
}
gpio.f2 = 0;
delay_ms(20);
}
if(gpio.f3)
i=i^1;
while(gpio.f3){}
if(i)
gradi = gradiRil;
else
gradi = 40;
if(valore==gradi)
goto inizio;
if(valore>gradi)
valore--;
else
valore++;
}} |
| | |
| | #2 (permalink) Top | |
| User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Citazione:
Michele P.S.: sul fatto che sia una buona base ci sarebbe da discutere... va bene giusto per iniziare, ma quando in un codice C vedi l'istruzione 'GOTO'... lascia perdere!!!
__________________ __________________________________________________ The worst day flying is better than the best day working. | |
| | |
| | #3 (permalink) Top |
| User Data registr.: 07-10-2009
Messaggi: 20
|
hai ragione ![]() cosi invece ?? Codice: int tempo, gradi, x, y, valore, gradiRil, i;
void main (void){
ANSEL = 1; // configurazione input alanogico
TRISIO = 0b001011; // gpio0-1-3 in input gpio2 in output
valore = 40;
i=0;
while (1){
inizio:
tempo = ADC_READ(0);
delay_ms(5);
gradiRil = ADC_READ(1);
delay_ms(5);
tempo = (tempo+50)/50;
gradiRil = (gradiRil+50)/7;
for(x=0;x<tempo;x++){
for(y=0;y<valore;y++){
gpio.f2 = 1;
}
gpio.f2 = 0;
delay_ms(5000); // qui ritardo di 5 secondi dopo la pressione tasto??
}
if(gpio.f3)
i=i^1;
while(gpio.f3){}
if(i)
gradi = gradiRil;
else
gradi = 40;
if(valore==gradi)
goto inizio;
if(valore>gradi)
valore--;
else
valore++;
}} |
| | |
| | #4 (permalink) Top |
| User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Bravo! così invece è sempre sbagliato. Qui c'è tanta gente che ti può insegnare, ma devi collaborare un po' anche tu... Spostare il ritardo 'a caso' sicuramente ti porterà in circa 10/15 tentativi a metterlo nel posto giusto, ma non è un metodo particolarmente consigliabile. Ti ho detto di capire dove viene letto il pulsante; evidentemente non hai idea di come si faccia a leggere un pulsante... prova almeno a guardare sullo schema su che piedino è e a trovare nel codice dove viene usato quel pin e da lì dovrebbe essere più facile. ESERCIZIO: prendi il codice che hai postato e commenta tutte le righe spiegando cosa fanno. Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. |
| | |
| | #6 (permalink) Top |
| User Data registr.: 07-10-2009
Messaggi: 20
|
ecco le righe commentate e giusto, cio capito qualcosa? ![]() Codice: int tempo, gradi, x, y, valore, gradiRil, i; //settaggio variabili
void main (void){
ANSEL = 1; // configurazione input alanogico
TRISIO = 0b001011; // gpio0-1-3 in input gpio2 in output
valore = 40;
i=0;
while (1){
inizio:
tempo = ADC_READ(0); //legge valore su GP0 per la velocita rotazione
delay_ms(5); //ritardo lettura valore
gradiRil = ADC_READ(1); //legge valore su GP per angolo rotazione
delay_ms(5); //ritardo lettura valore
tempo = (tempo+50)/50; //variabile tempo +50 diviso 50
gradiRil = (gradiRil+50)/7; //variabile gradirilevati +50 diviso 7
for(x=0;x<tempo;x++){ //se X uguale a 0 ma minore di tempo aumenta X
for(y=0;y<valore;y++){ // se Y uguale a 0 ma minore di valore aumenta Y
gpio.f2 = 1; //genera il segnale controllo servo
}
gpio.f2 = 0;
delay_ms(5);
}
if(gpio.f3) //rileva segnale tasto
i=i^1; //se i uguale portalo ad 1 cioe tasto premuto
delay_ms(5000);// qui ritardo di 5 secondi dopo la pressione tasto
while(gpio.f3){}
if(i)
gradi = gradiRil;
else
gradi = 40; //se i gradi sono uguali a gradiRil porta a 40
if(valore==gradi)
goto inizio; //se invece valore uguale a gradi ritorna inizio
if(valore>gradi) //se valore e maggiore di gradi
valore--; //diminuisci il valore
else //altrimenti
valore++; //aumenta valore
}} Ultima modifica di sniper5 : 01 maggio 14 alle ore 13:02 |
| | |
| | #7 (permalink) Top |
| User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| Poco... Nel ciclo for cosa vuol dire Se x uguale a zero ma minore di tempo ???? La lettura corretta è: per tutti i valori di x crescenti da 0 a tempo (escluso) vengono ripetute le istruzioni del ciclo for. Gpio.f2 = 1 non genera un segnale servo... gpio.f2 = 0; questa cosa fa? i=i^1; //se i uguale portalo ad 1 cioe tasto premuto i uguale a che cosa? Perchè a 1? Questa istruzione fa una cosa molto diversa... if(i) gradi = gradiRil; else gradi = 40; //se i gradi sono uguali a gradiRil porta a 40 Qui proprio non ci siamo...
__________________ __________________________________________________ The worst day flying is better than the best day working. |
| | |
| | #8 (permalink) Top |
| User Data registr.: 21-01-2004 Residenza: Milano
Messaggi: 989
| E vedrai quante altre ne dovrai sapere!! Così va meglio, puoi anche metterlo dopo l'istruzione while(gpio.f3) che aspetta il rilascio del tasto (in realtà aspetta solo il primo rimbalzo...): in questo modo il ritardo parte quando rilasci il tasto. Attenzione perchè hai un problema di parentesi: dopo l'istruzione IF, in caso di test positivo, se non metti la parentesi verrà eseguita solo l'istruzione immediatamente seguente, mentre se usi le parentesi {...} verranno eseguite tutte le istruzioni racchiuse tra le parentesi; consiglio: usa sempre le parentesi anche per una sola istruzione: il codice è più semplice da leggere e da modificare. Michele
__________________ __________________________________________________ The worst day flying is better than the best day working. |
| | |
| | #9 (permalink) Top |
| User Data registr.: 07-10-2009
Messaggi: 20
|
quindi conviene mettere ogni istruzione fra le {...} ed il ritardo dopo il while(gpio.f3) ok piu o meno ci sono... ora come dovrei far ritornare il servo alla posizione iniziale... cosi inizio a smanettarci.. ci vorrebbe un simulatore grafico...sto usando MikroC ma non lo capito tanto.. come funziona il debugger? segue le istruzioni e quanto arriva al primo delay di ADC_READ inizia a contare all'infinito bho |
| | |
![]() |
| Bookmarks |
| |
Discussioni simili | ||||
| Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
| aiuto programazione pic12f675 | daniele 1973 | Circuiti Elettronici | 17 | 06 novembre 13 10:15 |
| Ancora sui servo.... movimento spurio all'accensione | buddace | Radiocomandi | 29 | 05 luglio 12 01:33 |
| Automatizzare movimento servo. | top sport | Circuiti Elettronici | 3 | 23 maggio 11 23:51 |
| aumento angolatura movimento servo | Nello82 | Modellismo | 4 | 23 aprile 09 16:17 |
| movimento servo | Flybar | Elimodellismo Principianti | 1 | 28 dicembre 05 23:30 |