Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 01 maggio 14, 10:10   #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++;
 
}}
sniper5 non è collegato   Rispondi citando
Vecchio 01 maggio 14, 11:10   #2 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da sniper5 Visualizza messaggio
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
No... tu hai messo un ritardo fisso (pulsante premuto o no) dopo la lettura dei trimmer; prova a chiederti in che punto del codice viene letto il pulsante e dove decide se il pulsante è premuto oppure no.

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.
MSchiepp non è collegato   Rispondi citando
Vecchio 01 maggio 14, 11:25   #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++;
 
}}
sniper5 non è collegato   Rispondi citando
Vecchio 01 maggio 14, 11:59   #4 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da sniper5 Visualizza messaggio
hai ragione
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
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 01 maggio 14, 12:20   #5 (permalink)  Top
User
 
Data registr.: 07-10-2009
Messaggi: 20
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 non è collegato   Rispondi citando
Vecchio 01 maggio 14, 12:59   #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
sniper5 non è collegato   Rispondi citando
Vecchio 01 maggio 14, 13:29   #7 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da sniper5 Visualizza messaggio
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...
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 01 maggio 14, 12:59   #8 (permalink)  Top
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da sniper5 Visualizza messaggio
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
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando
Vecchio 01 maggio 14, 13:12   #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
sniper5 non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


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



Tutti gli orari sono GMT +2. Adesso sono le 04:30.


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