Menu:

PPTEA e PC


Tutorial su come il PPTEA comunica con il PC

Questa è la discussione originale.
Questa è la Versione 1.4 dell'eseguibile GraficoTemperature.
Questa è la Versione 1.6 dell'eseguibile GraficoTemperature.
Questo è il file .zip che contiene i due sorgenti in EABasic.

Questo argomento è stato affrontato più di qualche volta in alcuni progettini realizzati con il PPTEA: Temperatura su PC, Voltmetro per PC, Oscilloscopio, etc...
Il PPTEA può sfruttare la porta USB e colloquiare con il PC, a questo punto basta realizzare un SW che si interfacci con la porta USB (vista come seriale) e il gioco è fatto.

Ma come fare per scambiare i dati?
Il PPTEA ha 3 istruzioni (USBOUT, USBOUTB, USBINP) per comunicare con il PC, invia i dati e li riceve.
In questo caso vedremo solo l'invio dei dati, cioè il PPTEA utilizza i suoi convertitori Analogico Digitali e li invia al PC, ma in che modo?
C'è una lunga teoria per la trasmissione dei segnali, che salterò a piè pari, farò un esempio pratico cercando di descriverlo.
Ognuno può utilizzare un qualsiasi modo, ma per essere sicuri di inviare dati ed essere capiti occorre definire un protocollo.
è una parolona, ma di fatto è un metodo, condiviso, per scambiare informazioni.
Noi utilizziamo un metodo senza feedback, cioè inviamo dei dati, e se vengono capiti bene, altrimenti non fa nulla.
I dati sono 'BYTE oriented', cioè le informazioni che scambiamo sono dei byte (0-256) e le parole che scambiamo sono valori a 8 bit (8 bit=1 BYTE).
Quando scambiamo delle informazioni dobbiamo sapere quante informazioni dobbiamo inviare e dobbiamo far capire quando iniziano e quando finiscono.

Come fare?
Quando iniziamo inviamo un valore di start (ex :33); quando abbiamo finito i dati inviamo un dato di stop (ex:66).
Quindi se dobbiamo inviare i 4 dati 5,35,56,99 ne invieremo qualcuno in più per far capire a chi li riceve come interpretarli.
Quindi invieremo i dati: |33| 5|35|56|99|66| Quindi per inviare i 4 dati ne abbiamo messo uno in testa (33 start) ed uno alla fine (66 stop).

Chi riceve (il SW presente sul PC) vede arrivare i dati con lo start e stop e può calcolarsi il numero dei dati trasferiti ed anche loro valore, ma deve fare dei calcoli.
Per semplificare l'operazione di chi riceve i dati, chi l'invia può inserire (nella testata, cioè nella parte iniziale) anche quanti dati deve inviare.
Cioè: |33| 4| 5| 35|56|99|66|
A questo punto i dati inviati sono 4+3 (start, nbyte, stop).
Può capitare che i dati arrivino in modo errato a causa di disturbi di rete o altro e per essere sicuri che chi li riceve sappia se li ha ricevuti in modo corretto cosa fa?
Si utilizza un byte di controllo, questo viene chiamato checksum (CKS), cioè un controllo di somma; tutti i dati vengono sommati e questo dato viene accodato ai dati inviati.

Facciamo un esempio:
|33|4|5|35|56|99|CSK|66|
CSK è la somma di 5+35+56+99=195, quindi i messaggio completo sarà:
|33|4|5|35|56|99|195|66|
In questo modo abbiamo definito un protocollo e il messaggio che viene scambiato viene chiamato PACCHETTO che viene definito in questo modo:
|START|NUN_DATI|DATO1|DATO2|...| CHECKSUM|STOP|

Chi riceve il pacchetto, quando vede arrivare il 33 (START) sa che sta iniziando il pacchetto, subito dopo vede arrivare la lunghezza dei dati, letti i dati (5,35,56,99) si vede arrivare la checksum (195) e subito dopo DEVE arrivare lo stop (66).
Se Start e Stop sono corretti si passa a fare i conti della checksum, se è giusta il pacchetto è esatto (o ci sono alte probabilità che sia giusto).
Vediamo l'esempio del sensore di temperatura del PPTEA anche se che utilizza un protocollo leggermente diverso, infatti invia la checksum dopo lo stop:

91 PSTART=22
92 PSTOP=33
93 TEMP=CADS2
94 USBOUT=PSTART
95 USBOUT=TEMP 'Invio la temperatura
96 USBOUT= PSTOP
97 USBOUT= PSTART+PSTOP+TEMP ' CHECKSUM
110 WAITS 1 ' Attendo un secondo tra una lettura
120 goto 93
92 PSTOP=33
93 TEMP=CADS2
94 USBOUT=PSTART
95 USBOUT=TEMP 'Invio la temperatura
96 USBOUT= PSTOP
97 USBOUT= PSTART+PSTOP+TEMP ' CHECKSUM
110 WAITS 1 ' Attendo un secondo tra una lettura
120 goto 93

