Menu:

PPTEA Guida Galattica


di MarKoZaKKa


Questa è la discussione originale.


Indice:

Capitolo 11:
CADS Dreaming..

Bene... ci serve un esempio che calzi meglio del logoro ed un pò stantìo led, un esempio che utilizzi almeno un ingresso digitale, un esempio che sia d'interesse per molti e che abbia l'obiettivo del risparmio energetico, che possa essere utilizzato anche in futuro e che sia utile anche a me visto che ci perdo del tempo... mah... boh... mumblemumble... thinking... thinking...

CI SONO!!! IL TERMOSTATO!!! iniziamo con un termometro al quale poi metteremo un bel display che poi diventerà cronotermostato, che poi diventerà cronotermostato settimanale, che poi diventerà centralina di controllo integrata del riscaldamento ed acqua calda sanitaria, che poi diventerà con telecontrollo via GSM... sisisi mi piace!!! MI PIACEEEE!!! I know, it's only PPTEA, but I like it!

Iniziamo: cosa fa un termostato? semplice, acc/spent di un qualcosa in base ad una soglia di temperatura, quindi deve innanzitutto misurare la temperatura... come facciamo... con un bel sensore con uscita digitale!...ah, no, dobbiamo usare i CAD... con un sensore analogico... una PT1000? Esagerato, con quello che costano... un sensore a stato solido, economico... un bel LM35, fa figo e non impegna!!!

Che cos'è un LM35? è un circuito integrato a 3 pin, simile per dimensioni e contenitore ad un qualsiasi transistor, che fornisce un'uscita linearmente dipendente dalla temperatura a cui è esposto, secondo un coefficiente di proporzionalità noto (ecco, è tornato il professore...), in pratica, alimentandolo ci darà 10mV per ogni grado centigrado di temperatura cui è arrivato il suo contenitore, ciò vuol dire che (idealmente) a 0°C la sua uscita sarà 0mV, a 100°C sarà 1000mV ovvero 1,00V; nella realtà, dai datasheet si vede che con singola alimentazione, la minima temperatura misurabile è 2°C; comunque, per un termostato ne abbiamo d'avanzo.

Iniziamo col misurare la temperatura. Utilizzare un LM35 è semplice, un pin va ai +5V, l'altro alla massa dell'alimentazione, l'uscita dritta sparata su di un CAD, almeno per ora che ci stiamo giocando, poi magari daremo un'occhiata al datasheet (no, non è una parolaccia anglosassone, così si chamano le pubblicazioni contenenti le specifiche tecniche di un componente elettronico) per vedere come usare al meglio il componente.
Il CAD che useremo sarà, ovviamente, il #1 dato che con l'istruzione CADS=1 possiamo attivare solo questo. L'alimentazione che useremo sarà ovviamente 5,00000000V per semplificarci l'esistenza, e la misura della temperatura la comunicheremo via USB al PC.

Allora, innanzitutto:

10 SETIO=&H0001 20 CADS=1

COME? È uscita la versione 4 e c'è chi usa ancora i numeri di riga?

(nota di PinoTux, la V.4.1 è una beta e non è ancora disponibile su queste pagine)

Ma se siete così bravi, perché seguite questa guida? Qui siamo tutti ripetenti per 6 in condotta, i secchioni non li vogliamo...

Proseguiamo... iniziamo con delle semplici letture dell'ingresso e successivo output via USB, senza elaborazione...

30 USBOUT="T: " & CADS1

a questo punto che si fa? si continua a leggere l'ingresso e a sputare la lettura sulla USB

40 GOTO 30

In effetti l'output è un po bruttino... iniziamo a far andare a capo le scritte e convertiamo la lettura raw del convertitore in gradi centigradi:

30 PRINT "T: " & CADS1 * CAD_TO_TEMP

A questo punto, se volete buttarlo in hardware, potete utilizzare o il caro veccho potenziometro, oppure dotarvi di LM35, e vedere di nascosto l'effetto che fà (ciao, Enzo!)...

