| ecologix1971
| Inviato il: 27/7/2012,11:17
|
ciao a tutti.
mentre effetuavo una modifica ad un codice elaborato qualche giorno fa, con una versione un po' obsoleta del compilatore e firmware, la 2.16c, ho avuto necessita', in quanto avevo bisogno di vettori tipo float, di aggiornare il tutto (firmware e compilatore) all'ultima versione ossia la 2.16p.
premetto che il vecchio codice meno sofisticato, girava tranquillamente con la 2.16c, sia con un display a 16 che a 20 caratteri.
sviluppato il nuovo codice, l'ho provato con il debugg del compilatore ed e' perfattamente funzionante, mentre facendolo girare sul pic, ho riscontrato qualche problema riguardo il display.
per esattezza, ci sono dei caratteri che non corrispondono, mentre ad esempio un contatore che fa parte del codice non parte subito ma dopo qualche minuto. un altro contatore da' i numeri a lotto.
ho controllato la versione del firmware e risulta 2.16p.
vi allego il codice in questione che e' basato su quello postato nel thread "h2-o transfer", con la possibilita' pero' di poter modificare i vari parametri direttamente dal pic
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 4650 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2)&":"&RIGHT("0"&sr MOD 60,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)&" " 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.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 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
ad esempio in questo caso, il contatore in alto a dx visualizza 66:00, quando io ho invece settato 01:00 e poi non funziona, il contatore in basso parte invece con qualche minuto di ritardo
qui ad esempio segna zero. ma in realta' sono impostati 15 minuti. il contatore in realta' funziona anche perche' scaduto il tempo il carico viene disinserito.
avete qualche idea da che cosa puo' dipendere...
grazie a tutti ecologix1971
| | | | NonSoloBolleDiAcqua
| Inviato il: 27/7/2012,12:18
|
Ciao eco, faccio un controllo veloce...se compili lo stesso codice dovrebbe fungere in modo identico in entrambe le versioni del firmware. Una cosa che mi viene in mente è quelle di tenere sotto controllo le stringhe...cioè quando si effettuano operazioni di concatenazione (esempio la riga 4900) si potrebbe sfondare lo stack del PPTEA...e a quel punto si potrebbero verificare problemi. Hai fato bene a segnalare il problema...gli do un'occhiata e cerco di capire...sempre se non si tratti di un problema a livello sw.
Fai questa prova al volo se puoi...spezza in 2 le istruzioni 4650 e 4900 cioè :
4650 LCDWRITE=RIGHT("0"&sr/60 MOD 60,2) 4655 LCDWRITE=":" & RIGHT("0"&sr MOD 60,2)
4900 message="ON "&stt/86400 MOD 9999&":"&RIGHT("0"&stt/3600 MOD 24,2)&":" 4905 message=message &RIGHT("0"&stt/60 MOD 60,2)&":"&RIGHT("0"&stt MOD 60,2)&" "
e vedi se il problema rimane. 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: 27/7/2012,12:55
|
intendi che se compilo il codice con il firmware 2.15 (stesso della 2.16c), dovrebbe andar bene? io sono arrivato alla conclusione di aggiornarlo in quando il comando dim con la 2.16c non mi accettava la variante float che ho utilizzato nel codice
quello che ho notato e' che sembra che nei primi minuti di funzionamento, dopo il settaggio dei parametri che si puo' effetuare all'inizio, non funzioni correttamente, tant'e' che anche altre opzioni del codice non vengono accettate
ciao eco
| | | | ecologix1971
| Inviato il: 27/7/2012,13:33
|
ti aggiorno.
ho fatto le modifiche che mi hai consigliato. il contatore sotto ora funziona da subito non piu' dopo un paio di minuti, quindi e' ok, mentre per quanto riguarda quello in alto a dx, continua a fare a modo suo: i secondi sono sempre a 00, mentre i minuti si alternano tra 00 - 33 - 66 - 99.
ciao eco
| | | | | | | ecologix1971
| Inviato il: 27/7/2012,14:24
|
collegato alla usb non lo posso provare , perche' l'alimentazione al pic deriva dalla fonte che viene misurata.
comunque ho aggiunto/sostituito le 4 linee che mi hai detto , ma non e' cambiato nulla.
ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 27/7/2012,14:31
|
Mi sono espresso male devi modificare tutte queste linee dal codice che hai postato: 4650 bhj=sr/60 mod 60 4652 LCDWRITE=RIGHT("0"&bhj,2) 4653 bhj=sr mod 60 4655 LCDWRITE=":" 4656 LCDWRITE=RIGHT("0"&bhj,2)
4900 message="ON "&stt/86400 MOD 9999&":"&RIGHT("0"&stt/3600 MOD 24,2)&":" 4905 message=message &RIGHT("0"&stt/60 MOD 60,2)&":"&RIGHT("0"&stt MOD 60,2)&" "
CITAZIONE (ecologix1971 @ 27/7/2012, 15:24) collegato alla usb non lo posso provare , perche' l'alimentazione al pic deriva dalla fonte che viene misurata. C'è la possibilità di agganciare la usb del PC anche con alimentazione esterna...agganci solo 3 cavi su 4 della usb ( il positivo della usb non lo colleghi...guarda la configurazione PPTEA MINI HYBRID sul manuale).
Cmq se non visualizza bene quel valore (il problema è solo in visualizzazione giusto?)... è solo questione di tempo...il problema lo troviamo...ma occorre perderci tempo...da domenica in poi lo studio bene. 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: 27/7/2012,14:35
|
grazie per il giogliellino, l'ho buttato giu' stanotte.... ....comunque mi ritengo sempre alle prime armi, tant'e' vero che la scrittura su eeprom non ho minimamente idea di come funziona.
la versione senza settaggi andava alla grande (2.16c), il problema mi e' sorto nell'utilizzare i vettori decimali per il settaggio. questa e' l'idea che mi e' balenata. ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 27/7/2012,14:40
|
Si si ...alle prime armi! Cmq fai un uso molto spinto delle stringhe...li il povero pptea lavora con lo stack e utilizzando anche i vettori float ...potrebbe sfondare lo stack...ma ora non sono in grado di capirlo...se puoi aiutarmi a capire il problema dovresti caricare il tuo vecchio codice in eabasic scritto per la versione 2.16c e lo dovresti compilare e far girare nell'ultima 2.16p e verificare se si comporta allo stesso modo...cioè deve andare come la 2.16c. Puoi farmi questa prova? Ciao Bolle PS:Ci vediamo domani sera...avremo modo di parlarne meglio.
--------------- 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: 27/7/2012,14:48
|
faccio subito la prova e ti riferisco
| | | | ecologix1971
| Inviato il: 27/7/2012,16:10
|
mi dispiace se ci ho messo troppo tempo,
ma non riuscivo piu' a far rilevare il pptea al pc, poi ho avuto problemi nel trasferire i codici, nel senso che durante il trasferimento mi segnalava tra i vari OK,OK,OK, anche dei MSG ERR e quando andavo ad avviare il programma non partiva.
alla fine a forza di provare ci sono riuscito ed il risultato e' questo:
con la prima versione che avevo fatto per la 2.16, presa di sana pianta, funziona correttamente il contatore in alto, mentre quello in basso e' bloccato.
se invece sostituisco le linee riguardanti il contatore in basso con quelle che mi hai postato, funzionano entrambi.
a domani ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 27/7/2012,18:43
|
Se ti va, se hai tempo e se puoi...potresti farmi questa ulteriore prova con il tuo ultimo codice:
4650 bhj="0"&sr/60 mod 60 4652 LCDWRITE=RIGHT(bhj,2) 4653 LCDWRITE=":" 4655 bhj="0"& sr mod 60 4656 LCDWRITE=RIGHT(bhj,2)
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)&" "
In questo modo lo stack viene alleggerito molto. 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: 28/7/2012,17:10
|
ciao bolle,
ho appena inserito le linee di codice che hai postato, ma purtroppo il risultato e' sempre lo stesso.
il contatore inferiore funziona perfettamente, mentre quello in alto ha i secondi bloccati a 00 e i minuti passano da 00,33,66,99.....
poi c'e' un altro particolare...telo dico poi a voce.
ps: comunque non e' un problema e' soltanto la visualizzazione del contatore che non va', il contatore di per se e' ok, dopo il tempo trascorso il carico si stacca.
....certo cosi' e' brutto....tutt' al piu' lo elemino
ciao eco
| | | | NonSoloBolleDiAcqua
| Inviato il: 30/7/2012,07:12
|
Nell'incontro del GEB avvenuto il 28 luglio ecologix mi ha parlato di una cosa strana...una anomalia che avviene nel pptea...nella linea 8360 del codice da lui scritto effettua una visualizzazione del valore 13.7...ma il pptea sul display visualizza 13.6. Dopo una verifica ho constatato che il problema si verifica e l'ho riprodotto in modo circoscritto:
CODICE 05 ' TEST 13.7 Ecologic 28.07.2012 PROG_1 10 A=13.7 25 PRINT "A=" & A 35 GOTO 35
PPTEA: A=13.699999 DEBUG: A=13.700000
Questa per me è stata una sorpresa ....non è un vero problema ma ... cmq sono rimasto sorpreso...e ho iniziato ad indagare quindi Ecologix nel suo codice, andando a prendere 4 caratteri visualizza 13.6 invece che 13.7...quindi tutto chiaro ma occorre capire la problematica dov'è!
Va detto che da un punto di vista matematico non c'è molta differenza...ma se gestiamo il valore come stringa ( il PPTEA effettua una conversione da valore in virgola mobile (float) a stringa(ascii))...li sorge il problema.
Vediamo i test che ho fatto mediante lo stesso PPTEA:
CODICE 05 '<b> TEST 1</b> Ecologic 28.07.2012 10 A=13.7 20 B= 7/10.0 '---> 0.7 ...lo faccio fare matematicamente 22 C=A-B 25 PRINT "A=" & A & " B="& B & " C=" & C 35 GOTO 35
PPTEA : A=13.699999 B=0.700000 C=13.000000 DEBUG : A=13.700000 B=0.700000 C=13.000000
CODICE 05 ' <b>TEST 2</b> Ecologic 28.07.2012 10 A=13.0 20 B=0.7 ' 7/10.0 '---> 0.7 21 A=A+B 22 C=A-B 25 PRINT "A=" & A & " B="& B & " C=" & C 35 GOTO 35
PPTEA: A=13.699999 B=0.700000 C=13.000000 DEBUG : A=13.700000 B=0.700000 C=13.000000
Quindi matematicamente il PPTEA fa il suo lavoro ...ma quando deve convertire il valore da float a stringa...non è dei più precisi. Ho iniziato ad andare a fondo e ho scoperto un'altra sorpresa...hehehe!
Ho scritto i valori da 13.0 a 13.9...e c'è un altro valore che è impreciso ed è il 13.2, cioè abbiamo:
13.1 -> 13.1 13.2 -> 13.19999 13.3 -> 13.3 13.4 -> 13.4 13.5 -> 13.5 13.6 -> 13.6 13.7 -> 13.69999 13.8 -> 13.8 13.9 -> 13.9
La funzione incriminata è la ftoa...ovviamente non ho utilizzato la funzione di sistema per problema di spazio...l'ho rifatta molto molto più corta ed evidentemente pecca di precisione.L'ho scritta in C ...posto il codice...devo ancora analizzare dove è l'inghippo...se qualcuno vuole aiutarmi ...è il benvenuto. la myltoa è la ltoa ( long to ascii).
CODICE void ftoa(float f, unsigned char *str) { char *cp; unsigned long l, rem; cp=str; if (f<0) { *cp++= '-'; f=-f; } l = (unsigned long)f; f-=(float)l; rem= (unsigned long) (f*1e6); myltoa(l,cp); while(*cp) cp++;
*cp='.';
// *(cp+1)='0'; *(cp+2)='0'; *(cp+3)='0'; *(cp+4)='0'; *(cp+5)='0'; *(cp+6)='0'; cp+=7; myltoa(rem,cp);
l=strlen(cp); myltoa(rem,cp-l);
}
Un saluto Bolle
Modificato da NonSoloBolleDiAcqua - 30/7/2012, 08:32
--------------- 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: 30/7/2012,13:46
|
Ho trovato la soluzione che agira questo ultimo problema:
CODICE 8180 DATA "Von",13.7001,0.1,14.2,12.5
dovrebbe fungere. Quanto prima vedo l'altro problema. Ciao Bolle
--------------- Chi sa raccontare bene le bugie ha la verità in pugno (by PinoTux). Un risultato se non è ripetibile non esiste (by qqcreafis).
| |
| | |
|
Versione Mobile!
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|