| ecologix1971
| Inviato il: 30/7/2012,14:01
|
ho visto che hai messo a fuoco il problema che ti ho esposto.... ...aime con il c++ non posso aiutarti. ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 30/7/2012,14:53
|
Dovremmo esserci...ho fatto la prova solo in modo teorico...devi effettuare 3 modifiche e dovrebbe andare tutto quanto. Fai la prova quando vuoi/puoi.... Ciao Bolle
1 CODICE 4650 bhj=sr/60 MOD 60 4651 LCDWRITE=RIGHT("0"&bhj,2) 4652 bhj=sr MOD 60 4653 LCDWRITE=":"&RIGHT("0"&bhj,2)
2CODICE 4900 message="ON "&stt/86400 MOD 9999&":" 4901 bhj="0"&stt/3600 MOD 24 4902 message =message & RIGHT(bhj,2)&":" 4903 bhj="0"&stt/60 MOD 60 4904 message=message &RIGHT(bhj,2) 4905 bhj="0"&stt MOD 60 4906 message=message &":"&RIGHT(bhj,2)&" "
3CODICE 8180 DATA "Von",13.7001,0.1,14.2,12.5
Questo è il codice completo:
CODICE 100 ' 150 ' h2-o transfer 1_1 27-07-2012 200 ' by ecologix 1971 220 ' versione display 16 chrs 250 ' 300 ' bit0 =cads1 tensione batteria 350 ' bit1 =inp livello max serbatoio up 400 ' bit2 =inp livello min serbatoio down 450 ' bit3 =inp aumenta 500 ' bit4 =inp diminuisce 550 ' bit5 =inp conferma 600 ' bit15=out pompa h2-o 12 volts 650 ' 700 PRAGMA EXTERNAL_EEPROM 750 SETIO=63 800 'OUT=0 850 CADS=1 860 DIM valore(3) AS FLOAT 900 ' vok=0 vbat<von mentre vok=1 vbat>von 950 ' 1000 ' 1050 'goto 1450 1100 ' 1150 'presentazione 1200 ' 1250 LCDCLEAR 1300 LCDPOS=&h12 1350 LCDWRITE="H2-O TRANSFER" 1400 LCDPOS=&h21 1450 LCDWRITE="By ecologix 1971" 1500 WAITS 2 1510 LCDPOS=&h21 1550 LCDWRITE="V. 1.1 27.07.12" 1600 WAITS 3 1650 ' 1700 OUTBIT(15)=0 1720 GOSUB 8000 2050 ' 2100 ' 2150 ' 2200 ' 2250 ' 2300 :prestart 2350 ' 2400 IF vok=0 THEN 2500 2450 st+=ss 2500 WAITS 1 2550 vok=0 2600 LCDCLEAR 2650 ' 2700 :start 2750 ' 2800 LCDPOS=&h21 2850 WAITMS 250 2900 ' 2950 ' 3000 ' 3050 v=CADS1 3100 volt=v*0.01623266131 ' <---- fattore moltiplicatore 3150 ' 3200 ' 3250 ' 3300 LCDPOS=&h11 3350 strvolt=LEFT(volt,5) 3400 LCDWRITE="V= "&RIGHT(" "&strvolt,5) 3450 LCDPOS=&h21 3500 LCDWRITE=message 3550 OUTBIT(15)=vok 3600 ' 3650 ' 3700 ' 3750 IF INPBIT(1)=1 THEN :serbatoio_up_pieno 3800 IF INPBIT(2)=0 THEN :serbatoio_down_vuoto 3850 IF INPBIT(5)=1 THEN :visualizza_parametri 3900 ' 3950 IF vok=1 THEN 4150 4000 IF volt>von THEN :tensione_raggiunta 4050 IF volt>voff THEN :tensione_intermedia 4100 IF vok=0 THEN :start 4150 ' 4200 IF volt<voff THEN :tensione_insufficiente 4250 ' 4300 ' 4350 ' counter 4400 ' 4450 'st+=ss 4500 ss=INT(TIMER) 'secondi trascorsi 4550 sr=(time*60)-ss 'secondi rimanenti 4600 LCDPOS=&H1a 4500 ss=INT(TIMER) 'secondi trascorsi 4550 sr=(time*60)-ss 'secondi rimanenti 4600 LCDPOS=&H1a 4650 bhj=sr/60 MOD 60 4651 LCDWRITE=RIGHT("0"&bhj,2) 4652 bhj=sr MOD 60 4653 LCDWRITE=":"&RIGHT("0"&bhj,2) 4700 stt=st+ss 4750 LCDPOS=&h25 4800 a=(a+1) MOD 10 4850 IF a=0 THEN 5000 4900 message="ON "&stt/86400 MOD 9999&":" 4901 bhj="0"&stt/3600 MOD 24 4902 message =message & RIGHT(bhj,2)&":" 4903 bhj="0"&stt/60 MOD 60 4904 message=message &RIGHT(bhj,2) 4905 bhj="0"&stt MOD 60 4906 message=message &":"&RIGHT(bhj,2)&" " 4950 GOTO 5150 5000 w=0.0083*stt 5050 strw=LEFT(w,5) 5100 message="POWER = "&strw&" " 5150 IF sr>0 THEN :start 5200 PWMDC=0 5250 :tempo_esaurito 5300 ' 5350 message=" TIME END " 5400 GOTO :prestart 5450 ' 5500 :tensione_raggiunta 5550 ' 5600 vok=1 5650 message="ON " 5700 PWMDC=0 5750 GOTO :start 5800 ' 5850 GOTO :prestart 5900 ' 5950 :tensione_insufficiente 6000 ' 6050 message=" LOW BAT " 6100 ' 6150 GOTO :prestart 6200 ' 6250 :tensione_intermedia 6300 ' 6350 message=" "&LEFT(DATE,14) 6400 ' 6450 GOTO :start 6500 ' 6550 :serbatoio_up_pieno 6600 ' 6650 message="TANK UP FULL " 6700 ' 6750 GOTO :prestart 6800 ' 6850 :serbatoio_down_vuoto 6900 ' 6950 message="TANK DOWN EMPTY" 7000 ' 7050 GOTO :prestart 8000 ' 8060 :settaggio_parametri 8080 ' 8100 LCDCLEAR 8110 WAITS 1 8120 LCDPOS=&h14 8130 LCDWRITE="SET RANGE" 8140 WAITS 3 8160 LCDCLEAR 8180 DATA "Von",13.7001,0.1,14.2,12.5 8200 DATA "Voff",11.8,0.1,12.1,11.6 8220 DATA "time",15,1,60,1 8240 READ scritta,a,k,amax,amin 8260 ' 8280 :start1 8300 ' 8320 stra=RIGHT("0"&a,2)&":00" 8340 IF j=2 THEN 8380 8360 stra=LEFT(" "&a,5) 8380 LCDPOS=&h13 8400 LCDWRITE=""&scritta&"= "&stra 8420 ' 8440 IF INPBIT(3)=1 THEN :aumenta 8460 IF INPBIT(4)=1 THEN :diminuisce 8480 IF INPBIT(5)=1 THEN :conferma 8500 GOTO :start1 8520 ' 8540 :aumenta 8560 ' 8580 IF a>=amax THEN :start1 8600 a=a+k 8620 GOTO :start1 8640 ' 8660 :diminuisce 8680 ' 8700 IF a<=amin THEN :start1 8720 a=a-k 8740 GOTO :start1 8760 ' 8780 :conferma 8800 ' 8820 LCDCLEAR 8840 j++ 8860 valore(j)=a 8880 IF j=3 THEN 9250 8900 READ scritta,a,k,amax,amin 8920 GOTO :start1 8925 ' 8927 :visualizza_parametri 8930 : 8940 LCDCLEAR 8950 FOR w=1 TO 20 8960 strvon=LEFT(" "&valore(1),5) 8980 strvoff=LEFT(" "&valore(2),5) 9000 strtime=INT(valore(3))&":00" 9020 LCDPOS=&h11 9040 LCDWRITE="on"&strvon 9060 LCDPOS=&h19 9080 LCDWRITE="off"&strvoff 9100 LCDPOS=&h23 9120 LCDWRITE="time = "&strtime 9140 IF INPBIT(3)=1 AND INPBIT(4)=1 THEN 1700 9190 NEXT w 9200 ' 9205 LCDCLEAR 9210 GOTO :start 9250 ' 9300 j=0 9310 RESTORE 9320 ' 9350 von=valore(1) 9400 voff=valore(2) 9450 time=valore(3) 9455 LCDCLEAR 9460 LCDPOS=&h13 9470 LCDWRITE="Successfully!" 9480 WAITS 3 9500 RETURN
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | PinoTux
| Inviato il: 30/7/2012,15:33
|
....."Meno male che ecologix c'è"....
(...e pure Bolle... )
--------------- "Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza" http://iv3gfn.altervista.org/ http://pptea.altervista.org/
| | | | NonSoloBolleDiAcqua
| Inviato il: 31/7/2012,08:12
|
Eco, lascia stare le prove di sopra...dovrei (condizionale d'obbligo) aver risolto tutto...sia il problema del float che lo stack sulle operazioni delle stringhe concatenate a iosa.
Avere delle indicazioni così precise aiuta molto e velocizza enormemente il lavoro. Ho riportato lo stack come nella versione 2.16c e quindi il tuo codice iniziale (postato nella prima pagina) non dovrebbe avere più problemi. Allego la versione 2.16q che devi inserire nel nuovo firmware....(la versione del compilatore 2.16p è compatibile) se mi dai l'ok , cioè se tutto funzica, ufficializziamo la consegna. Ciao e grazie.
Per la cronaca ho risolto il problema della ftoa alzando la precisione fino a 7 cifre dopo la virgola e poi ho troncato l'ultimo carattere...inoltre la conversione in stringa ha sempre 8 caratteri...questo è il codice:
CODICE void ftoa(float f, unsigned char *str)
{
char *cp;
unsigned long l;
cp=str;
if (f<0)
{
*cp++= '-'
f=-f;
}
l = (unsigned long)f; // PARTE INTERA
myltoa(l,cp);
f-=(float)l;// PARTE DECIMALE
l= (unsigned long) (f*1e7); // ALZO LA PRECISIONE FINO ALLA 7 CIFRA...
l+=2; // Arrotondo di 0.0000002
while(*cp)
cp++;
*cp='.'
*(cp+1)=Ɔ'
*(cp+2)=Ɔ'
*(cp+3)=Ɔ'
*(cp+4)=Ɔ'
*(cp+5)=Ɔ'
*(cp+6)=Ɔ'
*(cp+7)=Ɔ'
cp+=8;
myltoa(l,cp); // Calcolo solo la lunghezza...
myltoa(l,cp-strlen(cp)); // Barbatrucco ...sposto la stringa visto che so la sua lunghezza...lento ma risparmio spazio.
*(str+8)=0; // Metto la lunghezza fissa del float
}
Bolle
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | ecologix1971
| Inviato il: 31/7/2012,16:38
|
ciao bolle, faccio la prova e ti aggiorno
saluti eco
| | | | ecologix1971
| Inviato il: 31/7/2012,17:16
|
purtroppo ho un problema...
hai scritto:
Allego la versione 2.16q che devi inserire nel nuovo firmware....(la versione del compilatore 2.16p è compatibile) se mi dai l'ok , cioè se tutto funzica, ufficializziamo la consegna. Ciao e grazie.
hai allegato un nuovo firmware (2.16q), da inserire all'interno del pic, mentre come compilatore posso utilizzare quello 2.16p?
oppure ho interpretato male?
perche' io ho fatto questo, ma quando chiedo la versione del firmaware al compilatore mi risponde:
pptea 2.16r! check error! 2.16p! <> 2.16r!
dove ho sbagliato?
ciao ecologix 1971
| | | | NonSoloBolleDiAcqua
| Inviato il: 31/7/2012,17:51
|
Mi sono spiegato malissimo: evita di fare il check! Se ha risposto con la 2.16r hai caricato il firmware giusto....prova il tuo primo codice e dimmi se va tutto ok! Ciao Bolle
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | ecologix1971
| Inviato il: 31/7/2012,18:30
|
infatti ho caricarato il codice senza problemi. per quanto riguarda i float il problema e' risolto inserindo nei dati 13,7 oppure 11,7 i valori sul pptea non cambiano. ma per il problema con lo stack delle stringhe, purtroppo ancora non ci siamo. per non confonderci ho inserito il seguente codice, che e' leggermente diverso da quello iniziale....cambiano soltanto alcune funzioni dei tasti.
codice inserito con firmware 2.16q
100 ' 150 ' h2-o transfer 1_2 31-07-2012 200 ' by ecologix 1971 220 ' versione display 16 chrs 250 ' 300 ' bit0 =cads1 tensione batteria 350 ' bit1 =inp livello max serbatoio up 400 ' bit2 =inp livello min serbatoio down 450 ' bit3 =inp aumenta/visualizza potenza totale 500 ' bit4 =inp diminuisce/visualizza parametri 550 ' bit5 =inp conferma/reset potenza 600 ' bit15=out pompa h2-o 12 volts 650 ' 700 PRAGMA EXTERNAL_EEPROM 750 SETIO=63 800 'OUT=0 850 CADS=1 860 DIM valore(3) AS FLOAT 900 ' vok=0 vbat<von mentre vok=1 vbat>von 950 ' 1000 ' 1050 ' 1100 ' 1150 'presentazione 1200 ' 1250 LCDCLEAR 1300 LCDPOS=&h12 1350 LCDWRITE="H2-O TRANSFER" 1400 LCDPOS=&h21 1450 LCDWRITE="By ecologix 1971" 1500 WAITS 2 1510 LCDPOS=&h21 1550 LCDWRITE="V. 1.2 31.07.12" 1600 WAITS 3 1650 ' 1700 OUTBIT(15)=0 1720 GOSUB 8000 2050 ' 2100 ' 2150 ' 2200 ' 2250 ' 2300 :prestart 2350 ' 2400 IF vok=0 THEN 2500 2450 st+=ss 2500 WAITS 1 2550 vok=0 2600 LCDCLEAR 2650 ' 2700 :start 2750 ' 2800 LCDPOS=&h21 2850 WAITMS 250 2900 ' 2950 ' 3000 ' 3050 v=CADS1 3150 volt=v*0.01606 ' <---- fattore moltiplicatore 3200 ' 3250 ' 3300 LCDPOS=&h11 3350 strvolt=LEFT(volt,5) 3400 LCDWRITE="V= "&RIGHT(" "&strvolt,5)
3450 LCDPOS=&h21 3500 LCDWRITE=message 3550 OUTBIT(15)=vok 3600 ' 3650 ' 3700 ' 3750 IF INPBIT(1)=1 THEN :serbatoio_up_pieno 3800 IF INPBIT(2)=0 THEN :serbatoio_down_vuoto 3810 IF INPBIT(3)=1 THEN :visualizza_potenza 3850 IF INPBIT(4)=1 THEN :visualizza_parametri 3900 ' 3950 IF vok=1 THEN 4150 4000 IF volt>von THEN :tensione_raggiunta 4050 IF volt>voff THEN :tensione_intermedia 4100 IF vok=0 THEN :start 4150 ' 4200 IF volt<voff THEN :tensione_insufficiente 4250 ' 4300 ' 4350 ' counter 4400 ' 4450 'st+=ss 4500 ss=INT(TIMER) 'secondi trascorsi 4550 sr=(time*60)-ss 'secondi rimanenti 4600 LCDPOS=&H1a
4650 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2)&":"&RIGHT("0"&sr MOD 60,2)
4651 'bhj=0&sr/60 MOD 60 4652 'LCDWRITE=RIGHT(bhj,2) 4653 'LCDWRITE=: 4655 'bhj=0& sr MOD 60 4656 'LCDWRITE=RIGHT(bhj,2)
4700 stt=st+ss 4750 LCDPOS=&h25 4800 'a=(a+1) MOD 10 4850 'IF a=0 THEN 5000
4900 message=ON &stt/86400 MOD 9999&":"&RIGHT("0"&stt/3600 MOD 24,2)&":"&RIGHT("0"&stt/60 MOD 60,2)&":"&RIGHT("0"&stt MOD 60,2)&" "
4903 'message=ON &stt/86400 MOD 9999&":" 4905 'bhj=0&stt/3600 MOD 24 4910 'message =message & RIGHT(bhj,2)&":" 4914 'bhj=0&stt/60 MOD 60 4918 'message=message &RIGHT(bhj,2) 4922 'bhj=0&stt MOD 60 4926 'message=message &":"&RIGHT(bhj,2)&" "
4950 'GOTO 5150 5000 w=0.0083*stt 5050 strw=LEFT(w,5) 5100 'message=POWER = &strw&" W " 5150 IF sr>0 THEN :start 5200 PWMDC=0 5250 :tempo_esaurito 5300 ' 5350 message=" TIME END " 5400 GOTO :prestart 5450 ' 5500 :tensione_raggiunta 5550 ' 5600 vok=1 5650 message="ON " 5700 PWMDC=0 5750 GOTO :start 5800 ' 5850 GOTO :prestart 5900 ' 5950 :tensione_insufficiente 6000 ' 6050 message=" LOW BAT " 6100 ' 6150 GOTO :prestart 6200 ' 6250 :tensione_intermedia 6300 ' 6350 message=" "&LEFT(DATE,14) 6400 ' 6450 GOTO :start 6500 ' 6550 :serbatoio_up_pieno 6600 ' 6650 message="TANK UP FULL " 6700 ' 6750 GOTO :prestart 6800 ' 6850 :serbatoio_down_vuoto 6900 ' 6950 message="TANK DOWN EMPTY" 7000 ' 7050 GOTO :prestart 8000 ' 8060 :settaggio_parametri 8080 ' 8100 LCDCLEAR 8110 WAITS 1 8120 LCDPOS=&h14 8130 LCDWRITE="SET RANGE" 8140 WAITS 3 8160 LCDCLEAR 8180 DATA "Von",13.7,0.1,14.2,12.5 8200 DATA "Voff",11.8,0.1,12.1,11.6 8220 DATA "time",15,1,60,1 8240 READ scritta,a,k,amax,amin 8260 ' 8280 :start1 8300 ' 8320 stra=RIGHT("0"&a,2)&":00" 8340 IF j=2 THEN 8380 8360 stra=LEFT(" "&a,5) 8380 LCDPOS=&h13 8400 LCDWRITE=""&scritta&"= "&stra 8420 ' 8440 IF INPBIT(3)=1 THEN :aumenta 8460 IF INPBIT(4)=1 THEN iminuisce 8480 IF INPBIT(5)=1 THEN :conferma 8500 GOTO :start1 8520 ' 8540 :aumenta 8560 ' 8580 IF a>=amax THEN :start1 8600 a=a+k 8620 GOTO :start1 8640 ' 8660 iminuisce 8680 ' 8700 IF a<=amin THEN :start1 8720 a=a-k 8740 GOTO :start1 8760 ' 8780 :conferma 8800 ' 8820 LCDCLEAR 8840 j++ 8860 valore(j)=a 8880 IF j=3 THEN 9250 8900 READ scritta,a,k,amax,amin 8920 GOTO :start1 8925 ' 8927 :visualizza_parametri 8930 : 8940 LCDCLEAR 8950 ' 8960 strvon=LEFT(" "&valore(1),5) 8980 strvoff=LEFT(" "&valore(2),5) 9000 strtime=INT(valore(3))&":00" 9020 LCDPOS=&h11 9040 LCDWRITE="ON"&strvon 9060 LCDPOS=&h19 9080 LCDWRITE="OFF"&strvoff 9100 LCDPOS=&h23 9120 LCDWRITE="TIME = "&strtime 9130 FOR w=1 TO 100 9140 IF INPBIT(5)=1 THEN 1700 9190 NEXT w 9200 ' 9205 LCDCLEAR 9210 GOTO :start 9250 ' 9300 j=0 9310 RESTORE 9320 ' 9350 von=valore(1) 9400 voff=valore(2) 9450 time=valore(3) 9455 LCDCLEAR 9460 LCDPOS=&h13 9470 LCDWRITE="Successfully!" 9480 WAITS 3 9500 RETURN 10000 ' 10050 :visualizza_potenza 10100 ' 10200 LCDCLEAR 10250 LCDPOS=&h13 10300 LCDWRITE="TOTAL POWER" 10350 LCDPOS=&h21 10400 LCDWRITE="W = "&strw 10500 FOR w=1 TO 100 10550 IF INPBIT(5)=1 THEN :reset_power 10600 NEXT w 10610 ' 10650 GOTO 2600 11000 ' 11050 :reset_power 11100 ' 11200 PWMDC=0 11250 stt=0 11260 strw="0" 11300 st=0 11350 WAITS 1 11400 GOTO 2600
ps: le modifiche che mi avevi postato inizialmente le ho lasciate apostrofate
ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 31/7/2012,20:20
|
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | NonSoloBolleDiAcqua
| Inviato il: 31/7/2012,21:03
|
Ho fatto girare parte del tuo codice sul PPTEA ...e funzica! Me lo puoi provare tu? Quando ho tempo metto in piedi il tuo circuito e testo tutto il tuo ultimo codice...voglio capire quale è l'anomalia! Ciao Bolle
CODICE 100 ' 150 ' h2-o transfer 0_4 25-07-2012 160 ' by ecologix 1971 200 ' 250 ' bit0 =cads1 tensione batteria 300 ' bit1 =inp livello max serbatoio up 350 ' bit2 =inp livello min serbatoio down 360 ' bit3 =out led serbatoio up pieno 370 ' bit4 =out led serbatoio down vuoto 380 ' bit5 =out led low battery 400 ' bit15=out pompa h2-o 12 volts 450 ' 500 PRAGMA EXTERNAL_EEPROM 550 SETIO=7 600 OUT=0 650 CADS=1 700 ' vok=0 vbat<vmax mentre vok=1 vbat>vmax 750 ' 800 ' 850 'goto 1450 900 ' 950 'presentazione 1000 ' 1050 LCDCLEAR 1100 LCDPOS=&h12 1150 LCDWRITE="H2-O transfer" 1200 LCDPOS=&h21 1250 LCDWRITE="By ecologix 1971" 1300 LCDPOS=&h35 1350 LCDWRITE="vers. 0.4 25.07.12" 1400 WAITS 3 1450 ' 1500 ' 1550 ' costanti 1600 ' 1650 CONSTANT vmax=13.7 ' soglia tensione massima 1700 CONSTANT vmin=11.8 ' soglia tensione minima 1760 CONSTANT m=15 ' minuti attivazione pompa
2250 LCDCLEAR
2255 'PRINT "0"
2260 ' 2300 :start 2310 ' 2350 LCDPOS=&h21 2400 'WAITMS 250 2450 ' 2550 '
2600 v=CADS1 2650 volt=v*0.01623266131 ' <---- fattore moltiplicatore 2700 ' 2950 LCDPOS=&h11 3000 strvolt=LEFT(volt,5) 3050 LCDWRITE="v= "&RIGHT(" "&strvolt,5)
3100 LCDPOS=&h21 3150 LCDWRITE=message 3200 'PRINT message 3565 ss=INT(TIMER) 'secondi trascorsi 3570 sr=(m*60)-ss 'secondi rimanenti
3575 LCDPOS=&H1a 3580 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2)&":"&RIGHT("0"&sr MOD 60,2) 3585 'PRINT "2"
3592 stt=st+ss 3594 LCDPOS=&h25 3596 a=(a+1) MOD 10
3597 'PRINT "2a" 3598 message="ON "&stt/86400 MOD 9999&":"& RIGHT("0"&stt/3600 MOD 24,2)&":"& RIGHT("0"&stt/60 MOD 60,2)&":"& RIGHT("0"&stt MOD 60,2)&" "
5594 WAITMS 250 5600 GOTO 2300
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | ecologix1971
| Inviato il: 31/7/2012,21:39
|
ho appena provato il codice che hai postato.... .....cosi' funzica pure a me ....entrambi i contatori funzionano senza imperfezioni..... ....mistero ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 31/7/2012,21:41
|
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| | | | ecologix1971
| Inviato il: 31/7/2012,21:53
|
se puo' essere d'aiuto ho appena provato la prima versione del codice, un po' piu 'completa di quella che hai riportato e funziona perfettamente. il problema e' nato con l'ultima versione , praticamente dove ci sono i settaggi dei parametri..... .....che dici li togliamo questo e' il codice (prima versione) senza settaggi in cui i contatori sono perfetti.
100 ' 150 ' h2-o transfer 0_5 26-07-2012 160 ' by ecologix 1971 200 ' 250 ' bit0 =cads1 tensione batteria 300 ' bit1 =inp livello max serbatoio up 350 ' bit2 =inp livello min serbatoio down 360 ' bit3 =out led serbatoio up pieno 370 ' bit4 =out led serbatoio down vuoto 380 ' bit5 =out led low battery 400 ' bit15=out pompa h2-o 12 volts 450 ' 500 PRAGMA EXTERNAL_EEPROM 550 SETIO=7 600 OUT=0 650 CADS=1 700 ' vok=0 vbat<vmax mentre vok=1 vbat>vmax 750 ' 800 ' 850 'goto 1450 900 ' 950 'presentazione 1000 ' 1050 LCDCLEAR 1100 LCDPOS=&h12 1150 LCDWRITE="H2-O transfer" 1200 LCDPOS=&h21 1250 LCDWRITE="By ecologix 1971" 1300 LCDPOS=&h35 1350 LCDWRITE="vers. 0.5 26.07.12" 1400 WAITS 3 1450 ' 1500 ' 1550 ' costanti 1600 ' 1650 CONSTANT vmax=13.7 ' soglia tensione massima 1700 CONSTANT vmin=11.8 ' soglia tensione minima 1760 CONSTANT m=15 ' minuti attivazione pompa 1800 ' 1850 ' 1900 ' 1950 ' 2000 ' 2050 ' 2100 :prestart 2110 ' 2115 IF vok=0 THEN 2150 2120 st+=ss 2150 WAITS 1 2200 vok=0 2250 LCDCLEAR 2260 ' 2300 :start 2310 ' 2350 LCDPOS=&h21 2400 WAITMS 250 2450 ' 2500 ' 2550 ' 2600 v=CADS1 2650 volt=v*0.01623266131 ' <---- fattore moltiplicatore 2700 ' 2850 ' 2900 ' 2950 LCDPOS=&h11 3000 strvolt=LEFT(volt,5) 3050 LCDWRITE="v= "&RIGHT(" "&strvolt,5) 3100 LCDPOS=&h21 3150 LCDWRITE=message 3200 OUTBIT(15)=vok 3210 OUTBIT(3)=state1 3220 OUTBIT(4)=state2 3230 OUTBIT(5)=state3 3250 IF INPBIT(1)=1 THEN :serbatoio_up_pieno 3270 IF INPBIT(2)=0 THEN :serbatoio_down_vuoto 3275 state1=0 3280 state2=0 3300 IF vok=1 THEN 3500 3350 IF volt>vmax THEN :tensione_raggiunta 3400 IF volt>vmin THEN :tensione_intermedia 3450 IF vok=0 THEN :start 3500 ' 3550 IF volt<vmin THEN :tensione_insufficiente 3552 state3=0 3555 ' 3556 ' counter 3557 ' 3560 'st+=ss 3565 ss=INT(TIMER) 'secondi trascorsi 3570 sr=(m*60)-ss 'secondi rimanenti 3575 LCDPOS=&H1a 3580 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2)&":"&RIGHT("0"&sr MOD 60,2) 3582 stt=st+ss
3584 LCDPOS=&h25 3586 a=(a+1) MOD 10 3588 IF a=0 THEN 3595 3592 message=ON &stt/86400 MOD 9999&":"&RIGHT("0"&stt/3600 MOD 24,2)&":"&RIGHT("0"&stt/60 MOD 60,2)&":"&RIGHT("0"&stt MOD 60,2)&" " 3594 GOTO 3650 3595 w=0.0083*stt 3600 strw=LEFT(w,5) 3610 message=POWER = &strw&" " 3650 IF sr>0 THEN :start 3700 PWMDC=0 3800 :tempo_esaurito 3810 ' 3820 message=" TIME END " 3850 GOTO :prestart 3900 ' 3950 :tensione_raggiunta 4000 ' 4050 vok=1 4100 message="ON " 4150 PWMDC=0 4200 GOTO :start 4250 ' 4450 GOTO :prestart 4500 ' 4550 :tensione_insufficiente 4600 ' 4650 message=" LOW BAT " 4660 state3=1 4700 GOTO :prestart 4750 ' 4800 :tensione_intermedia 4850 ' 4900 message=" "&LEFT(DATE,14) 4905 ' 4950 GOTO :start 5000 ' 5050 :serbatoio_up_pieno 5100 ' 5200 message="TANK UP FULL " 5210 state2=1 5250 GOTO :prestart 6000 ' 6050 :serbatoio_down_vuoto 6100 ' 6150 message="TANK DOWN EMPTY" 6160 state1=1 6200 GOTO :prestart
ciao eco
| | | | ecologix1971
| Inviato il: 31/7/2012,23:11
|
facendo il debugg con entrambi i codici e visualizzando nella finestra watch, i valori delle variabili ss (secondi trascorsi) ed sr (secondi rimanenti), ho notato che mentre nella prima versione del codice (senza settaggi dei parametri), le due variabili vengono identificate come intere, nel secondo codice (quello con i settaggi), la variabile ss e' un intero, mentre la variabile sr e' un float
4500 ss=INT(TIMER)
4550 sr=(time*60)-ss
e quindi la visualizzazione sul display, data dalla linea:
4650 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2)&":"&RIGHT("0"&sr MOD 60,2)
rappresentava le ultime cifre decimali, alterando cosi' la visualizzazione del contatore.
ho risolto inserendo la funzione int anche alla linea 4550 facendo divenire cosi intera anche la variabile sr.
4550 sr=INT((time*60)-ss)
.....non ho capito pero' perche' c'e' questa differenza tra un codice e l'altro.....
ciao a tutti ecologix1971
| | | | NonSoloBolleDiAcqua
| Inviato il: 1/8/2012,06:42
|
Meno male mi hai dato un'ottima notizia... Dirò delle cose che probabilmente già sai...ma vale la pena soffermarci due minuti...per gli altri utenti. La tipologia dei dati dipende dai dati stessi ...cioè il PPTEA alza o abbassa in modo automatico la 'precisione' ma tutto dipende dalla tipologia dei dati. Nel discorso in questione la tipologia di sr ( cioè se intero o a virgola mobile) visto che ss è un intero, dipende esclusivamente dalla variabile time: sr=(time*60)-ss.
Se time è un float (cioè un valore in virgola mobile) il pptea imposta sr come un valore in virgola mobile. Il metodo che il PPTEA adotta è semplice e può essere sintetizzato in: se c'è una sola variabile o costante in virgola mobile il risultato e la tipologia del risultato viene espresso in virgola mobile. Facciamo un esempio dove time=4 e ss= 5:
sr= (time*60)-ss sr->Intero con valore sr=235
se time =4.0 e ss=5
sr= (time*60)-ss sr->Float con valore sr=235.000000
Tutto questo per dire che se time è un float allora effettuando un cast (cioè facendo diventare tutto un intero nell'istruzione 4550) sr diventa per forza un intero. Però possiamo anche verificare questo trasformando in intero l'unica variabile che potrebbe essere float,cioè solo esclusivamente la variabile time:
4550 sr=(INT(time)*60)-ss
Ora non ho verificato il tuo codice ma se mi confermi questo possiamo dire che il problema è risolto...e possiamo formalizzare la consegna...se invece rimane qualche problema si deve risolvere ...ma spero che sia tutto ok! Ciao Bolle PS:Quando mi fai venire a casa tua per vedere il tutto? Sono molllllto interessato a quello che hai fatto.
Modificato da NonSoloBolleDiAcqua - 1/8/2012, 08:00
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|