PDA

View Full Version : [C] problemi


lefermops
17-06-2009, 12:23
sto passando dall'assembler al C. forse sono ancora troppo rivolta al basso livello ....
:mc: non riesco a controllare se un parametro è o meno nel range... ho fatto e rifatto quella routine in mille modi, ma non riesco a capire....:muro:

richiamo una procedura di controllo, faccio il controllo, poi al ritorno il test una scelta. sono stata attenta e mi pare che sia semplice....dovrebbe andare liscio, invece non funziona ç_ç



long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) && (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}

[...main...]
case 5: //controllo
controllo(param);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;


grazie a chi mi darà una dritta!!^^:help:

Volutomitra
17-06-2009, 12:32
if ((param1 >25) && (param1<1))

Come fa param1 a essere contemporaneamente maggiore di 25 e minore di 1?

Forse è meglio un OR...

lefermops
17-06-2009, 12:34
si, è un OR.... ho sbagliato a scrivere...

param1 lo setto nel main....

qwerty86
17-06-2009, 12:45
ci sono un paio di problemi :

-la funzione controllo prende due parametri , ma tu nel main ne passi solo uno
- cosa intendi con non funziona? non compila? o non esegue quello che vuoi ?

lefermops
17-06-2009, 12:52
a controllo passo i due parametri che nell'ordine in cui li ho dichiarati nella procedura.

il problema è che non riesco ad ottenere quello che voglio...

se metto un valore alla mia variabile fuori dalla "banda di valenza" bippa lo stesso, e funziona come se fosse il valore "buono".


long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) || (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else if ((param1<25)&&(param1>1)) buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}

[...main...]
case 5: //controllo
controllo(param1, param2);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;

ndakota
17-06-2009, 12:56
fai restituire alla funzione un valore ma non lo assegni a niente, così lo perdi. non dovresti fare

param2 = controllo(param1, param2);

?

EDIT anche l'else if è sbagliato: devi mettere un or. inoltre se fai uso di >=, <= ti basta un else senza if.

tomminno
17-06-2009, 13:11
long controllo(long param1, long param2)
{ //passabanda!!!! --> 1<param1<25
timer = 200; // carico timer = 2 secondi
// se param1 > 25 -> overbanda + se param <1 -> underbanda
if ((param1 >25) || (param1<1))
{
scrivo_errore(); //scrivo "errore" a video
param2 = 21; //segnalo errore
}
else if ((param1<25)&&(param1>1)) buzzer = 1; // sono in "banda" faccio un bip!
return(param2); //trasmetto param2 al main
}

[...main...]
case 5: //controllo
controllo(param1, param2);
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;


La definizione di controllo è sbagliata param2 non verrà mai ritornato al main, hai 2 possibilità:

void controllo(long param1, long * param2)
...
//nel main
controllo(param1, &param2);



long controllo(long param1)
...
//nel main
param2 = controllo(param1);


io preferisco la seconda

lefermops
17-06-2009, 13:17
Grazie!!!!!!:D
adesso funziona!!!
ho assegnato il parametro al richiamo della procedura
param2 = controllo(param1, param2);
e tolto l'if all'else usando >=e<=.
grazie mille per l'aiuto!!!:p

ndakota
17-06-2009, 13:20
figurati :)
comunque come ti ha fatto vedere tomminno è ancora meglio, non hai bisogno di param2 nella funzione a questo punto.

lefermops
17-06-2009, 14:45
provo il nuovo assetto con un solo parametro....
non pensavo che fosse così difficile il passaggio da basso ad alto livello!!!

lefermops
17-06-2009, 15:24
anche con un solo parametro funziona ;)
grazie milleeeeeeeee!!:D

ma ho già un secondo problema.... (ettepareva!!)

sto cercando di tarare un sensore (normalissimo ponte resistivo).
ho fatto succedere le videate...
1° ----- (sto aspettando la risposta)
2° quando il converter risponde, visualizzo tranquilla la lettura e salvo il primo valore.
fin qui tutto bene......
ma se cerco di fare la videata col secondo punto di taratura, le prime due videate non funzionano più......


case 8: //aspetto che converter sia stabile
if(!conv) //se converter non attivo
{
trattini(); // visualizzo '----'
}
if (tasto==x) stato =1; //torno indietro
if (param2!=21) stato++; //vado oltre
else break;

case 9: //prendo primo punto calibrazione
vis_conv(); //visualizzo lettura converter su video
primo_valore = lettura_conv; //salvo lettura primo punto
if (tasto==x) stato =1; //torno indietro
//timer = 500; // ricarico timer a 5 SECONDI
stato++; // VADO OLTRE
BUZZER=1; // bippa
break;

case 10: //prendo secondo punto calibrazione
timer=5000; //carico 5 minuti
temp=100;
while (timer) scaldo(); //porto a temperatura nota
vis_conv(); //visualizzo lettura converter su video
secondo_valore = lettura_conv; //salvo lettura secondo punto
if (tasto==x) stato =1; //torno indietro
timer = 500; // ricarico timer a 5 SECONDI
stato++; // VADO OLTRE
BUZZER=1; // bippa
break;




il bello è che non riesco ad usare i breakpoint!!! sto imparando sia il C che ad usare il compilatore ma..... mi sa che entrambi mi detestano!!!! ç_ç

lefermops
18-06-2009, 11:33
risolto.....^^
ho rifatto tutto da capo!!:D

malocchio
18-06-2009, 11:47
Ma per curiosità per che cosa stai programmando?

lefermops
18-06-2009, 11:55
sto ri-scrivendo il firmware per una cpu che gestisce un sensore, una stampantina, una tastiera e un display....
il programma in origine è un fw di 32k in assembler intel.... solo che il processore che usavamo è stato obsoletato..... quindi ci è toccato sceglierne un altro.
il mio capo ha scelto il 430 della texas.... che dopo due mesi di remate, comincia anche a piacermi (adesso che funziona!!^^)
poi abbiamo pensato che, visto che avrei comunque dovuto imparare ad usare il nuovo assembler e il nuovo compilatore, era meglio passare al C, per avere una maggiore portabilità.... e non dover rifare sempre i sw ogni 10/15 anni quando il micro viene obsoletato!!!! (ma per me è il primo osbolamento..)
ma finalmente sono contenta!!!! il mio bambino inizia a funzionareeeeeee!!!! :D

ndakota
18-06-2009, 12:32
che figata. spero di trovare un lavoro come il tuo un giorno :)

lefermops
20-06-2009, 15:45
...... anch'io!!!:D magari anche con uno stipendio!!!;)
qui i soldi non girano.... e spesso siamo costretti a lavorare gratis.... ma nonostante tutto è bello, e prima o poi la crisi finirà,.... ma con 'sti cinesi che vendono a 1 euro ciò che qui in Italia costa 100, la vedo dura!!