Torna all'indice

Capitolo 12:
Another (pair of) Brick(s) in The PPTEA.

Allora, abbiamo implementato un bel termometro USB, ma che rottura doverlo collegare al PC, ed inoltre, quei dati che sfrecciano nella finestra... ci vorrebbe un bel display.

Ma basta chiedere! come lei saprà,il PPTEA implementa l'interfaccia verso moduli LCD alfanumerici compatibili Hitachi HD44780; il modulo può essere collegato sia direttamente con 6 linee, perdendo quindi 6 linee di i/o, sia attraverso uno shift register esterno, il quale permette un collegamento con sole 2 linee di i/o, sacrificando la velocità di aggiornamento.

No, che cos'è uno shift register non ve lo spiego... noOo... no, no e no.
Va bè, solo per questa volta:
uno shift register è un circuito digitale formato da una serie di celle di memoria collegate in cascata, l'uscita di una all'ingresso dell'altra e con una linea di comando in comune che forza l'aggiornamento delle celle, le uscite di ogni cella sono disponibili all'esterno.
Se all'ingresso della prima cella invio un flusso di bit sincronizzato con il comando di aggiornamento, posso trasformare il flusso seriale in un flusso parallelo, vediamolo in concreto:

inizialmente, al tempo t0, immaginiamo che le celle dello shift register (a 4 bit) contengono tutte il valore "0" quale che sia il valore dell'ingresso ("X" ovvero indifferentemente 0 o 1), non avendo ricevuto il comando di aggiornamento (detto clock, che lasciamo al valore 0, lo indico con "__") le celle se ne stanno beatamente nel loro stato.

