Corso ET

titolo:

Centralina meteo 2007/08

data.:

24/01/08

file.:
 
descr.:

Definizione funzionalità software  gestione centralina

 

Obiettivi :

Realizzazione di un programma in linguaggio assembler 8051 per la scheda a microcontrollore 8051 della centralina che svolga  le seguenti funzioni:

  1. Acquisizione ad intervalli regolari dei valori di temperatura dalle due sonde di temperatura, di velocità e direzione del vento, di valore umidità relativa e livello di insolazione. 
  2. Memorizzazione massimo  minimo della giornata e valore attuale delle variabili acquisite per eventuali consultazione in tempo reale.

Realizzazione di un programma in linguaggio visual C  per PC che svolga  le seguenti funzioni:

  1. Consultazione in tempo reale di valore massimo minimo della giornata e valore attuale delle variabili raccolte dalla centralina
  2. Download dati acquisiti dalla centralina,  con possibilità di  salvataggio su file in formato CSV e graficazione dell'andamento nel tempo.

Realizzazione di pagina Web in codice PHP che svolga  le seguenti funzioni:

  1. Consultare i dati CSV precedentemente salvati dal sw su PC.
  2. Consultazione in tempo reale di valore massimo minimo della giornata.

Grandezza Valore Attuale Min giorno Max giorno Min giorno prec. Max giorno prec. Acq
Te1 X X X X X X
Te2 X X X X X X
VelV X X X X X X
DirV X         X
Um X X X X X X
Ins X X X X X X
Vbatt X X X X X  

 


Specifiche software asm 8051

Definizione variabili principali:

Nome Dim.       Locazione mem. Descrizione
Te1 1 byte Esterna Ultimo valore di temperatura Te1 letto,  (Raw 0=-20° 255=56°) 
MaxGTe1 1 byte Esterna Massimo valore di temperatura Te1 della giornata,  (Raw 0=-20° 255=56°)
MinGTe1 1 byte Esterna Minimo valore di temperatura Te1 della giornata,  (Raw 0=-20° 255=56°)
MaxGPTe1 1 byte Esterna Massimo valore di temperatura Te1 della giornata precedente,  (Raw 0=-20° 255=56°)
MinGPTe1 1 byte Esterna Minimo valore di temperatura Te1 della giornata precedente,  (Raw 0=-20° 255=56°)
PBTe1 2 byte Esterna Puntatore al buffer di memorizzazione temperatura Te1 su memoria esterna.
MTe1 2 byte Interna Accumulo per media Te1
CTe1 1 byte Interna Conteggio per media Te1
TacqTe1 1 byte Interna Conteggio per tempo acq Te1
       
Te2 1 byte Esterna Ultimo valore di temperatura Te2 letto,  (Raw 0=-20° 255=56°)
MaxGTe2 1 byte Esterna Massimo valore di temperatura Te2 della giornata,  (Raw 0=-20° 255=56°)
MinGTe2 1 byte Esterna Minimo valore di temperatura Te2 della giornata,  (Raw 0=-20° 255=56°)
MaxGPTe2 1 byte Esterna Massimo valore di temperatura Te2 della giornata precedente,  (Raw 0=-20° 255=56°)
MinGPTe2 1 byte Esterna Minimo valore di temperatura Te2 della giornata precedente,  (Raw 0=-20° 255=56°)
PBTe2 2 byte Esterna Puntatore al buffer di memorizzazione temperatura Te2 su memoria esterna.
MTe2 2 byte Interna Accumulo per media Te2
CTe2 1 byte Interna Conteggio per media Te2
TacqTe2 1 byte Interna Conteggio per tempo acq Te2
       
VelV 1 byte Esterna Ultimo valore di velocità vento letto,  (Raw 0=<da definire> 255=<da definire>) 
MaxGVelV 1 byte Esterna Massimo valore velocità vento della giornata,  (Raw 0=<da definire> 255=<da definire>)
MinGVelV 1 byte Esterna Minimo valore velocità vento della giornata,   (Raw 0=<da definire> 255=<da definire>)
MaxGPVelV 1 byte Esterna Massimo valore velocità vento della giornata precedente,  (Raw 0=<da definire> 255=<da definire>)
MinGPVelV 1 byte Esterna Minimo valore velocità vento della giornata precedente,   (Raw 0=<da definire> 255=<da definire>)
PVelV 2 byte Esterna Puntatore al buffer di memorizzazione velocità vento su memoria esterna.
MVelV 2 byte Interna Accumulo per media velocità vento
CVelV 1 byte Interna Conteggio per media velocità vento
TacqVelV 1 byte Interna Conteggio per tempo acq velocità vento
       
