BaroneRosso.it - Forum Modellismo

BaroneRosso.it - Forum Modellismo (https://www.baronerosso.it/forum/)
-   Circuiti Elettronici (https://www.baronerosso.it/forum/circuiti-elettronici/)
-   -   Aiuto programazione pic x movimento servo (https://www.baronerosso.it/forum/circuiti-elettronici/315597-aiuto-programazione-pic-x-movimento-servo.html)

sniper5 01 maggio 14 11:25

hai ragione:D
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++;
 
}}


MSchiepp 01 maggio 14 11:59

Citazione:

Originalmente inviato da sniper5 (Messaggio 4248188)
hai ragione:D
cosi invece ??

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

sniper5 01 maggio 14 12:20

:D se sapevo tutte ste cose.......
riguardando meglio il tasto viene letto da gpio.f3 quindi per farmi il ritardo
Codice:

if(gpio.f3)
delay_ms(5000); //ritardo tasto
  i=i^1;
  while(gpio.f3){}


sniper5 01 maggio 14 12:59

ecco le righe commentate e giusto, cio capito qualcosa?:D
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

}}


MSchiepp 01 maggio 14 12:59

Citazione:

Originalmente inviato da sniper5 (Messaggio 4248237)
:D se sapevo tutte ste cose.......

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

sniper5 01 maggio 14 13:12

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 :o:

MSchiepp 01 maggio 14 13:29

Citazione:

Originalmente inviato da sniper5 (Messaggio 4248269)
ecco le righe commentate e giusto, cio capito qualcosa?

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

sniper5 02 maggio 14 12:22

Dunque credo almeno spero:P di aver trovato il punto dove mettere l'istruzione per far ritornare indietro il servo dopo che a eseguito la rotazione, quindi quel GOTO inizio li non va bene di sicuro, la posizione riposo e 40 ma potebbe essere 20 10 0 do per buono 40 quindi le istruzioni sotto sono corrette ma fina a un certo punto come è adesso attende una nuova pressione tasto per ritornare alla posizione iniziale.. quindi secondo la mia intelligenza caprina:P "goto inizio" va spostato alla fine del listato giusto??
Codice:

{                  //ciclo istruzioni dopo pressione tasto
if(i)
  gradi = gradiRil; //gradi = valore rilevato dall’ADC(gradiRil)
  else
  gradi = 40;    //gradi = 40 oppure il valore rilevato dall’ADC(gradiRil)
 }
 {
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
 }


MSchiepp 02 maggio 14 15:18

Citazione:

Originalmente inviato da sniper5 (Messaggio 4249292)
"goto inizio" va spostato alla fine del listato giusto??

No, non devi spostare il goto, devi modificare il codice, ma prima devi capire bene come funziona.
Il codice da cui sei partito sente 2 pressioni del tasto: alla prima sposta il servo nella posizione impostata in 'gradi' e alla successiva lo porta alla posizione di riposo 40.

if(i){
gradi = gradiRil; //gradi = valore rilevato dall’ADC(gradiRil)
} else {
gradi = 40; //gradi = 40 oppure il valore rilevato dall’ADC(gradiRil)
}

invece di questa scelta devi lasciare fissa l'impostazione che sposta il servo a gradiRil e poi lo riporti alla posizione di partenza, senza dover aspettare di premere ancora il tasto.

sniper5 02 maggio 14 15:41

http://prontoinfermieri.it/wp-conten...o-in-fumo1.jpg

else
gradi = 40;
dice attendi nuova pressione per ritornare alla posizione riposo???
e se al posto di else metto return??


Tutti gli orari sono GMT +2. Adesso sono le 13:26.

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