Al tempo t1, immaginiamo di inviare il segnale di clock (lo indico con "/\"), il quale farà si che ogni cella catturi il valore presente al suo ingresso, e lo memorizzi; in pratica, essendo gli ingressi di ciascuna collegate all'uscita della precedente (escluse la prima e l'ultima, ovviamente) avremo che ogni cella prenderà il valore di quella precedente, e la prima prenderà il valore dell'ingresso in quell'istante (che immaginiamo sia 1, giusto per vedere cosa accade), il valore precedente dell'ultima cella andrà ovviamente perso.


Ripetiamo il giochino per altre tre volte:

In pratica, abbiamo inviato 4 bit di dato (in questo caso "1111") su una linea seriale a due fili (data + clock) ed otteniamo una uscita parallela a 4 bit.
Con questo "barbatrucco" ed un paio di componenti esterni, è possibile inviare i comandi dal PPTEA all'LCD con soli due fili, anche se abbiamo bisogno di 6 volte il tempo necessario rispetto al collegamento diretto; sarà poi necessario ripulire lo shift register inviando una sequenza di 6 "0", quindi il tempo totale sarà di 12 volte quello del collegamento diretto, e questo avviene per ogni carattere scritto sul display, ma che cosa sono pochi cicli di clock rispetto all'eternità?

Ovviamente, abbiamo tutta una serie di comandi dedicati al comando dell'LCD, ma li vedremo man mano che ci serviranno, altrimenti perdiamo di vista l'obiettivo; lo shift register era interessante spiegarlo, perché può funzionare anche al contrario, quindi prendere un ingresso parallelo ad n bit e trasformarlo in un flusso seriale... a cosa ci serve? Beh, così su due piedi, a leggere n linee di input digitali con solo due linee di i/o del PPTEA.

Tutto questo è molto bello, ma come facciamo a dire al PPTEA che ha un LCD collegato, e magari pure a soli 2 fili (modo LCD2W)?
Ricordate la SETIO?
Vi dissi che passando un valore a 16 bit possiamo configurare le linee di I/O, in realtà la SETIO ha anche altre funzioni: permette di dire al PPTEA che ha collegato un display a 2 o a 6 fili e come lo deve indirizzare (una funzionalità utile per display non standard, ma che al momento ignoreremo).

Allora, ripetiamo quanto già detto: i bit da 0 a 15 della SETIO corrispondono alle 16 linee di I/O dl PPTEA, "1" se vogliamo un ingresso, "0" se vogliamo un'uscita; ora aggiungiamo altri 2 bit, il bit16 ed il bit17, i quali si occupano di definire il tipo di indirizzamento (bit16, "0" per indirizzamento standard, "1" per indirizzamento gestito da codice eabasic, qualsiasi cosa questo voglia dire...) ed il tipo di collegamento del display (bit17, "0" per LCD6W, "1" per LCD2W). come avrete già capito, se non esplicitiamo questi due bit nella SETIO, tutto rimane configurato per un display standard collegato a 6fili (bit16="0", bit17="0").

Per il collegamento fisico dell'LCD, fate riferimento allo schema elettrico contenuto in quel tomo che porta il poco rassicurante titolo di "MANUALE PPTEA"; io personalmente ho strappato la pagina relativa e l'ho incollata sul muro di fronte al mio tavolo di lavoro, almeno non devo sfogliarlo ogni volta.

Dato che sono un'estremista dell'LCD2W, configureremo il PPTEA per usare questo tipo di display.

Una cosa che non ho detto: dato che le linee di collegamento all'LCD sono in tutto e per tutto degli OUTPUT, dobbiamo assicurarci di specificarle come tali nella SETIO; per qualche strano ed imperscrutabile motivo, il Supremo ha donato la priorità alla CADS sulla SETIO, ma se scriviamo una cosa del tipo SETIO=&H2FFFF, quindi diciamo di avere un LCD2W collegato ma non specifichiamo che le linee di I/O relative al suo collegamento sono OUTPUT, " 'un funziona nulla!"; dobbiamo sempre impostare i bit della SETIO relativi alle linee che vanno a collegarsi all'LCD come OUTPUT... fatevene una ragione...

Alla prossima, che mi si sono scaricate le batterie del laptop.

Torna all'indice

Capitolo 13:
Pay no attention to the writings on the LCD

Bene, avete comprato un bellissimo LCD 4X20 cinese retroilluminato fucsia, pagato nulla, lo avete collegato a 6 fili, a 2 fili, al contrario, e non funziona ancora... e ve lo avevano pure detto prima di vendervelo che era "fucksia".
Andate a comprarne un'altro, va... che adesso vediamo come modificare il codice...

Senza menare il can per l'aia, che poi si stanca, ecco:

10 SETIO=&H20001
20 CADS=1
25 LCDCLEAR
30 LCDPOS=&H11
35 LCDWRITE="T: " & CADS1 * CAD_TO_TEMP
40 GOTO 30

Vediamo che la SETIO ha guadagnato i 2 bit di configurazione (per chi ancora non pensa HEX, ma solo SEX, SETIO=&B100000000000000001) che informano il PPTEA di avere un display collegato 2W, con indirizzamento standard; poi abbiamo alcuni nuovi comandi specifici per l'LCD, ovvero LCDCLEAR (che pulisce il display da quanto eventualmente rimasto), LCDPOS che posiziona il cursore di scrittura nel punto voluto, LCDWRITE che invia i dati da mostrare all'LCD.

Vediamo ciascuna nel dettaglio:
- LCDCLEAR: banale, direte voi, in effetti si, bisogna solo tenere presente che l'LCD ha una sua memoria, quindi una volta scritto qualcosa, questo rimane, anche quando fermate il PPTEA e anche quando lo riavviate, e quello che scrivete si mixa con quanto già presente... meglio ripulire prima.

- LCDPOS: Posiziona il "cursore di scrittura" in una locazione del display. Essendo alfanumerico, il display avrà R righe e C colonne, ad esempio un classico 2x16.
Bene, se ragionate in decimale, per posizionare il cursore al primo carattere della prima riga, dovrete calcolare il valore da passare all'istruzione con la formula LCDPOS=(16*R)+C; se ragionate in esadecimale, avrete che il primo carattere della prima riga sarà LCDPOS=&H11, l'ottavo della seconda riga sarà LCDPOS=&H28, l'ultimo della seconda riga sarà &H2F... bello l'hex, vero?

ATTENZIONE: se il display ha più di 16 caratteri per riga, non vi è più questa corrispondenza diretta.
- LCDWRITE: ovviamente, scrive quello che gli passiamo sul display, nel punto specificato dall'ultima LCDPOS, oppure a partire dalla posizione seguente quella dell'ultimo carattere scritto con una precedente LCDWRITE, attenzione che se finiamo fuori dai massimi caratteri, il display non va a capo in automatico.

Alla luce di queste spiegazioni, possiamo modificare il nostro codice come segue:

10 SETIO=&H20001
20 CADS=1
25 LCDCLEAR
26 LCDPOS=&H11
27 LCDWRITE="TEMPERATURA:"
28 LCDPOS=&H27
29 LCDWRITE="CELSIUS"
30 LCDPOS=&H21
35 LCDWRITE=LEFT(CADS1 * CAD_TO_TEMP,5)
40 GOTO 30

Ovvero scriviamo prima i caratteri "fissi" e poi andiamo a modificare solo le parti variabili del messaggio, questo usando un display LCD2W vuol dire velocizzare le operazioni di aggiornamento.
L'istruzione LEFT(S,n), introdotta adesso, permette i primi n caratteri di una stringa S; esiste anche la RIGHT(S,n) che esegue la stessa cosa partendo però da destra, quindi estrae gli ultimi n caratteri... no, le stringhe non sono quelle delle scarpe...
Con questa semplicissima operazione, abbiamo anche convertito un valore numerico in virgola mobile (CADS1*CAD_TO_TEMP) in una stringa di caratteri, ma delle conversioni tra tipi ne parleremo poi... o forse no... boh!

Come forse avrete notato, se avete messo tutto sul PPTEA e provato a vedere il funzionamento in hardware, probabilmente i numeri saranno "ballerini", questo a causa del rumore (elettrico) che entrerà nel circuito. Come già detto, per ridurne l'impatto è opportuno acquisire più valori successivi, per poi mediarli; vediamo come farlo in diversi modi, teniamo tutto buono fino alla riga 29 e poi modifichiamo il seguito:

metodo 1: somma e divisione

30 CONSTANT N=10
31 LCDPOS=&H21
32 FOR X=1 TO N
33 T=T+CADS1
34 NEXT X
35 LCDWRITE=LEFT(T/N* CAD_TO_TEMP,5)
36 T=0
40 GOTO 31

Cominciamo qui a parlare di cicli: un ciclo FOR...NEXT fa si che le istruzioni contenute tra il FOR ed il NEXT vengano ripetute tante volte quanto viene specificato come limite... in questo caso il valore contenuto in N, pari a 10.

A ogni ciclo la lettura istantanea del convertitore viene sommata nella variabile T, che poi viene divisa per N e convertita alla riga 35, l'effetto di questoè che mediamo su dieci misure quanto poi mostriamo a display.
PRO: questo metodo lo capiscono tutti; CONTRO: sprechiamo 2 variabili ed una costante, la velocità di acquisizione è limitata dal tempo di esecuzione del ciclo.

metodo 2: CADSEQ

E chi la conosce, non l'ho mai usata... devo documentarmi... CIAOOOOOoooooo.....

Torna all'indice

Capitolo 14:
Cads reprise

Bene, dopo questa lunga pausa, ho trovato un poco di tempo per proseguire con la Guida Galattica; nel frattempo sono uscite diverse versioni del PPTEA, ed ora siamo alla 4.2.4.
Stavamo per parlare dell'istruzione CADSEQ, ma nel debugger della 3.2 non funzionava e da una breve verifica nemmeno nella 4.2.4.
Direi che a questo punto ne parleremo comunque, ma non potremo simularla nel compiler, a meno di qualche trucchetto.

Dunque, abbiamo lasciato il nostro codice a questo punto:

10 SETIO=&H20001
20 CADS=1
25 LCDCLEAR
26 LCDPOS=&H11
27 LCDWRITE="TEMPERATURA:"
28 LCDPOS=&H27
29 LCDWRITE="CELSIUS"
30 CONSTANT N=10
31 LCDPOS=&H21
32 FOR X=1 TO N
33 T=T+CADS1
34 NEXT X
35 LCDWRITE=LEFT(T/N* CAD_TO_TEMP,5)
36 T=0
40 GOTO 31

La temperatura viene calcolata mediando 10 letture del CAD1, per minimizzare gli effetti del rumore; possiamo ottenere una cosa simile con l'istruzione CADSEQ, la cui sintassi è:

CADSEQ(vettore,CADn,intervallo,letture)

vettore: variabile di tipo vettore (ma và!?!)
CADn: il numero del convertitore che stiamo utilizzando
intervallo: mettete via le merendine... è il tempo che vogliamo attendere tra due letture successive del CADn, in microsecondi (usec)
letture: il numero di letture successive che vogliamo

Quindi, se scriviamo CADSEQ(T,1,100,10) otterremo (?forse?) che nel vettore T finiranno 10 letture successive del CAD1 intervallate di 100μsec.
Si, ma cos'è un vettore?
Detta in parole povere, è una variabile "a scomparti", immaginatela come una scatola, con sopra scritto il contenuto divisa in scomparti, ciascuno contenente un elemento.
Per utilizzarla, dobbiamo prima dire al compiler di che tipo di valori abbiamo bisogno, e quanti ne vogliamo; in fase di compilazione verrà "costruita" la scatola che poi utilizzeremo nel codice.
Abbiamo alcuni vincoli, nell'utilizzare vettori: dobbiamo dichiararli all'inizio del codice sia come numero di elementi che come tipo di contenuto, in più, le dimensioni massime dipenderanno da quanta memoria utilizzeremo per le altre variabili.
Pertanto, aggiungeremo al nostro codice la riga:

5 DIM T(10) AS WORD

con la quale dichiariamo un vettore di 10 elementi di tipo WORD (ovvero numero binario a 16bit, dato che le letture del CAD sono numeri binari a 10bit); poi, la routine di lettura e visualizzazione diventerà:

30 CADSEQ(T,1,5000,10)
31 LCDPOS=&H21
32 FOR X=1 TO 10
33 TM=TM+T(X)
34 NEXT X
35 LCDWRITE=LEFT(TM/10* CAD_TO_TEMP,5)
36 TM=0
40 GOTO 30

Ovviamente, per misurare una temperatura, entrambi i metodi sono efficaci; questo perchèla variazione di temperatura non è così rapida da necessitare una cattura di campioni a distanza di microsecondi; se invece desideriamo catturare un segnale elettrico a rapida variazione, la CADSEQ ci permetterà di catturarlo efficacemente.

Torna all'indice

Capitolo 15:
Back to the Guide

Credevate che la Guida Galattica fosse caduta nel limbo delle cose incompiute, invece ecco un nuovo capitolo.
Bene, sappiamo come acquisire la temperatura, e cosa dovevamo costruire, ah,si, un termostato.
Quindi dovremo fissare almeno una soglia e comparare il valore della temperatura con la soglia quindi decidere cosa fare quando siamo sopra oppure sotto tale valore.
Questo è (quasi) quello che fa un termostato meccanico, se non consideriamo l'isteresi del meccanismo che provoca la commutazione a 23°C o più quando la temperatura sta salendo, ed a 21°C o meno quando sta scendendo, a fronte di un setpoint di 22°C.
Se ci pensiamo bene, l'isteresi è proprio ciò che evita un continuo accendi/spegni del sistema, per cui dovremo replicare nel codice anche questa caratteristica.
Abbiamo già il programma che legge una temperatura e la mostra sul display, dobbiamo aggiungere la possibilità di attivare o disattivare una uscita in base al valore della temperatura.
Decido di voler mantenere una temperatura di 22°C. Voglio evitare un continuo accendersi/spegnersi del riscaldatore, pertanto decido che si accenda solo quando la temperatura scende sotto i 21°C e si spenga non appena supera i 23°C; in questa maniera manterrò il valore medio della temperatura intorno ai 22°C.
Decido che l'uscita da utilizzare per il pilotaggio del riscaldatore è la numero 14. Perchè, direte voi, perchè le linee 1,2,3,5 possono essere usate come ingressi analogici, quindi me le tengo libere per eventuali sviluppi, la 4 e la 11 servono per il collegamento a due fili con il display LCD, la 9 e la 10 per il bus I2C di collegamento a memoria esterna ed orologio, la 15 può essere utilizzata come uscita audio, rimane poca scelta.
Innanzitutto, mettiamo in ordine il codice, spostiamo configurazioni e costanti tutti all'inizio del codice, tanto una volta letti non ci interessano più, anzi, facciamo una bella cosa, eliminiamo pure i numeri di riga, sfruttando le funzionalità avanzate del compilatore PPTEA:

CODICE

PRAGMA NO_NUM_LINE
PRAGMA INTERNAL_EEPROM
SETIO=&H20001
CADS=1
CONSTANT N=10
LCDCLEAR
LCDPOS=&H11
LCDWRITE="TEMPERATURA:"
LCDPOS=&H27
LCDWRITE="CELSIUS"
:31
LCDPOS=&H21
FOR X=1 TO N
T=T+CADS1
NEXT X
LCDWRITE=LEFT(T/N* CAD_TO_TEMP,5)
T=0
GOTO :31

Sono apparse alcune istruzioni sconosciute... e sono spariti i numeri di riga... Andiamo con ordine...
Abbiamo le direttive PRAGMA, che comunicano al compilatore alcune impostazioni, nello specifico,
PRAGMA NO_NUM_LINE dice che non vogliamo più (evviva!) usare i numeri di linea, saremo quindi liberi di aggiungere/cancellare/spostare parti di codice senza dover ogni volta impazzire con la numerazione;
PRAGMA INTERNAL_EEPROM dice che il nostro codice dovrà risiedere (per ora) nella eeprom interna del PPTEA.
Avendo eliminato i numeri di linea, per effettuare i salti abbiamo bisogno di un riferimento, questo è la LABEL, un riferimento menmonico preceduto dal carattere ":" al momento ho mantenuto il vecchio numero di riga, creando la label ":31" e modificando l'ultima linea in "GOTO :31".
Miglioriamo ancora un poco la leggibilità del codice, utilizzando un altro strumento che finora abbiamo ignorato, i commenti.
Possiamo scrivere delle frasi di documentazione all'interno del codice, che ci permettono di capire quello che ci siamo inventati in un momento di genio e che a distanza di due mesi non riusciamo più a decifrare.
Possiamo inserire sia righe intere che non contengono null'altro che testo umanamente comprensibile, sia commenti alla fine di una riga di codice:

CODICE

PRAGMA NO_NUM_LINE
PRAGMA INTERNAL_EEPROM
REM CODICE PER TERMOSTATO
SETIO=&H20001 'IMPOSTO LINEA 1 INPUT ALTRE OUTPUT E DISPLAY 2FILI
CADS=1 'USO IL PRIMO CONVERTITORE A/D
CONSTANT N=10 'NUMERO DI LETTURE A/D DA MEDIARE
LCDCLEAR 'PULISCO E PREDISPONGO SCRITTE FISSE SU LCD
LCDPOS=&H11
LCDWRITE="TEMPERATURA:"
LCDPOS=&H27
LCDWRITE="CELSIUS"
:31 'LOOP DI VISUALIZZAZIONE
LCDPOS=&H21
FOR X=1 TO N
T=T+CADS1 'LOOP DI LETTURA CAD
NEXT X
LCDWRITE=LEFT(T/N* CAD_TO_TEMP,5)
T=0
GOTO :31

Un'altro bello strumento per rendere il codice più leggibile è la cosiddetta indentazione, ovvero lo spostare di una o piu tabulazioni a destra le sezioni di codice all'interno di un ciclo o di un IF/THEN/ELSE e così via, se poi mettiamo anche qualche linea vuota per separare i blocchi di codice che hanno funzioni diverse, il tutto migliora ulteriormente:

CODICE

PRAGMA NO_NUM_LINE
PRAGMA INTERNAL_EEPROM
REM CODICE PER TERMOSTATO
SETIO=&H20001 'IMPOSTO LINEA 1 INPUT ALTRE OUTPUT E DISPLAY 2FILI
CADS=1 'USO IL PRIMO CONVERTITORE A/D
CONSTANT N=10 'NUMERO DI LETTURE A/D DA MEDIARE
LCDCLEAR 'PULISCO E PREDISPONGO SCRITTE FISSE SU LCD
LCDPOS=&H11
LCDWRITE="TEMPERATURA:"
LCDPOS=&H27
LCDWRITE="CELSIUS"
:31 'LOOP DI VISUALIZZAZIONE
LCDPOS=&H21
FOR X=1 TO N
T=T+CADS1 'LOOP DI LETTURA CAD
NEXT X
LCDWRITE=LEFT(T/N* CAD_TO_TEMP,5)
T=0
GOTO :31
Meglio, vero?
Adesso facciamo un ulteriore salto di qualità; ci siamo slegati dai numeri di riga, il nostro codice non è più limitato dalla rigida posizione numerica, quindi possiamo identificare dei blocchi funzionali e racchiuderli all'interno di una routine, che chiameremo al lavoro quando ci servirà e magari possiamo pure crearci una libreria di subroutine già pronte.

Abbiamo già due blocchi, quello che inizializza il display con le scritte fisse e quello che esegue calcolo della media e visualizzazione della temperatura, e già che ci siamo, chiamiamo le variabili e le costanti in modi che ci aiutino a capire, e non lamentatevi della fatica che fate a digitare.

CODICE

PRAGMA NO_NUM_LINE
PRAGMA INTERNAL_EEPROM
REM CODICE PER TERMOSTATO
REM IMPOSTAZIONI
SETIO=&H20001 'imposto 1 input ed il resto output
CADS=1 'uso il primo a/d
CONSTANT LETTURE=10 'numero di letture dell'a/d da mediare
CONSTANT RIGA1="TEMPERATURA:"
CONSTANT RIGA2="CELSIUS"
REM INIZIO ESECUZIONE
CALL PREPARA_DISPLAY
:CALCOLA_E_MOSTRA
CALL MISURA
CALL MOSTRA
T=0
GOTO :CALCOLA_E_MOSTRA
END
SUB PREPARA_DISPLAY 'inizializzo il display e predispongo scritte fisse
LCDCLEAR
LCDPOS=&H11
LCDWRITE=RIGA1
LCDPOS=&H27
LCDWRITE=RIGA2
SUBEND
SUB MISURA 'calcola la media delle letture a/d
FOR N=1 TO LETTURE
T=T+CADS1
NEXT N
T=T/LETTURE*CAD_TO_TEMP
SUBEND
SUB MOSTRA 'scrive la temperatura misurata e mediata
LCDPOS=&H21
LCDWRITE=LEFT(T,5)
SUBEND
Non è molto più comprensibile, ora?

Torna all'indice


Valid XHTML 1.0 Strict



[ Back to top ] [ Home ]