Viene utilizzato 22 come start, 33 come stop e i dati inviati sono:
|START|TEMP|STOP|CHECKSUM|

La velocità di trasmissione è un parametro fondamentale, queste sono le caratteristiche con cui inviare/ricevere i dati se si utilizza il PPTEA:
19200, 8 bit, NOPARITY, 1 BIT DI STOP

Vediamo come questo programma eseguibile permetta la visualizzazione di cinque temperature.
Il codice da caricare è questo:

90 '------CODICE EABASIC GRAFICO-------
95 CADS=5
100 PSTART=22
120 PSTOP=33
130 T1=CADS1
133 T2=CADS2
136 T3=CADS3
137 T4=CADS4
138 T5=CADS5
140 USBOUT=PSTART
150 USBOUT=T1 'Invio il valore del convertitore 1
152 USBOUT=T2 'Invio il valore del convertitore 2
155 USBOUT=T3 'Invio il valore del convertitore 3
156 USBOUT=T4 'Invio il valore del convertitore 4
157 USBOUT=T5 'Invio il valore del convertitore 5
160 USBOUT= PSTOP
170 USBOUT= PSTART+PSTOP+T1+T2+T3+T4+T5 ' CHECKSUM
180 WAITS 1 ' Attendo un secondo tra una lettura
190 goto 130
200 '-----------------------------------

In questa versione c'è il flag del log per salvare i dati che arrivano.
Vengono salvati in continuazione sul file "Dati-gg-mm-aaaa.txt" ( gg= giorno, mm=mese, aaaa= anno) consultabile anche con i dati in arrivo.
I campi sono separati dal separatore | e sono importabili su excell.