DirV 1 byte Esterna Ultimo valore della direzione del vento.
PDirV 2 byte Esterna Puntatore al buffer di memorizzazione direzione vento su memoria esterna.
MDirV 2 byte Interna Accumulo per media direzione vento
CDirV 1 byte Interna Conteggio per media direzione vento
TacqDirV 1 byte Interna Conteggio per tempo acq direzione vento
       
Um 1 byte Esterna Ultimo valore di umidità relativa letto,  (Raw 0=<da definire> 255=<da definire>) 
MaxGUm 1 byte Esterna Massimo valore di umidità relativa della giornata,  (Raw 0=<da definire> 255=<da definire>)
MinGUm 1 byte Esterna Minimo valore di umidità relativa della giornata,  (Raw 0=<da definire> 255=<da definire>)
MaxGPUm 1 byte Esterna Massimo valore di umidità relativa della giornata precedente,  (Raw 0=<da definire> 255=<da definire>)
MinGPUm 1 byte Esterna Minimo valore di umidità relativa della giornata precedente,  (Raw 0=<da definire> 255=<da definire>)
PUm 2 byte Esterna Puntatore al buffer di memorizzazione livello umidità su memoria esterna.
MUm 2 byte Interna Accumulo per media livello umidità
CUm 1 byte Interna Conteggio per media livello umidità
TacqUm 1 byte Interna Conteggio per tempo acq livello umidità
       
Ins 1 byte Esterna Ultimo valore di insolazione letto,  (Raw 0=<da definire> 255=<da definire>) 
MaxGIns 1 byte Esterna Massima insolazione della giornata
MinGIns 1 byte Esterna Minima insolazione della giornata
MaxGPIns 1 byte Esterna Massima insolazione della giornata precedente
MinGPIns 1 byte Esterna Minima insolazione della giornata precedente
PIns 2 byte Esterna Puntatore al buffer di memorizzazione livello di insolazione su memoria esterna.
MIns 2 byte Interna Accumulo per media livello di insolazione
CIns 1 byte Interna Conteggio per media livello di insolazione
TacqIns 1 byte Interna Conteggio per tempo acq livello umidità
       
Vbatt 1 byte Esterna Ultimo valore di tensione batteria letto,  (Raw 0=<da definire> 255=<da definire>) 
MaxGVbatt 1 byte Esterna Massimo valore di tensione batteria della giornata,  (Raw 0=<da definire> 255=<da definire>)
MinGVbatt 1 byte Esterna Minimo valore di tensione batteria della giornata,  (Raw 0=<da definire> 255=<da definire>)
MaxGPVbatt 1 byte Esterna Massimo valore di tensione batteria della giornata precedente,  (Raw 0=<da definire> 255=<da definire>)
MinGPVbatt 1 byte Esterna Minimo valore di tensione batteria della giornata precedente,  (Raw 0=<da definire> 255=<da definire>)
MVbatt 2 byte Interna Accumulo per media livello tensione batteria
CVbatt 1 byte Interna Conteggio per media livello tensione batteria
TacqVbatt 1 byte Interna Conteggio per tempo acq livello tensione batteria
       
cSec 1 byte Interna Centesimi di secondo
Sec 1 byte Interna Ore
Min 1 byte Interna Minuti
Ore 1 byte Interna Secondi
FTe1 1 bit Interna Flag indicante intervallo di acquisizione temperatura Te1 scaduto
FTe2 1 bit Interna Flag indicante intervallo di acquisizione temperatura Te2 scaduto
FVelV 1 bit Interna Flag indicante intervallo di acquisizione velocità vento scaduto
FDirV 1 bit Interna Flag indicante intervallo di acquisizione direzione vento scaduto
FUm 1 bit Interna Flag indicante intervallo di acquisizione livello umidità scaduto
FIns 1 bit Interna Flag indicante intervallo di acquisizione livello insolazione scaduto
FVbatt 1 bit Interna Flag indicante intervallo di acquisizione tensione batteria scaduto
       