I campi sono sette:
1. Secondi arrivo dati (i secondi partono dall'avvio del programma)
2.3.4.5.6. Temperature da T1 a T5.
7. Orario arrivo dati


La Temp1 è un sensore che misura i gradi kelvin, la Temp5 è un valore fisso creato con un trimmer.

Questa è la Versione 1.4 dell'eseguibile GraficoTemperature.



La Temp1 è un sensore LM335H che misura in gradi Kelvin ed il PPTEA converte in gradi Centigradi.

Questa è la Versione 1.6 dell'eseguibile GraficoTemperature.

Seguono due listati in EABasic con esempi di misura di temperatura e tensione visualizzati pure su display LCD 16x4, uno modificato da chi scrive ed un altro che fa le stesse cose ma strutturato come solo Bolle può fare...e forse da qualche altro che non conosco...
Entrambi sono scaricabili da QUI.

CODICE:
10 PRAGMA EXTERNAL_EEPROM
15 ' SETIO=&H100FF ' il 16 BIT (partendo da 0 ) identifica la modalità libera del display
20 cads=5
25 ' ----------------------------
30 lcdclear
35 lcdwrite="PPTEA - LCD 4x16"
40 lcdpos=33
45 lcdwrite="Monitor Temp."
50 lcdpos=55
55 lcdwrite="e Tensione"
60 waits 3
65 ' ----------------------------
66 CLR a,t,T1,T2,T3,T4,T5
70 PSTART=22
75 PSTOP=33
80 ' ----------------------------
85 lcdclear
90 ' ----------------------------
95 t=cads1
100 T1=t
105 gosub :TornaTemperatura
110 ' lcdclear
115 lcdpos=22
120 lcdwrite=" "&chr(223)
125 lcdpos=17
130 lcdwrite="A="&strtemp
135 ' ----------------------------
140 t=cads2
145 T2=t
150 gosub :TornaTemperatura
155 lcdpos=38
160 lcdwrite=" "&chr(223)
165 lcdpos=33
170 lcdwrite="B=" &strtemp
175 ' ----------------------------
180 t=cads3
185 T3=t
190 gosub :TornaTemperatura
195 lcdpos=54
200 lcdwrite=" "&chr(223)
205 lcdpos=49
210 lcdwrite="C="&strtemp
215 ' ----------------------------
220 t=cads4
225 T4=t
230 gosub :TornaTensione
235 lcdpos=31
240 lcdwrite=" V"
245 lcdpos=25
250 lcdwrite="V1="&strtens
255 ' ----------------------------
260 t=cads5
265 T5=t
270 gosub :TornaTensione
275 lcdpos=47
280 lcdwrite=" V"
285 lcdpos=41
290 lcdwrite="V2="&strtens
295 ' ----------------------------
300 USBOUT=PSTART
305 USBOUT=T1 'Invio il valore del convertitore 1
310 USBOUT=T2 'Invio il valore del convertitore 2
314 USBOUT=T3 'Invio il valore del convertitore 3
317 USBOUT=T4 'Invio il valore del convertitore 4
319 USBOUT=T5 'Invio il valore del convertitore 5
321 USBOUT= PSTOP
325 USBOUT= PSTART+PSTOP+T1+T2+T3+T4+T5 ' CHECKSUM
330 WAITS 1 ' Attendo un secondo tra una lettura
335 ' ----------------------------
336 a++ ' stampa i passi di misura, serve per controllare che non si blocchi
337 lcdpos=65
338 lcdwrite=""&a
340 lcdpos=80 ' stampa alternativamente un "+" ed un "-" ...come sopra
345 lcdwrite="+"
350 waitms 500
355 lcdpos=80
360 lcdwrite="-"
365 waitms 200
370 ' -----------------------------
375 goto 95
380 ' -----------------------------
385 :TornaTemperatura
390 temp=t*5.0/1023
395 temp*=100
400 strtemp=left(temp&"",4)
405 return
410 ' ------------------------------
415 :TornaTensione
420 tens=t*15.0/1023
425 ' tens*=100
430 strtens=left(tens&"",4)
435 return


Questa è la versione di NonSoloBolleDiAcqua:

CODICE:
01 ' PROGRAMMA INVIO DATI AL DISPLAY E AL PC VERSIONE 2.5 o SUCCESSIVE
05 DIM VTEMP(5) AS WORD
07 PRAGMA EXTERNAL_EEPROM
10 '-------------------- DATI -------
11 DATA 17,"PPTEA - LCD 16x4", 33,"Monitor Temp.",55,"e Tensione"
13 DATA 22," ß",17,"A=",38," ß",33,"B=",54," ß",49,"C=",31," V",25,"V1="
14 DATA 47," V",41,"V2="
15 '-------------------- FINE DATI -------
19 ' SETIO=&H100FF ' Per Display Gestito dell'utente
20 '--------------- COSTANTI ------
21 CONSTANT PSTART=22
22 CONSTANT PSTOP=33
23 '-----------FINE COSTANTI ------
24 CADS=5 'SI UTILIZZANO TUTTI I CONVERTITORI A/D
25 '------- PRESENTAZIONE
30 REPEAT
31 READ POS,RIGA
35 GOSUB :VISUALIZZA_RIGA
36 PR++
40 UNTIL PR<3
58 '--- FINE PRESENTAZIONE
60 WAITS 3
85 LCDCLEAR
90 '----- INIZIO PROGRAMMA
91 REPEAT
92 CLR SENSORE
93 REPEAT
95 SENSORE++
111 READ POS,RIGA
121 GOSUB :VISUALIZZA_RIGA
122 READ POS,RIGA
124 GOSUB :TornaTemperaturaOTensione
125 GOSUB :VISUALIZZA_RIGA
130 UNTIL SENSORE<5
135 GOSUB :TEMP_SEND_USB
140 RESTORE 13
250 UNTIL 1
300 '----- FINE PROGRAMMA
380 ' -----------------------------
385 :TornaTemperaturaOTensione
387 VTEMP(SENSORE)=CADSIND(SENSORE)
390 TEMP=VTEMP(SENSORE)*5.0/1023
391 if SENSORE >3 then :NO_MOLT_100
395 TEMP*=100
400 :NO_MOLT_100 RIGA=RIGA & left(TEMP&"",4)
405 return
410 '------------------------------
430 '-----------------------------
440 :TEMP_SEND_USB
450 USBOUT=PSTART ' INVIO LO START
460 SET S
470 SOMMA=PSTOP+PSTOP
480 REPEAT
510 USBOUT=VTEMP(S)
520 SOMMA+=VTEMP(S)
530 S++
540 UNTIL S<=5
550 USBOUT=PSTOP ' INVIO LO STOP
560 USBOUT=SOMMA ' INVIO LA CHECKSUM
565 WAITS 1
570 ' incremento il contatore ed effettuo il polling +/-
636 CONTA++
637 LCDPOS=&H41
638 LCDWRITE=""&CONTA
640 LCDPOS=&H4F
645 LCDWRITE="+"
650 WAITMS 500
655 LCDPOS=&H4F
660 LCDWRITE="-"
665 WAITMS 200
670 RETURN
799 '----------------------------
800 :VISUALIZZA_RIGA
810 LCDPOS=POS
835 lcdwrite=RIGA
850 RETURN

Questa è la discussione originale.

Questa è la Versione 1.4 dell'eseguibile GraficoTemperature.

Questa è la Versione 1.6 dell'eseguibile GraficoTemperature.

Questo è il file .zip che contiene i due sorgenti in EABasic.





Valid XHTML 1.0 Strict



[ Back to top ] [ Home ]