FFTe1 1 bit Interna Flag indicante buffer temperatura Te1 pieno
FFTe2 1 bit Interna Flag indicante buffer temperatura Te2 pieno
FFVelV 1 bit Interna Flag indicante buffer velocità vento pieno
FFDirV 1 bit Interna Flag indicante buffer direzione vento pieno
FFUm 1 bit Interna Flag indicante buffer livello umidità pieno
FFIns 1 bit Interna Flag indicante buffer livello insolazione pieno

Definizione costanti principali:

Nome Dim. Descrizione Valore assegnato
BufTe1K 2 bytes Start buffer temperatura Te1  
BufTe2K 2 bytes Start buffer temperatura Te2  
BufVelVK 2 bytes Start buffer velocità vento  
BufDirVK 2 bytes Start buffer direzione vento.  
BufUmK 2 bytes Start buffer livello umidità  
BufInsK 2 bytes Start buffer livello insolazione  
LBufTe1K 2 bytes Lunghezza buffer temperatura Te1  
LBufTe2K 2 bytes Lunghezza buffer temperatura Te2  
LBufDirVK 2 bytes Lunghezza buffer direzione vento  
LBufVelVK 2 bytes Lunghezza buffer velocità vento  
LBufUmK 2 bytes Lunghezza buffer livello umidità  
LBufInsK 2 bytes Lunghezza buffer insolazione  
TacqTe1K 1 byte Tempo di acquisizione temperatura Te1 (min.)  
TacqTe2K 1 byte Tempo di acquisizione temperatura Te2 (min.)  
TacqDivVK 1 byte Tempo di acquisizione direzione vento (min.)  
TacqVelVK 1 byte Tempo di acquisizione velocità vento (min.)  
TacqUmK 1 byte Tempo di acquisizione livello umidità (min.)  
TacqInsK 1 byte Tempo di acquisizione livello insolazione (min.)  
CTe1K 1 byte Numero valori per media temperatura Te1  
CTe2K 1 byte Numero valori per media temperatura Te2  
CDivVK 1 byte Numero valori per media direzione vento  
CVelVK 1 byte Numero valori per media velocità vento  
CUmK 1 byte Numero valori per media livello umidità  
CInsK 1 byte Numero valori per media livello insolazione  

Esempio di sistemazione delle variabili su memoria esterna.

Cella di memoria
contenente
Indirizzo Valore
Te1 9000H 0..255
MaxGTe1 9001H 0..255
MinGTe1 9002H 0..255
MaxGPTe1 9003H 0..255
MinGPTe1 9004H 0..255
PBTe1 9005H 0..65535
Te2 9007H 0..255
MaxGTe2 9008H 0..255
MinGTe2 9009H 0..255
MaxGPTe2 900AH 0..255
MinGPTe2 900BH 0..255
PBTe2 900CH 0..65535
... ... ...

 

Esempio di sistemazione dei valori acquisti memoria esterna.

Cella di memoria
contenente
Indirizzo Valore
Te1Acq1 BufTe1K 0..255
Te1Acq2 BufTe1K+1 0..255
Te1Acq3 BufTe1K+2 0..255
... ... ...
Te2Acq1 BufTe2K 0..255
Te2Acq2 BufTe2K+1 0..255
Te2Acq3 BufTe2K+2 0..255
... ... ...

Algoritmi

main


Inizializzazione

Timer 0 sarà utilizzato per generare la base dei tempi per l'orologio e eventuali conteggi di temporizzazione, deve essere impostato in modo di funzionamento 1 e deve chiamare il proprio servizio di interruzione ogni 10ms.

La porta seriale deve essere configurata per un velocità di trasferimento da 9600b/s, 8 bit di dati e un bit di stop, timer 1 svolge la funzione di generatore di clock per la porta seriale e deve essere impostato nel modo di funzionamento 2

Vedi: http://xnullo/corso/labsitel/docs/scheda_8051/seriale.htm


Orologio - timer

 

Timing acq


Rilevamento ed acquisizione

Algoritmo da utilizzare per rilevamento ed  acquisizione di ciascuna grandezza: Te1,Te2, VelV, DirV, Um, Ins, Vbatt

 

Interpretazione dei nomi indicati nel diagramma di flusso:

ValADC Valore appena letto dall'ADC
Media Risultato della media, corrisponde a:Te1,Te2,VelV,DirV,Um, Ins, Vbatt
AccMedia Variabile di accumulo media, corrisponde a:MTe1,MTe2,MVelV,MDirV,MUm, MIns, MVbatt
ContMedia Contatore media, corrisponde a:CTe1,CTe2,CVelV,CDirV,CUm, CIns, CVbatt
ContMediaK N.valori da mediare, corrisponde a:CTe1K,CTe2K,CVelVK,CDirVK,CUmK, CInsK, CVbattK
MinMax Subroutine che si occupa dell' elaborazione del minimo e del massimo della giornata
N.B. non è previsto il rilevamento del massimo del minimo di DirV
Acq Subroutine di acquisizione in memoria.
N.B. non è prevista l'acquisizione in memoria di VBatt.

 


MinMax

Algoritmo di rilevazione del massimo e minimo della giornata

Interpretazione dei nomi indicati nel diagramma di flusso:

Media Risultato della media, corrisponde a:Te1,Te2,VelV,DirV,Um, Ins, Vbatt
MinG Minimo valore della giornata, corrisponde a:MinGTe1, MinGTe2, MinGVelV, MinGUm, MinGIns, MinGVbatt
MaxG Massimo valore della giornata, corrisponde a:MaxGTe1, MaxGTe2, MaxGVelV, MaxGUm, MaxGIns, MaxGVbatt

 


Azz. Min Max


Acq

Algoritmo di acquisizione.
Lo schema di allocazione dei buffers su Ram esterna deve come indicato in figura

 

Interpretazione dei nomi indicati nel diagramma di flusso:

Media Risultato della media, corrisponde a:Te1,Te2,VelV,DirV,Um, Ins, Vbatt
MemExt[P] Cella di memoria esterna puntata da P
P Puntatore al buffer su memoria esterna, corrisponde a:PBTe1,PBTe2,PBVelV,PBDirV,PBUm, PBIns
BufK Indirizzo di inizio del buffer,  corrisponde a:BufTe1K, BufTe2K, BufVelVK, BufDirVK, BufUmK, BufInsK
LBufK Dimensione del buffer,  corrisponde a:LBufTe1K, LBufTe2K, LBufVelVK, LBufDirVK, LBufUmK, LBufInsK
FF Flag indicante il buffer pieno

 


Lettura valore ADC

8 bit

10 bit


Seriale

La porta seriale RS232 sarà utilizzata per il trasferimento dati da  Centralina meteo e PC

Si ipotizza un funzionamento Master Slave dove il ruolo di slave spetta alla centralina. La centralina rimane  sempre in ascolto e processa le eventuali richiesta fatte da PC e risponde in base alla richiesta.

Definizione del protocollo:

Si articola in 4 comandi

wrmemb: Scrivi il  byte indicato alla memoria esterna alla cella di indirizzo indicato

Flusso dati ricevuto dalla seriale (in bytes):

07h AddL AddH Valore byte

Flusso dati trasmesso alla seriale (in bytes):

non viene trasmesso nulla.
 

rdmemb: Leggi un byte dalla memoria esterna alla cella di indirizzo indicato

Flusso dati ricevuto dalla seriale (in bytes):

08h AddL AddH

Flusso dati trasmesso alla seriale (in bytes):

Valore byte 

 

wrmem: Scrivi n. bytes alla memoria esterna a partire dalla cella di indirizzo indicato.

0>n>256

Flusso dati ricevuto dalla seriale (in bytes).

0Bh AddL AddH n.bytes Byte1 Byte2 Byte.. Byte n

Flusso dati trasmesso alla seriale (in bytes):

non viene trasmesso nulla.
 

rdmem: Leggi n. byte dalla memoria esterna a partire dalla cella di indirizzo indicato.

0>n>256

Flusso dati ricevuto dalla seriale (in bytes):

0Ch AddL AddH n.bytes

Flusso dati trasmesso alla seriale (in bytes):

Byte1 Byte2 Byte.. Byte n

 


r_wrmemb

 

r_rdmemb

r_wrmem

r_rdmem

wrmemb = 07h
rdmemb = 08h
wrmem =  0Bh
rdmem =  0Ch

 

check acall rx
ck2 cjne a,#wrmemb,ck3
sjmp r_wrmemb
ck3 cjne a,#rdmemb,ck4
sjmp r_rdmemb
ck4 cjne a,#wrmem,ck5
sjmp r_wrmem
ck5 cjne a,#rdmem,ck6
sjmp r_rdmem
fine:
reti
r_rdmemb:
acall rx
mov dpl,a
acall rx
mov dph,a
movx a,@dptr
acall tx
sjmp fine

r_wrmemb:
acall rx
mov dpl,a
acall rx
mov dph,a
acall rx
movx @dptr,a
sjmp fine

r_wrmem:
acall rx
mov dpl,a
acall rx
mov dph,a
acall rx
mov 7FH,a
lr_wr acall rx
movx @dptr,a
inc dptr
djnz 7FH,lr_wr
sjmp fine


r_rdmem:
acall rx
mov dpl,a
acall rx
mov dph,a
acall rx
mov 7FH,a
lr_rd movx a,@dptr
acall tx
inc dptr
djnz 7FH,lr_rd
jmp fine

rx jnb ri,$
rxf clr ri
mov a,sbuf
ret

tx mov sbuf,a
jnb ti,$
clr ti
ret

 


Specifiche software BC4Builder

//---------------------------------------------------------------------------
#include <vcl.h>

#pragma hdrstop

#include "UCom8051.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "uCiaComport"
#pragma link "VaClasses"
#pragma link "VaComm"
#pragma link "VaClasses"
#pragma resource "*.dfm"
TFormCom8051 *FormCom8051;
#define InMemByte_K 8
#define InMem_K 12
#define OutMem_K 11
#define OutMemByte_K 7

//---------------------------------------------------------------------------
__fastcall TFormCom8051::TFormCom8051(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------
bool __fastcall TFormCom8051::InMemByte(unsigned int Add,char *Value)
{
int ts;
char st[3];
char rx[1];
st[0]=InMemByte_K;
st[1]=Add & 0xFF;
st[2]=Add >> 8;
ts=GetTickCount();
VaComm1->WriteBuf(st,3);
while ((VaComm1->ReadBufUsed()==0) && ((GetTickCount()-ts)<500))
{
Application->ProcessMessages();
}
if ((GetTickCount()-ts)<500)
{
VaComm1->ReadBuf(Value,1);
return True;
}
else
{
return False;
}
}

bool __fastcall TFormCom8051::InMem(unsigned int Add,char *Value,unsigned char Len)
{
int ts;
char st[4];

st[0]=InMem_K;
st[1]=Add & 0xFF;
st[2]=Add >> 8;
st[3]=Len;
ts=GetTickCount();
VaComm1->WriteBuf(st,4);
while ((VaComm1->ReadBufUsed()<Len) && ((GetTickCount()-ts)<500))
{
Application->ProcessMessages();
}
if ((GetTickCount()-ts)<500)
{
VaComm1->ReadBuf(Value,Len);
return True;
}
else
{
return False;
}
}

bool __fastcall TFormCom8051::OutMem(unsigned int Add,char *Value,unsigned char Len)
{
int ts,n;
char st[260];
st[0]=OutMem_K;
st[1]=Add & 0xFF;
st[2]=Add >> 8;
st[3]=Len;
for (n=0;n<Len;n++)
st[4+n]=Value[n];
ts=GetTickCount();
VaComm1->WriteBuf(st,4+Len);
while ((VaComm1->WriteBufUsed()!=0) && ((GetTickCount()-ts)<500))
{
Application->ProcessMessages();
}
if ((GetTickCount()-ts)<500)
{
return True;
}
else
{
return False;
}
}

bool __fastcall TFormCom8051::OutMemByte(unsigned int Add,char *Value)
{
int ts;
char st[4];
st[0]=OutMemByte_K;
st[1]=Add & 0xFF;
st[2]=Add >> 8;
st[3]=Value[0];
ts=GetTickCount();
VaComm1->WriteBuf(st,4);
while ((VaComm1->WriteBufUsed()!=0) && ((GetTickCount()-ts)<500))
{
Application->ProcessMessages();
}
if ((GetTickCount()-ts)<500)
{
return True;
}
else
{
return False;
}
}

bool __fastcall TFormCom8051::OutMemByteVerify(unsigned int Add,char *Value)
{
char v[1];
if ((OutMemByte(Add,Value)) && (InMemByte(Add,v)) && (v[0]=Value[0]))
return True;
else
return False;
}

bool __fastcall TFormCom8051::OutMemVerify(unsigned int Add,char *Value, int Len)
{
char v[255];
if ((OutMem(Add,Value,Len)) && (InMem(Add,v,Len)) && (memcmp(v,Value,Len)==0))
return True;
else
return False;
}


//---------------------------------------------------------------------------

void __fastcall TFormCom8051::FormCreate(TObject *Sender)
{
VaComm1->Open();
}
//---------------------------------------------------------------------------