← camposlh.comDOCUMENTAÇÃO TÉCNICA · REV. 01

Instrumentação elétrica · arquitetura de firmware

Analisador de Conformidade e Desvio de Medidores de Energia

Leitura estruturada dos firmwares fornecidos para aquisição, processamento e interface gráfica. A arquitetura original reúne o PIC18F4550, destinado à aquisição e aos cálculos, e o PIC18F2520, responsável pela IHM gráfica; o conjunto de medições inclui rotinas de análise angular, frequência e sequência de fases.

PIC18F4550 · AQUISIÇÃOPIC18F2520 · IHM / GLCDI²C · ENDEREÇO 0x66MEDIÇÃO DIRETA E POR TC
Leitura de engenharia

Os códigos são apresentados integralmente para estudo técnico. Calibração, isolação, proteção, compatibilidade eletromagnética e procedimento metrológico precisam ser validados no equipamento físico antes de qualquer aplicação em campo.

Contexto do projeto

Este conteúdo documenta um protótipo funcional desenvolvido há mais de 10 anos. Testes realizados confirmaram seu funcionamento, mas o projeto não avançou para produção, certificação, homologação ou uso comercial. A apresentação tem caráter técnico, histórico e educacional e não se destina à medição para faturamento.

01 · ARQUITETURA CONFIRMADA

Dois microcontroladores, duas responsabilidades

INTERFACE I²C · 17 BYTES

PIC18F4550 · aquisição e cálculo

Processamento das grandezas elétricas

  • Configura ADC de 10 bits nos canais AN0–AN7.
  • Amostra tensões de fase, correntes de fase e corrente de neutro.
  • Acumula o produto instantâneo tensão × corrente para potência ativa e energia.
  • Executa rotinas de aquisição, calibração e menus de medição.
I²C
0x66

PIC18F2520 · display e operação

IHM gráfica e consolidação do ensaio

  • Opera como escravo I²C a 20 MHz, em C4/C3.
  • Recebe uma fila de mensagens de 17 bytes para a tela GLCD.
  • Seleciona telas de tensões/correntes, potências e ensaio de energia.
  • Consolida no ensaio P = energia ÷ tempo, S total e fator de potência.

02 · MEDIÇÕES E CÁLCULOS POR FASE

Rastreabilidade das grandezas elétricas

FÓRMULAS IDENTIFICADAS NO CÓDIGO

GrandezaImplementação observadaResponsávelObservação técnica
Tensão de fase RMSVAN, VBN, VCN ← Tensao(0..2)PIC18F4550O instrumento trabalha com janelas repetidas de amostragem em alta taxa, integração no período de medição, rejeição das janelas extrema e calibração por canal para formar o valor eficaz exibido.
Corrente RMS de fase e neutroIA, IB, IC, IN ← Tensao(3..6)PIC18F4550Os canais de corrente são AN4, AN5, AN6 e AN7. A leitura efetiva resulta da mesma cadeia de aquisição integrada e calibrada; a aplicação com TC depende do módulo de interface e das constantes instaladas.
Potência ativa por faseP = média[V(t) × I(t)] × calibraçãoPIC18F4550A rotina PW() acumula produtos de amostras síncronas durante 100 interrupções e aplica fatores de ajuste.
Energia ativaENERG += Vm1×Im1 + Vm2×Im2 + Vm3×Im3PIC18F4550O modo de energia integra produtos de três fases e transfere o acumulado periodicamente. A unidade final depende das constantes de calibração do conjunto ensaiado.
Potência aparenteSfase = Vfase × Ifase; Stotal = SA + SB + SCPIC18F2520 / PIC18F4550O firmware de IHM calcula o somatório no modo de ensaio; o firmware de aquisição envia as grandezas por fase para a tela.
Fator de potênciaFP = P / S = cos(φ)PIC18F2520 / PIC18F4550O fator de potência apresentado em módulo pertence fisicamente ao intervalo de 0 a 1 e, em condições senoidais, corresponde ao cosseno da defasagem entre tensão e corrente. A rotina apenas protege a coerência numérica após a divisão P/S; não cria essa faixa por limitação funcional.
Potência reativa e natureza da cargaQ = sinal(Δφ) × S × √(1 − FP²)Arquitetura de fase / PIC18F4550A relação angular entre tensão e corrente permite classificar o reativo como indutivo ou capacitivo: corrente atrasada ou adiantada em relação à tensão. A rotina de magnitude forma |Q|; a informação de avanço/atraso de Δφ, identificada pela análise de fase, define o sinal e o tipo de carga apresentado na IHM.
Frequência e sequênciaFrequencia(); SeqFase()PIC18F4550A frequência é obtida pela medição do período com referência de passagem por zero e captura. A sequência é determinada por projeções seno/cosseno, atan2 e ordenação angular, permitindo distinguir ABC de ACB e sustentando a interpretação angular das fases.

Método de valor eficaz. O analisador não trata cada conversão como valor final: os canais são amostrados em alta cadência pelo Timer0, integrados em janelas do período de medição, repetidos, tratados contra extremos e calibrados. A potência ativa e a energia são obtidas da integração do produto instantâneo assinado V(t) × I(t). A documentação usa RMS para o valor eficaz produzido por essa cadeia de aquisição; isto não substitui a certificação metrológica do instrumento completo.

03 · GUIA DE LEITURA

Blocos funcionais do código

FUNÇÕES E FAIXAS DE LINHAS

PIC18F4550 · INICIALIZAÇÃO

O bloco principal configura interrupções, Timer0, ADC AN0–AN7 e Timer1. O temporizador sustenta as janelas de aquisição, e a captura sincronizada no período fundamenta a leitura de frequência.

PIC18F4550 · INTERRUPÇÃO TIMER0

O Timer0 conduz a amostragem em alta cadência. Em modo de energia, lê tensão e corrente das três fases, integra produtos instantâneos assinados e acumula energia. Nos modos de leitura, integra as janelas que alimentam os valores eficazes calibrados exibidos.

PIC18F4550 · FUNÇÕES Tensao() E PW()

As rotinas consolidam leituras por janelas repetidas, removem extremos e aplicam calibração. PW() integra a potência ativa da fase selecionada a partir de produtos sincronizados de tensão e corrente.

PIC18F2520 · I²C E FILA DE TELA

A interrupção SSP recebe os bytes enviados pelo mestre, monta o buffer de 17 bytes e coloca a mensagem na fila circular. O laço principal entrega cada frame ao seletor de tela.

PIC18F2520 · IHM E GRANDEZAS

A IHM possui campos para tensões fase-neutro, tensões de linha, correntes IA/IB/IC/IN, potência ativa, aparente, reativa e fator de potência por fase.

PIC18F4550 · ÂNGULO, SEQUÊNCIA E REATIVO

As rotinas de medição angular formalizam o frame I²C de 17 bytes, medem período/frequência e ordenam os ângulos das fases para indicar ABC ou ACB. Essa referência angular também permite diferenciar reativo indutivo de capacitivo quando o estado de avanço/atraso é mantido no frame da IHM.

04 · CÓDIGO-FONTE INTEGRAL

Programas disponibilizados para leitura

LINHAS ORIGINAIS · NOMES INTERNOS SUPRIMIDOS

CÓDIGO 01 · PIC18F4550Firmware de aquisição e processamento

Programa principal de aquisição. A referência interna ao arquivo de cabeçalho foi substituída por uma anotação pública; a lógica fonte permanece apresentada linha a linha.

1/////////////////////////////////////////////////////////
2/////////////////////////////////////////////////////////
3/////////////////////////////////////////////////////////
4///                      firmware_de_aquisicao///
5///               camposlh@gmail.com                  ///
6///                                                   ///
7///In�cio:21/10/2010                                  ///
8///                                                   ///
9///11/11/2010- Atualiza��o                            ///
10///21/02/2011- Ultima atualiza��o                      ///
11///                                                   ///
12/////////////////////////////////////////////////////////
13/////////////////////////////////////////////////////////
14/////////////////////////////////////////////////////////
15 
16// Cabeçalho de configuração do firmware de aquisição (PIC18F4550).
17//#include <PCF8583mod.c>
18#include <DS1307.C>
19//#include <PCF8574.c>
20#include <241025x4.c>
21/////////////////////////////////////
22//#build (reset=0x1000,interrupt=0x1008)
23//#org 0x0000,0x0FFF {} //Nothing will be at 0x0000,0x0FFF
24 
25//#use delay(clock=48M)
26 
27//build(reset = 0x0400)
28//#ORG 0x0000,0x0006
29//void jump_to_boot_control()   
30//{
31   //#asm GOTO 0x7D00 #endasm
32//}
33//#ORG 0x7D00,0x7FFF   
34//void BootLoad()
35//{
36//look for bootload
37//if not goto 0x400 which is main
38//}
39 
40//#build(reset=0x1, interrupt=0x8)          // Necessary for Bootloader
41//#ORG 0x0F00,0x0FFF {}                     // Necessary for Bootloader
42 
43//#define _bootloader
44//#include <USBbootLoaderM.h>
45 
46#define __USB_PIC_PERIF__ 1
47#DEFINE USB_HID_DEVICE  TRUE                               
48#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   
49#define USB_EP1_TX_SIZE    8      
50#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   
51#define USB_EP1_RX_SIZE    8 
52 
53#define USB_CON_SENSE_PIN PIN_C6
54 
55#pragma zero_ram                       //- RAM is zerada antes de iniciar
56#pragma case
57 
58#include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
59#include <usb_desc_hidm.h>   //USB Configuration and Device descriptors for this UBS device
60#include <usb.c>        //handles usb setup tokens and get descriptor reports
61#include <HDM64GS12m.c>
62#include <graphicsM.c>
63#include <string.h>
64#include <math.h>  
65#include <stdlib.h>
66 
67#define A74238          PIN_A4
68#define B74238          PIN_B2
69#define C74238          PIN_C2
70 
71#define BuzzerOn        output_low(A74238);output_high(B74238);output_low(C74238)
72#define BuzzerOff       output_low(A74238);output_low(B74238);output_high(C74238)
73#define ResetKeyB       output_high(PIN_C6)//D0//output_low(A74238);output_low(B74238);output_low(C74238)
74#define NoRKeyB         output_low(PIN_C6)//A74238);output_low(B74238);output_high(C74238)   
75//#define BuzzerOn        output_high(PIN_A4)//PIN_C6
76#define Clk74166        PIN_C7//D1//PIN_C1//PIN_C7
77#define S074166         input(PIN_E3)//B7)//D2)//input(PIN_E3)
78 
79 
80//int8 KeyPress(int8 &BDown,int8 &Key);
81int8 KeyPress(void);
82int8 KeyPressUp(void);
83void FaixaTexto(int8 x, int8 y,int8 t, int8 *texto, int1 Normal);//,int1 s);
84void AjusteRelogio(void);
85void MedVIPF(void);
86void MedPFP(void);
87float Tensao(int8 n);
88//unsigned int16 Tensao(int8 n);
89float PW(int8 n);
90void MedEnergia(void);
91void SelItens(int1 &updt,int1 &itm,int8 n);
92 
93//int8 BPress;int1 
94static int1 ClearTela=1,PotAt=0,MPrinc=0,WH=0;//,CalcK=0;//;//MV=0,MV2=0,MKWh=0,CalcK=0;
95//static int8 TcPrs=0;
96static unsigned int16 Vr;
97//static signed int16 Vm, Im;//V[100],
98static signed int32 PAtiva,ENERG;//1,ENERG2,ENERG3;
99static signed int32  RWs,Ws;//, RWs2,Ws3, RWs3;
100//static signed int16 RESTO;
101static unsigned int8 ns=0,nPA;
102char Prox[7]="Prox>>",dot2[2]=":";//,Ok[3]="OK",sl[2]="/";
103char Retorna[7]="<<Ret.",MenuP[8]="Menu P.";// Cancel[7]="Cancel",
104char Unid[4];
105 
106////////////////////////////////////////////////////////////////////////////////
107void SelItens(int1 &updt,int1 &itm,int8 n){//,int1 &r,int1 &g,int1 &inic, int1 nx){
108 
109       if(updt){
110            if(!itm){
111               if(n==0)FaixaTexto(80,42,6,Prox,1);//,1);
112               else FaixaTexto(80,42,7,MenuP,1);//escrev Prox invertido
113               
114               FaixaTexto(80,52,7,Retorna,0);//escrev Cancel Normal
115            }else{
116               if(n==0)FaixaTexto(80,42,6,Prox,0);
117               else FaixaTexto(80,42,7,MenuP,0);//escrev Prox normal
118               
119               FaixaTexto(80,52,7,Retorna,1);//escrev Cancel invertido
120            }   
121            updt=0;
122         }   
123}
124 
125//##################################################################################################################################################
126//#SEPARATE
127 
128void MedEnergia(void){ 
129char E[10];
130float EE;//1,EE2,EE3;
131 
132glcd_init(ON);
133WH=1;
134ENERG=0; RWs=0;Ws=0;//RESTO=0;//Vm=0;Im=0;
135 
136set_timer0(65533); //set_timer0(61588);//61588- 3Khz
137enable_interrupts(INT_TIMER0);        
138while(KeyPress()!=12);
139disable_interrupts(INT_TIMER0);  
140 
141while(RWs>1000){                  
142   RWs-=1000;              
143   Ws++;      
144}
145while(RWs<-1000){                  
146   RWs+=1000;              
147   Ws--;      
148}
149 
150EE=(float)Ws;
151 
152sprintf(E,"%7.1f",EE);
153glcd_text57(1,2,E,1,ON);
154 
155WH=0;
156delay_ms(5000);
157}
158 
159////////////////////////////////////////////////////////////////////////////////
160////////////////////////////////////////////////////////////////////////////////
161void MedPFP(void){
162float P[3],V, I,Pold[3]={999999.9,999999.9,999999.9},PKW;
163float PWt[3],PWold[3]={999999.9,999999.9,999999.9};
164float FP[3],FPold[3]={10.0,10.0,10.0};
165char Pn[7],msg[12],F[5];
166const char TP[3][3]="Pa","Pb","Pc";
167const char TFP[3][3]="Fa","Fb","Fc";
168 
169 
170int1 itm,updt=1;//,r,g,inic,nx;
171int8 i,kp;//,bd,k,kp,i,;
172 
173 
174glcd_init(ON);
175   while(TRUE){
176   
177      for(i=0;i<3;i++){
178         V=Tensao(i);
179         I=Tensao(i+3);
180         P[i]=(float)V*I;
181         if(abs(P[i]-Pold[i])>5){
182            strcpy(Unid,"VA"); 
183            PKW=P[i];
184            if(PKW>999.9){PKW/=1000.0;strcpy(Unid,"KVA");}
185            
186            glcd_rect(1,2+10*i,72,10+10*i,YES,0);
187            sprintf(Pn,"%5.1f",PKW);
188            strcpy(msg,TP[i]);strcat(msg,dot2);strcat(msg,Pn);strcat(msg,Unid);
189            glcd_text57(1,2+10*i,msg,1,ON); 
190            Pold[i]=P[i];   
191         }
192      ////////////////////////////////////////////////////////////////////////////////   
193       PWt[i]=PW(i);
194         //if(PWa!=PWaold){
195         if(abs(PWt[i]-PWold[i])>5){
196            strcpy(Unid,"W");
197            PKW=PWt[i];
198            if(PKW>999.9){PKW/=1000.0;strcpy(Unid,"KW");}
199            glcd_rect(1,32+10*i,72,40+10*i,YES,0);
200            sprintf(Pn,"%5.1f",PKW);
201            strcpy(msg,TP[i]);strcat(msg,dot2);strcat(msg,Pn);strcat(msg,Unid);
202            glcd_text57(1,32+10*i,msg,1,ON); 
203            PWold[i]=PWt[i];
204         }     
205         
206      ////////////////////////////////////////////////////////////////////////////////
207      
208      FP[i]=PWt[i]/P[i];
209      //if(FPa!=FPaold){
210      if(abs(FP[i]-FPold[i])>0.01){
211         glcd_rect(80,2+10*i,123,10+10*i,YES,0);
212         sprintf(F,"%4.2f",FP[i]);
213         strcpy(msg,TFP[i]);strcat(msg,dot2);strcat(msg,F);//strcat(msg,Unid);
214         glcd_text57(80,2+10*i,msg,1,ON); 
215         FPold[i]=FP[i];
216      }    
217     
218      ////////////////////////////////////////////////////////////////////////////////
219      
220         kp=KeyPress();
221         if (kp==10){itm=!itm;updt=1;}//{
222         else if(kp==12){
223            if(itm){MPrinc=0;return;}
224            else {MPrinc=1;return;}    
225         }
226         
227         
228//////////////////////////////////////////////////////////////////////////////// 
229         SelItens(updt,itm,1);
230         //SelItens(updt,itm,1,r,g,inic,nx);
231         //if (r==1)return;
232         
233         //SelItens(int1 &updt,int1 &itm,int8 n,int1 &r,int1 &g){
234         //if(updt){
235            //if(!itm){
236               //FaixaTexto(80,42,7,MenuP,1,1);//escrev Prox invertido
237               //FaixaTexto(80,52,7,Retorna,0,1);//escrev Cancel Normal
238            //}else{
239               //FaixaTexto(80,42,7,MenuP,0,1);//escrev Prox normal
240               //FaixaTexto(80,52,7,Retorna,1,1);//escrev Cancel invertido
241            //}   
242            //updt=0;
243         //}   
244         
245////////////////////////////////////////////////////////////////////////////////        
246       
247      }
248   }
249}
250////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
251//##################################################################################################################################################
252 
253////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
254//##################################################################################################################################################
255void MedVIPF(void){
256int1 itm=0,Cbc=0,Cac=0,Cab=0,inic=1,updt=1;//,r,g,nx;
257int8 i,j,kp;// bd,k,kp;
258char Vab[6];//, Vbc[6],Vca[6],Van[6],Vbn[6],Vcn[6],Vn[6],
259char Vn[6],Ia[6],msg[12];//,Ib[6],Ic[6],In[6];
260char TVn[10][4]="Van","Vbn","Vcn","Vab","Vbc","Vca","Ia","Ib","Ic","In";
261float Vx[4],Iold[4]={999.9,999.9,999.9},Vt[3], Vtold[3]={999.9,999.9,999.9},
262V[3]={0,0,0};
263 
264inicio:
265 
266glcd_init(ON); //limpa tela
267while(TRUE){
268      
269       for(i=0;i<4;i++){
270       
271         if(i<3){
272            strcpy(Unid,"V");
273            Vt[i]=Tensao(i);
274        
275            if(abs(Vt[i]-Vtold[i])>0.5||inic){
276               glcd_rect(1,2+10*i,62,10+10*i,YES,0);
277               sprintf(Vn,"%5.1f",Vt[i]);
278               strcpy(msg,TVn[i]);strcat(msg,dot2);strcat(msg,Vn);strcat(msg,Unid);
279               glcd_text57(1,2+10*i,msg,1,ON); 
280               Vtold[i]=Vt[i];
281               if(i==0){Cac=1;Cab=1;}
282               else if(i==1){Cbc=1;Cab=1;}
283               else if(i==2){Cac=1;Cbc=1;}
284       
285               
286               if(i==2){
287                  if(Cab){V[0]=sqrt(Vt[0]*Vt[0]+Vt[0]*Vt[1]+Vt[1]*Vt[1]);}
288                  if(Cbc){V[1]=sqrt(Vt[1]*Vt[1]+Vt[1]*Vt[2]+Vt[2]*Vt[2]);}
289                  if(Cac){V[2]=sqrt(Vt[0]*Vt[0]+Vt[0]*Vt[2]+Vt[2]*Vt[2]);}
290                  if(Cab||Cbc||Cac){
291                     for(j=0;j<3;j++){
292                        glcd_rect(1,32+10*j,62,40+10*j,YES,0);
293                        sprintf(Vab,"%5.1f",V[j]);
294                        strcpy(msg,TVn[j+3]);strcat(msg,dot2);strcat(msg,Vab);strcat(msg,Unid);
295                        glcd_text57(1,32+10*j,msg,1,ON);
296                     }
297                  }
298               }
299           
300            }
301         
302         }
303      
304      
305         strcpy(Unid,"A");
306         Vx[i]=Tensao(i+3);
307         if(abs(Vx[i]-Iold[i])>0.5||inic){
308            //glcd_rect(70,2,62,10,YES,0);
309            glcd_rect(70,2+10*i,123,10+10*i,YES,0);
310            sprintf(Ia,"%5.1f",Vx[i]);
311            strcpy(msg,TVn[i+6]);strcat(msg,dot2);strcat(msg,Ia);strcat(msg,Unid);
312            glcd_text57(70,2+10*i,msg,1,ON);
313            Iold[i]=Vx[i];
314         }
315      
316      
317        kp=KeyPress();
318         if (kp==10){itm=!itm;updt=1;}//{
319         else if(kp==12){
320            if(itm)return;//break;
321               else{
322                  MedPFP();
323                  updt=1;inic=1;
324                  if(MPrinc==1) return;//break;
325                  goto inicio; 
326               }
327            }
328         
329////////////////////////////////////////////////////////////////////////////////        
330       
331         
332////////////////////////////////////////////////////////////////////////////////  
333         //SelItens(updt,itm,0);
334         //SelItens(updt,itm,0,r,g,inic,nx);
335         SelItens(updt,itm,0);
336         
337         //if(inic==1)
338         //if(nx==1)MedPFP();
339         //if (r==1)return;
340         //if(g==1)goto inicio;
341         
342         
343         //inic=SelItens(updt,itm);
344         //if(inic)goto inicio;
345         //if (updt){
346            //if(!itm){
347               //FaixaTexto(70,42,6,Prox,1,1);//escrev Prox invertido
348               //FaixaTexto(70,52,6,MenuP,0,1);//escrev Cancel Normal
349               
350            //}else{
351               //FaixaTexto(70,42,6,Prox,0,1);//escrev Prox normal
352               //FaixaTexto(70,52,6,MenuP,1,1);//escrev Cancel invertido
353            //}
354            //updt=0;
355         //}
356      
357      if(i==3)inic=0;
358      
359      }  
360      
361   }
362}
363////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
364//##################################################################################################################################################
365 
366////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
367//##################################################################################################################################################
368 
369/*
370void AjusteRelogio(void){
371BYTE day,mth,year,dow,hour,min,sec;
372int1 updt=1;
373int8 itm=0,kp,nmb,dg=0;//,bd,k
374char sl[2],h[3],m[3],s[3],hora[12],d[3],mes[3],y[3],data[12];//;
375 
376 
377    
378ds1307_get_time(hour,min,sec);
379sprintf(h,"%02u",hour);sprintf(m,"%02u",min);sprintf(s,"%02u",sec);
380//strcpy(dot2,":");
381strcpy(hora,h);strcat(hora,dot2);strcat(hora,m);
382 
383ds1307_get_date(day,mth,year,dow);
384sprintf(d,"%02u",day);sprintf(mes,"%02u",mth);sprintf(y,"%02u",year);
385strcpy(sl,"/");strcpy(data,d);strcat(data,sl);strcat(data,mes);strcat(data,sl);strcat(data,y);
386 
387 
388while(TRUE){
389 
390   if(updt) {
391      glcd_init(ON);
392      glcd_text57(1,2,hora ,1,ON);
393      glcd_text57(1,12,data ,1,ON);
394      glcd_text57(5,55,Ok,1,ON);
395      //glcd_text57(80,55,Cancel,1,ON);
396      glcd_text57(80,55,MenuP,1,ON);
397      
398         if (itm==0){
399            FaixaTexto(1,2,2,h,1,1);
400         }
401         else if(itm==1){
402            FaixaTexto(1,2,2,h,0,1);
403            FaixaTexto(18,2,2,m,1,1);
404         }
405         else if(itm==2){
406            FaixaTexto(18,2,2,m,0,1);
407            FaixaTexto(1,12,2,d,1,1);
408         }
409         else if(itm==3){
410            FaixaTexto(1,12,2,d,0,1);
411            FaixaTexto(18,12,2,mes,1,1);
412         }
413         else if(itm==4){
414            FaixaTexto(18,12,2,mes,0,1);
415            FaixaTexto(35,12,2,y,1,1);
416         }
417         else if(itm==5){
418            FaixaTexto(35,12,2,y,0,1);
419            FaixaTexto(5,55,2,Ok,1,1);
420         }
421         else if(itm==6){
422            FaixaTexto(5,55,2,Ok,0,1);
423            //FaixaTexto(80,55,6,Cancel,1,1);
424            FaixaTexto(80,55,6,MenuP,1,1);
425         }
426     
427      updt=0;
428  
429      strcpy(hora,h);strcat(hora,dot2);strcat(hora,m);
430      strcpy(data,d);strcat(data,sl);strcat(data,mes);strcat(data,sl);strcat(data,y);
431     
432   }
433 
434   
435   //kp=KeyPress();
436   while (KeyPress()==0);
437   kp=KeyPress();
438   
439   //while(KeyPress()!=0) delay_ms(10);
440   
441   if (kp==10){ // Enter pressionado
442      //delay_ms(50);
443      itm++;
444      if (itm>6) itm=0;
445      updt=1;dg=0;
446   }
447   else if (kp==12){
448        if(itm==5){
449         ds1307_set_date_time(atoi(d),atoi(mes),atoi(y),atoi(dow),atoi(h),atoi(m),atoi(s));
450         return;
451         }//break;}
452         
453         if(itm==6)return;//break;
454   }
455   else if(kp!=0){      //if(kp!=10){//||kp!=12){
456         //delay_ms(100);
457         
458         if(kp==11)kp=0;
459         if(dg==0)nmb=kp;
460         else nmb=nmb*10+kp;
461         dg++;
462         if(dg>1)dg=0;
463         
464         if(itm==0)sprintf(h,"%02u",nmb);
465         else if(itm==1)sprintf(m,"%02u",nmb);
466         else if(itm==2)sprintf(d,"%02u",nmb);
467         else if(itm==3)sprintf(mes,"%02u",nmb);
468         else if(itm==4)sprintf(y,"%02u",nmb);
469         
470         updt=1;
471         
472      }
473      delay_ms(50);  
474      //kp=0;
475   //else if(kp==12){
476      //if(itm==5){
477         //ds1307_set_date_time(atoi(d),atoi(mes),atoi(y),atoi(dow),atoi(h),atoi(m),atoi(s));
478         //break;}
479      //if(itm==6)break;
480      
481   //}
482}
483 
484   //kp=KeyPress();
485   //if(kp==1||kp==2||kp==3||kp==4||kp==5||kp==6||kp==7||kp==8||kp==9||kp==11){
486//kp=KeyPress();
487}
488*/
489//##################################################################################################################################################
490////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
491int8 KeyPress(void){
492//static int8 Kold=0;
493int8 i,j,K=0,NL=5;//NL=4;//,NR=3;K=0,
494 
495ResetKeyB; 
496delay_us(500);
497NoRKeyB;
498 
499   for(i=0;i<NL;i++){   //NL=4
500      output_high(Clk74166);//delay_ms(1);
501         for(j=1;j<9;j++){ 
502         //for(j=1;j<12;j++){ 
503            output_low(Clk74166);
504            if(S074166)K=5-j+4*i;//K=9-j+4*i;//{
505               //K=9-j+3*i;
506               //if (K!=Kold)Kold=K;
507            //}
508            delay_us(500);
509            output_high(Clk74166);
510            delay_us(500);
511         }
512   }
513 
514return K;
515}
516//##################################################################################################################################################
517////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
518 
519//int8 KeyPressUp(void){
520//int8 i,bd,x;
521 
522//do{
523   //i=KeyPress();
524//}
525//while(x==0 || bd==1);
526 
527//return x;//i;
528 
529//}
530 
531//##################################################################################################################################################
532////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
533 
534void FaixaTexto(int8 x, int8 y,int8 t, int8 *texto, int1 Normal){//,int1 s){
535//Normal=1 fundo preto letras brancas
536//Normal=0 fundo branco letras pretas
537 
538//if (!s){
539   //glcd_rect(x+1,y+1,x+t*4+1,y+7,YES,Normal);
540   //glcd_text35(x+2,y+2, texto,!Normal);}
541//}
542//else {
543   //glcd_rect(x-1,y-1,x+t*6,y+8,YES,Normal);
544   //glcd_text57(x,y,texto,1,!Normal);
545   
546   glcd_rect(x,y,x+t*6,y+8,YES,Normal);
547   glcd_text57(x+1,y+1,texto,1,!Normal);
548   
549   
550   //}
551}
552 
553 
554   //FaixaTexto(1,9*n+1,15,IMenu[n].It,x[n]);
555   //FaixaTexto(3,9*(nold)+2,15,IMenu[nold].It,x[nold]);
556   
557   //glcd_rect(0,nold*9, 100, nold*9+8,YES,OFF);
558   //glcd_rect(0,yi, 100, yf,YES,ON);
559   //glcd_text57(2,9*(n)+1,IMenu[n].It,1,x[n]);
560   //glcd_text57(2,9*(nold)+1,IMenu[nold].It,1,x[nold]);  
561 
562//##################################################################################################################################################
563////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
564void MenuPrinc(int8 n){//////////////////////////////////////////////////////////////////////////////////////////////////////////***************************************************
565int8 yi,yf,x[7]={0,0,0,0,0,0,0},i;//x[7]={1,1,1,1,1,1,1},
566static int8 nold=0;
567 
568struct ItensdoMenu {char It[10];}
569IMenu[9]={{"Wh"},{"VIPFP"},{"Historico"},{"AC Remoto"},{"USB"},
570{"Impres"},{"D/Hora"}};
571 
572yi=n*9;yf=yi+8;
573 
574x[n]=1;//x[n]=0;
575if(ClearTela)glcd_init(ON);
576if((nold==0 && n==0||ClearTela) ){ 
577   for(i=0;i<7;i++) FaixaTexto(2,9*i+1,15,IMenu[i].It,x[i]);
578   ClearTela=0;
579}
580else{
581   FaixaTexto(2,9*n+1,15,IMenu[n].It,x[n]);
582   FaixaTexto(2,9*(nold)+1,15,IMenu[nold].It,x[nold]);
583}
584 
585nold=n;
586 
587}
588//##################################################################################################################################################
589////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
590void main(){
591//int8 i,j,k,l,m,n;
592static int1 Updt;
593static int8 item=0;//,bd,k;//i=0,k
594//char x[4];
595//char tela1[]="camposlh@gmail.com";
596//#bit T0CS=0xfd5.5
597 
598enable_interrupts(GLOBAL);       //Turn on interrupts
599 
600//setup_timer_0(RTCC_INTERNAL | RTCC_DIV_1);  
601setup_timer_0(T0_INTERNAL | T0_DIV_1); 
602setup_adc_ports(AN0_TO_AN7|VSS_VREF); 
603setup_adc(ADC_CLOCK_DIV_64);//setup_adc(ADC_CLOCK_DIV_32);//setup_adc(ADC_CLOCK_DIV_16);
604 
605//setup_ccp1(CCP_CAPTURE_RE);
606setup_ccp1(CCP_OFF);
607setup_ccp2(CCP_OFF);
608 
609//setup_timer_0(T0_INTERNAL|T0_DIV_1);   
610//setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);//83.33ns * 8=666.666ns por incremento em TIMER1
611setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);//83.33ns * 8=666.666ns por incremento em TIMER1
612 
613disable_interrupts(INT_TIMER0);  //Disable (Enable) INT_TIMER0
614disable_interrupts(INT_TIMER1);
615disable_interrupts(INT_TIMER2);
616disable_interrupts(INT_TIMER3);
617disable_interrupts(INT_EXT);
618 
619output_low(A74238);output_low(B74238);output_low(C74238);
620//
621//T0CS=1;
622//reset_cpu();
623 
624glcd_init(ON);
625 
626//while(TRUE){
627      //i=KeyPressUp();
628      //glcd_init(ON);
629      //sprintf(x,"%u",i); 
630      //glcd_text57(3,35,x,1,ON);//delay_ms(500); //glcd_update();
631      //delay_ms(150);
632//}
633 
634////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
635 
636 
637Updt=1;item=0;ClearTela=1;
638while(TRUE){
639 
640if (Updt){ MenuPrinc(item);Updt=0;};
641 
642   //if (KeyPress(&bd,&k)==8){
643   //k=KeyPress();
644   //if (KeyPress()==8){
645   
646      
647 
648   if(KeyPress()==8){
649      //i2c_start();
650      //i2c_write(0x66);
651      //i2c_write('x');
652      //i2c_write('B');
653      //i2c_stop(); 
654 
655 
656 
657 
658      i2c_start();
659      i2c_write(0x66);
660      //i2c_write(0x00);
661      i2c_write('A');//
662      i2c_write('n');
663      i2c_write('a');
664      i2c_write(' ');
665      i2c_write('C');
666      i2c_write('a');
667      i2c_write('r');
668      i2c_write('o');
669      i2c_write('l');
670      i2c_write('i');
671      i2c_write('n');
672      i2c_write('a');
673      i2c_write('-');
674      i2c_write('-');
675      i2c_write('-');
676      i2c_write('+');
677      //i2c_write('o');
678      //i2c_write('m');
679      i2c_stop(); 
680      
681      
682      delay_ms(500);
683      item++;
684      if(item>6)item=0;
685      Updt=1;
686   }else if (KeyPress()==2){ 
687      delay_ms(50);
688      if(item==0)item=7;
689      item--;
690      Updt=1;
691   }else if (KeyPress()==11){
692      if(item==0) MedEnergia();
693      else if(item==1)MedVIPF();
694      else if(item==2);
695      else if(item==3);
696      else if(item==4);
697      else if(item==5);
698      else if(item==6);//AjusteRelogio();;
699 
700      //switch(item){
701         //case 0:
702                  //MedEnergia();
703                  //break;
704         //case 1:
705                  //MedVIPF();
706                  //break;
707         //case 2:
708                  //break;                  
709         //case 3:
710                  //break;
711         //case 4:
712                  //break;
713         ///case 5:
714                  //break;
715         //case 6:
716                  //AjusteRelogio();
717                  //break;
718      //}
719      Updt=1;ClearTela=1;
720 }   
721   
722 
723   }
724//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////  
725}
726 
727 
728 
729//##################################################################################################################################################
730////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
731 
732#int_TIMER0 HIGH
733void TIMER0_isr(void){
734static int8 n=0;
735static signed int16 Vm1, Im1,Vm2, Im2,Vm3, Im3;//V[100],
736 
737if(WH)set_timer0(45585);//600Hz   45570-297Hz
738else set_timer0(61588);//61588- 3Khz
739 
740//set_timer0(45585);//600Hz   45570-297Hz
741//set_timer0(61588);//61588- 3Khzi
742 
743if(WH) {
744output_high(PIN_B1);
745 
746//set_adc_channel(4);
747//delay_us(15);
748//Im=read_adc()-511;
749 
750//set_adc_channel(0);
751//delay_us(15);
752//Vm=read_adc()-511;
753 
754 
755//ENERG+=(signed int32)Vm*Im;
756 
757//set_adc_channel(5);
758//delay_us(15);
759//Im=read_adc()-511;
760 
761//set_adc_channel(1);
762//delay_us(15);
763//Vm=511-read_adc();
764 
765 
766//ENERG+=(signed int32)Vm*Im;
767 
768//set_adc_channel(6);
769//delay_us(15);
770//Im=read_adc()-511;
771 
772//set_adc_channel(2);
773//Vm=read_adc()-511;
774 
775//ENERG+=(signed int32)Vm*Im;
776 
777set_adc_channel(0);
778delay_us(5);
779Vm1=read_adc()-511;
780 
781set_adc_channel(4);
782delay_us(5);
783Im1=read_adc()-511;
784 
785set_adc_channel(1);
786delay_us(5);
787Vm2=read_adc()-511;
788 
789set_adc_channel(5);
790delay_us(5);
791Im2=read_adc()-511;
792 
793set_adc_channel(2);
794delay_us(5);
795Vm3=read_adc()-511;
796 
797set_adc_channel(6);//////////////////////////////////////
798delay_us(5);
799Im3=read_adc()-511;
800 
801set_adc_channel(2);
802delay_us(5);
803Vm3+=read_adc()-511;
804 
805set_adc_channel(5);
806delay_us(5);
807Im2+=read_adc()-511;
808 
809set_adc_channel(1);
810delay_us(5);
811Vm2+=read_adc()-511;
812 
813set_adc_channel(4);
814delay_us(5);
815Im1+=read_adc()-511;
816 
817set_adc_channel(0);
818delay_us(5);
819Vm1+=read_adc()-511;
820 
821 
822Vm1/=2;Im1/=2;Vm2/=2;Im2/=2;Vm3/=2;
823//RESTO+=Vm1%2+Im1%2+Vm2%2+Im2%2+Vm3%2;
824 
825//if(Vm1>0)RESTO+=Vm1%2;else RESTO-=Vm1%2;
826 
827//if(Im1>0)RESTO+=Im1%2;else RESTO-=Im1%2;
828 
829//if(Vm2>0)RESTO+=Vm2%2;else RESTO-=Vm2%2;
830 
831//if(Vm3>0)RESTO+=Vm3%2;else RESTO-=Vm3%2;
832 
833 
834ENERG+=(signed int32)Vm1*Im1+Vm2*Im2+Vm3*Im3;
835 
836 if (n>100){ // if (n>200){
837   output_high(PIN_B2);
838         Ws+=ENERG/1000;     //SVIi=SVI/1000;  
839////////////////////////////////////////////////////////////////////////////////         
840         if(ENERG<0)RWs-=ENERG%1000;
841         else RWs+=ENERG%1000;
842         
843         
844////////////////////////////////////////////////////////////////////////////////         
845         //RWs+=ENERG%1000;    //SVIf=SVI%1000;
846         ENERG=0;//ENERG2=0;ENERG3=0;n=0;
847         //if(R>2000)RESTO++;
848         //while (RESTO>2000){Ws++;RESTO-=2000;}
849         
850         n=0;
851   output_low(PIN_B2);         
852 }        
853 
854 n++;         
855   
856 output_low(PIN_B1);        
857 
858}
859else if(PotAt){
860 
861   set_timer0(45585);         //600Hz
862   
863   set_adc_channel(nPA+4);
864   delay_us(5);
865   Im1=read_adc()-511;
866   
867   set_adc_channel(nPA);
868   delay_us(5);
869   Vm1=read_adc()-511;
870   
871   set_adc_channel(nPA+4);
872   delay_us(5);
873   Im1+=read_adc()-511;
874   
875   //Im1>>=1; 
876   Im1/=2;
877   //if (Vm>511)Vm-=511;else Vm=511-Vm; 
878   //if (Im>511)Im-=511;else Im=511-Im; 
879   
880   //Vm1-=511;
881   //Im1-=511;
882   
883   PAtiva+=(signed int32)Vm1*Im1;
884   ns++;
885}
886else {
887   //V[ns]=read_adc();
888   Vm1=read_adc();
889   if (Vm1>511)Vm1-=511;else Vm1=511-Vm1; 
890   //if (Im>511)Im-=511;else Im=511-Im; 
891   Vr+=(unsigned int16)Vm1;
892   ns++;
893}
894 
895 
896 
897 
898 
899}
900 
901///##################################################################################################################################################
902////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
903//unsigned int16 Tensao(int8 n){
904float Tensao(int8 n){
905//signed int32 Tensao(int8 n){
906//n=0; VAN  //set_adc_channel(0);
907//n=1; VBN  //set_adc_channel(1);
908//n=2; VCN  //set_adc_channel(2);
909 
910//n=3; IA   //set_adc_channel(4);
911//n=4; IB   //set_adc_channel(5);
912//n=5; IC   //set_adc_channel(6);
913//n=6; IN   //set_adc_channel(7);
914int8 i;//,j=0;//,T;
915float Vrms,soma;// Irms=0.0, Periodo=0.0;
916//signed int16 Vrms, soma;
917 
918 
919//disable_interrupts(INT_TIMER1);
920PAtiva=0;
921if (n<3)set_adc_channel(n);
922else set_adc_channel(n+1);
923 
924soma=0.0;
925//soma=0;
926 
927 
928for(i=0;i<3;i++){
929   //for(j=0;j<100;j++)V[j]=0;   
930   Vr=0;
931   ns=0;
932   
933   set_timer0(65533);                  //set_timer0(61588);//61588- 3Khz
934   enable_interrupts(INT_TIMER0); 
935   while(ns<100);                      //MVOLT);//restart_wdt();//  
936   disable_interrupts(INT_TIMER0);  
937   
938  
939      Vrms=(float)Vr;
940      //Vrms=Vr;
941      soma+=Vrms;
942}   
943   Vrms=soma/3.0;
944   Vrms/=1000.0;
945   //Vrms=soma/3;
946   //Vrms/=1000;//1 digito depois da virgula
947   
948   if (n<3)Vrms*=8.6044;//9.1898;
949   else Vrms*=4.385957;//6.1842;//6.9882;
950   //if (n<3)Vrms*=9;
951   //else Vrms*=7;   
952   
953//enable_interrupts(INT_TIMER1);   
954   return Vrms;
955 
956}
957 
958//##################################################################################################################################################
959////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
960 
961float PW(int8 n){
962//int8 j;
963//disable_interrupts(INT_TIMER1);
964PotAt=1;
965PAtiva=0;
966//for(j=0;j<100;j++){V[j]=0;I[j]=0;}
967  //Vm=0;Im=0;
968   nPA=n;
969   ns=0;
970   enable_interrupts(INT_TIMER0); 
971      //set_timer0(65533);                  //set_timer0(61588);//61588- 3Khz
972      set_timer0(45585);   
973      while(ns<100);                      //MVOLT);//restart_wdt();//  
974   disable_interrupts(INT_TIMER0);  
975 
976   PAtiva/=10000.0;
977   PAtiva/=1.159;
978   PAtiva*=38.9032;//37.05228;//61.655;
979   //PAtiva*=0.8478;
980   //PAtiva+=0.1115;
981   //if (n<3)Vrms*=9.1898;
982   //else Vrms*=6.9882;
983   
984   PotAt=0;
985   
986   //enable_interrupts(INT_TIMER1); 
987   
988   return (float)PAtiva;
989 
990 
991}
992 
993 
994//#int_TIMER1
995//void TIMER1_isr(void){
996//int8 bd,k;
997 
998//set_timer0(35536);//20ms
999 
1000 
1001 
1002 
1003//TcPrs=KeyPress(bd,k);
1004//}
1005 
1006 
1007 
1008/////////////////////////////////////////////////////////////////////////////////
1009 
1010 
CÓDIGO 02 · PIC18F2520Firmware de IHM e display gráfico

Programa de interface: display GLCD, menus e recepção I²C. O projeto seleciona PIC18F2520 e configura I²C escravo no endereço 0x66.

1#include <DRIVER.h>
2#include <HDM64GS12X.c>
3#include <graphicsX.c>
4#include <string.h>
5#INCLUDE <stdlib.h>
6 
7 
8#pragma zero_ram                       //- RAM is zerada antes de iniciar
9#pragma case
10 
11void FaixaTexto(int8 x, int8 y,int8 t, int8 *texto, int1 Normal);
12void MenuPrinc(int8 n,int8 *comando);
13void PotenciaFP(int8 campo,int8 *comando);
14void TensaoCor(int8 campo,int8 *comando);
15void SelTel(int8 *comando);
16void SetupEnergia(int8 campo,int8 *comando);
17 
18static int8 ClearTela,cents,decs,seg,min,nm=0,NVoltas,retorno=0;//,SendOk=0;
19static int8 state,incoming,address,buffer[0x11];//17 //,comando,dato,cuenta,address, 
20static char dot2[2]=":";//,Ok[3]="OK",sl[2]="/";Prox[7]="Prox>>",
21static char mensagens[10][17];
22float Kd;
23 
24/////////////////////////////////////////////////////////////////////////////////////
25ResultadoEnerg(int8 campo,int8 *comando){
26char msg[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},cabec[20];
27char Unid[5]={0,0,0,0,0};
28int8 i,j,KP;
29//int16 tempo;
30float TempoT,PAtiva,EAtiva,VA,IA,VB,IB,VC,IC,PapA,PapB,PapC,Pap,FP,Erro;
31 
32glcd_init(ON);
33 
34//do{
35  // while(j!=nm){
36      //if(j>9)j=0;
37      //j++;
38   //}
39//}while(mensagens[j][1]!=6);
40 
41//mensagens[j][1]!=6
42 
43//j=0;
44//while(mensagens[j][0]!=5 && mensagens[j][1]!=1){j++;if(j>9)j=0;}
45//while(mensagens[j][0]!=5 && mensagens[j][1]!=2){j++;if(j>9)j=0;}
46 
47//while(mensagens[j][0]!=5 && mensagens[j][1]!=3){j++;if(j>9)j=0;}
48 
49//while(mensagens[j][0]!=5 && mensagens[j][1]!=4){j++;if(j>9)j=0;}
50//while(mensagens[j][0]!=5 && mensagens[j][1]!=5){j++;if(j>9)j=0;}
51//while(mensagens[j][0]!=5 && mensagens[j][1]!=6){j++;if(j>9)j=0;}
52 
53 
54 
55for(i=2;i<13;i++)msg[i-2]=mensagens[0][i];//comando[i]; 
56EAtiva=atof(msg);
57EAtiva*=0.6893;
58EAtiva+=121.68;
59 
60//EnAt*=0.2368;
61//EnAt-=2.1948;
62//EAtiva*=0.9608;
63//EAtiva+=42.876;
64//EAtiva*=3.0;
65//EAtiva*=1.1;
66 
67//EAtiva*=0.9139;
68//EAtiva+=116.28;
69 
70 
71strcopy(cabec,"En: ");
72sprintf(msg,"%5.2f",EAtiva);
73strcopy(Unid,"Ws");
74strcat(msg,Unid);
75strcat(cabec,msg);
76//glcd_text57(1,5,cabec,1,1);
77glcd_text35(1, 5,cabec, 1);
78 
79 
80TempoT=(float)min;//(min*60+seg);
81TempoT*=60.0;
82TempoT+=(float)seg;
83TempoT+=(float)decs/10.0;
84TempoT+=(float)cents/100.0;
85TempoT-=0.1;
86 
87strcopy(cabec,"T: ");
88sprintf(msg,"%5.2f",TempoT);
89strcopy(Unid,"s");
90strcat(msg,Unid);
91strcat(cabec,msg);
92//glcd_text57(50,5,cabec,1,1);
93glcd_text35(80, 5,cabec, 1);
94 
95PAtiva=EAtiva/TempoT;
96 
97 
98sprintf(msg,"%5.2f",PAtiva);
99strcopy(cabec,"P Ativa:");
100strcopy(Unid," W");
101strcat(msg,Unid);
102strcat(cabec,msg);
103//glcd_text57(1,25,cabec,1,1);
104glcd_text35(1,12,cabec,1);
105 
106for(i=2;i<13;i++)msg[i-2]=mensagens[1][i];
107VA=atof(msg);
108 
109for(i=2;i<13;i++)msg[i-2]=mensagens[2][i];
110IA=atof(msg);
111 
112PapA=VA*IA;
113 
114for(i=2;i<13;i++)msg[i-2]=mensagens[3][i];
115VB=atof(msg);
116 
117for(i=2;i<13;i++)msg[i-2]=mensagens[4][i];
118IB=atof(msg);
119 
120PapB=VB*IB;
121 
122for(i=2;i<13;i++)msg[i-2]=mensagens[5][i];
123VC=atof(msg);
124 
125for(i=2;i<13;i++)msg[i-2]=mensagens[6][i];
126IC=atof(msg);
127 
128PapC=VC*IC;
129 
130Pap=PapA+PapB+PapC;
131 
132strcopy(cabec,"P Apar.:");
133sprintf(msg,"%5.2f",Pap);
134strcopy(Unid," VA");
135strcat(msg,Unid);
136strcat(cabec,msg);
137//glcd_text57(1,35,cabec,1,1);
138glcd_text35(1,19,cabec,1);
139 
140FP=PAtiva/Pap;
141if(FP>1.0)FP=1.0;
142strcopy(cabec,"F Pot. :");
143sprintf(msg,"%5.2f",FP);
144//strcopy(Unid," VA");
145//strcat(msg,Unid);
146strcat(cabec,msg);
147//glcd_text57(1,35,cabec,1,1);
148glcd_text35(1,26,cabec,1);
149 
150strcopy(cabec,"KD/KE  :");
151sprintf(msg,"%5.3f",Kd);
152strcat(cabec,msg);
153glcd_text35(1,33,cabec,1);
154 
155strcopy(cabec,"Num.V/P:");
156sprintf(msg,"%u",NVoltas);
157strcat(cabec,msg);
158glcd_text35(80,33,cabec,1);
159 
160Erro=EAtiva;
161Erro/=((Kd*3600.0)*(float)(NVoltas));
162Erro-=1.0;
163Erro*=100.0;
164//Erro=((Kd*3600.0)*(float)(NVoltas));
165 
166strcopy(cabec,"Erro(%):");
167sprintf(msg,"%4.1f",Erro);
168strcat(cabec,msg);
169glcd_text57(1,43,cabec,1,1);
170//Erro=(Kd*3600.0)*(float)(NVoltas);
171//Erro/=EAtiva;
172 
173 
174nm=0;
175while(TRUE) {   
176    while(j!=nm){
177            j++;
178            if(j>9)j=0; 
179   }   
180   
181   if(j>0){
182   
183      for(i=2;i<13;i++)msg[i-2]=mensagens[j-1][i];
184      KP=atoi(msg);
185      
186      if(KP==12){
187         retorno=0;
188         return;
189      }
190      else if(KP==16){
191         retorno=222;
192         return;   
193      }      
194      
195   }
196   
197   
198   //if(KP==12){
199      //retorno=0;
200      //return;
201      //}
202   //else if(KP==16){
203      //retorno=222;
204      //return;   
205   //}
206 
207 
208 
209   //if(j>6){
210      //disable_interrupts(INT_TIMER0);     
211      //ResultadoEnerg(mensagens[j][1],mensagens[j]);  
212      //return;
213   //}
214   //delay_ms(1);
215 
216}
217 
218 
219 
220}
221////////////////////////////////////////////////////////////////////////////////
222void TelaMed(void){
223char des[2]={0,0},tempo[13],t[3];
224int8 i,j=0,l,segOld=10,minOld=10;
225set_timer0(15539);  //10ms
226enable_interrupts(INT_TIMER0);     
227decs=0,seg=0;min=0;
228 
229glcd_init(ON);
230 
231i=0;
232strcpy(tempo,"Tempo:  :");
233glcd_text35(2,58,tempo,1);
234//glcd_text57(2,50,tempo,1,1);  
235strcpy(des,"&");
236glcd_text57(30+i*5,30,des,1,1); 
237 
238nm=0;
239 
240while(TRUE){
241 
242 
243 
244for(l=0;l<200;l++){
245   while(j!=nm){
246            //if (mensagens[j][0]==5){
247               //disable_interrupts(INT_TIMER0);     
248               //ResultadoEnerg(mensagens[j][1],mensagens[j]);
249            //}
250            j++;
251            if(j>9)j=0; 
252   }   
253   if(j>6){
254      disable_interrupts(INT_TIMER0);     
255      ResultadoEnerg(mensagens[j][1],mensagens[j]);  
256      return;
257   }
258   delay_ms(1);
259}
260 
261if(segOld!=seg){
262glcd_rect(38,58,48,63,YES,0);
263sprintf(t,"%02u",seg);
264//glcd_text57(62,50,t,1,1);  
265glcd_text35(38,58,t,1);
266segOld=seg;
267}
268 
269if(minOld!=min){
270glcd_rect(26,58,33,63,YES,0);
271sprintf(t,"%02u",min);
272glcd_text35(26,58,t,1);
273//glcd_text57(43,50,t,1,1);  
274minOld=min;
275}
276 
277 
278if(i>10){i=0;glcd_rect(30,30,100,48,YES,0);}
279glcd_text57(30+i*5,30,des,1,1);  
280i++;
281 
282//if(state>17);
283//delay_ms(300);
284 
285}
286 
287//disable_interrupts(INT_TIMER0);     
288}
289////////////////////////////////////////////////////////////////////////////////
290void SetupEnergia(int8 campo,int8 *comando){
291//int1 m;
292static int1 CA;
293int8 i,j,l,m,x,mold=0;
294char TPn[6][18]="ID","Carga At","Kd/Ke","Num. V/P","Tempo Est.","INICIAR";
295char msg[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},Unid[5]={0,0,0,0,0};
296char temp[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
297 
298for(i=0;i<13;i++)msg[i]=comando[i];
299l=strlen(TPn[campo])+1;
300strcpy(msg,TPn[campo]);
301 
302if (campo==1){
303   if(comando[2]==0x31){
304      //x=strlen(TPn[4])+1;
305      strcpy(temp,TPn[4]);
306      strcat(temp,dot2);
307      glcd_text57(1,42,temp,1,1);   
308      //CA=1;
309      }
310   else{
311      glcd_rect(1,42,70,49,YES,0);
312      //strcpy(temp,"                 ");
313      //glcd_text57(1,42,temp,1,1);   
314      //CA=0;
315   }
316}
317 
318if(campo<4){
319   strcat(msg,dot2);//msg[l-1]=':';//
320   glcd_text57(1,2+10*campo,msg,1,1);
321 
322}
323 
324if(campo==1){
325   if(comando[2]==0x31){
326      comando[2]='S';comando[3]='i';comando[4]='m';
327   }else {comando[2]='N';comando[3]='~';comando[4]='o';}
328}
329else if(campo==2){
330   for(i=2;i<13;i++)msg[i-2]=comando[i]; 
331   Kd=(float)atol(msg);
332   Kd/=1000.0;
333   sprintf(msg,"%5.2f",Kd);
334   for(i=2;i<10;i++)comando[i]=msg[i-2];
335}
336 
337   if(campo<4){
338      //if(campo==3)NVoltas=atof(comando[i]);
339      
340      for(i=2;i<13;i++)msg[i-2]=comando[i];
341      
342      if(campo==3)NVoltas=atoi(msg);
343      
344      
345      
346      if (msg[10]=='a') m=1;
347      else m=0;
348      msg[10]=0x00;
349            
350      FaixaTexto(l*6,2+10*campo,18-l,msg,m);
351    } 
352   else if(campo==5){
353      if (msg[12]=='a') m=1;
354      else m=0;
355      msg[10]=0x00;
356               
357      FaixaTexto(40,52,7,msg,m);
358      mold=0;
359   }
360   else if(campo==6){
361      
362      TelaMed();
363      if(retorno==222)return;
364   }
365  
366}
367 
368 
369/////////////////////}///////////////////////////////////////////////////////////
370void FaixaTexto(int8 x, int8 y,int8 t, int8 *texto, int1 Normal){//,int1 s){
371//Normal=1 fundo preto letras brancas
372//Normal=0 fundo branco letras pretas
373 
374   glcd_rect(x,y,x+t*6,y+8,YES,Normal);
375   glcd_text57(x+1,y+1,texto,1,!Normal);
376   
377}
378////////////////////////////////////////////////////////////////////////////////
379 
380////////////////////////////////////////////////////////////////////////////////
381void MenuPrinc(int8 n,int8 *comando){
382int8 yi,yf,x[7]={0,0,0,0,0,0,0},i;//x[7]={1,1,1,1,1,1,1},
383static int8 nold=0;
384char msg[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
385 
386struct ItensdoMenu {char It[10];}
387IMenu[9]={{"Wh"},{"VIPFP"},{"Historico"},{"AC Remoto"},{"USB"},
388{"Impres"},{"D/Hora"}};
389 
390 
391 
392i=0;
393while (comando[i+2]!=0x00){
394     msg[i]=comando[i+2];
395      i++;
396   }
397 
398if(msg[0]=='C')ClearTela=1;
399 
400 
401yi=n*9;yf=yi+8;
402 
403x[n]=1;//x[n]=0;
404//if(ClearTela)glcd_init(ON);
405 
406if((nold==0 && n==0)||ClearTela==1 ){ 
407//if(nold==0 && n==0){ 
408   for(i=0;i<7;i++) FaixaTexto(2,9*i+1,15,IMenu[i].It,x[i]);
409   ClearTela=0;
410}
411else{
412   FaixaTexto(2,9*(nold)+1,15,IMenu[nold].It,x[nold]);
413   FaixaTexto(2,9*n+1,15,IMenu[n].It,x[n]);
414   
415   //ClearTela=0;
416}
417 
418nold=n;
419 
420}
421 
422////////////////////////////////////////////////////////////////////////////////
423void PotenciaFP(int8 campo,int8 *comando){   
424int8 i,j,l;
425char TPn[12][4]="Pa","Pb","Pc","Sa","Sb","Sc","Qa","Qb","Qc","fpa","fpb","fpc";
426char msg[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},Unid[5]={0,0,0,0,0};
427 
428//static int1 ClearD=1; 
429 
430l=strlen(TPn[campo])+1;
431strcpy(msg,TPn[campo]);strcat(msg,dot2);
432 
433   i=0;j=0;
434   while (comando[i+2]!=0x00){
435      if(comando[i+2]>=0x41&&comando[i+2]<=0x5A){
436      Unid[j]=comando[i+2];
437      j++;}
438      else msg[l+i]=comando[i+2];
439      i++;
440   }
441   
442   l=strlen(Unid);
443   if(campo<6){
444      
445      //glcd_rect(x,y,x+t*6,y+8,YES,Normal);
446      //glcd_text57(x+1,y+1,texto,1,!Normal);
447      glcd_rect(1,2+10*campo,65,9+10*campo,YES,0);
448      glcd_text57(1,2+10*campo,msg,1,ON);
449      //strcpy(Unid,"kvas");
450      
451      //if (l<4)
452      glcd_text35(50, 2+10*campo,Unid, 1);
453      //else glcd_text35(40, 2+10*campo,Unid, 1);
454 
455   }
456   else {
457      glcd_rect(65,2+10*(campo-6),125,9+10*(campo-6),YES,0);
458      glcd_text57(65,2+10*(campo-6),msg,1,ON);
459      //glcd_text35(115, 2+10*(campo-6),Unid, 1);
460      
461      if (l<4)glcd_text35(115, 2+10*(campo-6),Unid, 1);
462      else glcd_text35(110, 2+10*(campo-6),Unid, 1);
463 
464   }
465   
466 
467 
468 
469 
470}
471////////////////////////////////////////////////////////////////////////////////
472void TensaoCor(int8 campo,int8 *comando){
473int8 i,j,l;
474char TVn[12][4]="Van","Vbn","Vcn","Vab","Vbc","Vca","Ia","Ib","Ic","In"," f","SF";
475char msg[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},Unid[5]={0,0,0,0,0};
476 
477 
478//if (ClearD)glcd_init(ON);
479//ClearD=0;
480 
481l=strlen(TVn[campo])+1;
482 
483//if(campo==0)glcd_init(ON);//inic=1;
484 
485strcpy(msg,TVn[campo]);strcat(msg,dot2);
486 
487   i=0;j=0;
488   while (comando[i+2]!=0x00){
489      if(comando[i+2]>=0x41&&comando[i+2]<=0x5A){
490      Unid[j]=comando[i+2];
491      j++;}
492      else msg[l+i]=comando[i+2];
493      i++;
494   }
495   
496   l=strlen(Unid);
497 
498 
499 
500   //i=0;
501   //while (comando[i+2]!=0x00){
502   //   msg[l+i]=comando[i+2];
503   //  i++;
504   //}
505   
506   //glcd_line(x1, y1, x2, y2, color);
507   //glcd_line( 65,1,65,64,1);
508   //glcd_line( 67,1,67,64,1);
509   
510   if(campo<6){
511      
512 
513      //glcd_rect(1,2+10*campo,65,9+10*campo,YES,0);
514      glcd_rect(1,2+10*campo,63,9+10*campo,YES,0);
515      glcd_text57(1,2+10*campo,msg,1,ON);
516      glcd_text35(56, 2+10*campo,Unid, 1);
517 
518   }
519   else {
520      glcd_rect(70,2+10*(campo-6),125,9+10*(campo-6),YES,0);
521      glcd_text57(70,2+10*(campo-6),msg,1,ON);
522      
523      //if(campo<10)
524      if(campo!=11)glcd_text35(119, 2+10*(campo-6),Unid, 1);
525      else {
526         strcat(msg,Unid);
527         glcd_text57(70,2+10*(campo-6),msg,1,ON);}
528      
529      //else glcd_text35(110, 2+10*(campo-6),Unid, 1);
530      //if (l<4)glcd_text35(115, 2+10*(campo-6),Unid, 1);
531      //else glcd_text35(110, 2+10*(campo-6),Unid, 1);
532 
533   }
534   
535}
536 
537////////////////////////////////////////////////////////////////////////////////
538void SelTel(int8 *comando){
539int8 tela, campo;
540static int8 TelaOld=0;
541static int8 i=0;
542 
543//for(i=0;i<=nm;i++){
544 
545   tela=comando[0];//-0x30;
546   campo=comando[1];//-0x30;
547   
548   //tela=mensagens[i][0];
549   //campo=mensagens[i][1];
550   
551   if(TelaOld!=tela)glcd_init(ON);
552   TelaOld=tela;
553   
554      switch(tela){
555         case 1:  //glcd_init(ON);
556                  MenuPrinc(campo,comando);//mensagens[i]);//
557                  break;
558         case 2:  //glcd_init(ON);
559                  TensaoCor(campo,comando);
560                  break;
561         case 3:  PotenciaFP(campo,comando);             
562                  break;
563         case 4:  SetupEnergia(campo,comando);
564                  break;
565         //case 5:  ResultadoEnerg(campo,comando);
566                 //break;
567                  
568                  
569      }
570      
571   //}
572  // nm=0;
573   
574   
575}
576////////////////////////////////////////////////////////////////////////////////
577void main(){
578static int8 j=0;
579//char msg[17]="8884567890123456";
580//int1 Updt=1;
581clear_interrupt(INT_SSP);
582enable_interrupts(INT_SSP);
583enable_interrupts(GLOBAL); 
584 
585setup_timer_0(RTCC_INTERNAL | RTCC_DIV_2);   
586disable_interrupts(INT_TIMER0);  
587 
588glcd_init(ON);
589ClearTela=1;
590 
591   while(TRUE){
592      //delay_ms(5);
593     // if(nm>0){
594        // nm--;
595         //SelTel(mensagens[0]);
596         //for(j=0;j<nm;j++)strcpy(mensagens[j],mensagens[j+1]);
597      //}  
598      
599      //if(j<nm){
600      if(j!=nm){
601         SelTel(mensagens[j]);
602         j++;
603         if(j>9)j=0;
604         
605      }   
606      //}
607      
608   }
609 
610}
611 
612 
613////////////////////////////////////////////////////////////////////////////////
614#INT_SSP HIGH
615void ssp_interupt ()
616{
617   //BYTE  state,incoming;
618   
619   int8 i;
620   
621   state = i2c_isr_state();
622   
623   if(state <0x80)                     //Master is sending data
624   {
625      incoming = i2c_read();
626      
627      if(state == 1)                     //First received byte is address
628         address = incoming;
629      //if(state == 2)                     //Second received byte is data
630         //buffer[address] = incoming;
631      //if(state==3)incoming=i2c_read();
632      
633      //if(state == 2)                     //Second received byte is data
634         //buffer[address] = incoming;
635         
636      if(state>1&&state<17)buffer[state-2]=incoming;//buffer[address]=incoming;
637      //state=1;
638         //{buffer[state-1]=incoming; //&&state<17){
639       //{buffer[state-2]=incoming; //&&state<17){  
640         //i++;
641         
642      //}   
643      
644   }
645   if(state== 0x80)                     //Master is requesting data
646   {
647      //i2c_write(buffer[address]);
648      //if(SendOk){
649      
650      //i2c_write(0x22);//SendOk=0;}
651      
652      //i2c_write("K");
653      
654   }
655  
656 if(state>=17){ 
657   //strcpy(mensagens[nm],buffer);
658   for(i=0;i<17;i++)mensagens[nm][i]=buffer[i];
659   
660   //for
661   nm++;   
662   if(nm>9)nm=0;
663 }
664 
665 clear_interrupt(INT_SSP);   
666}
667 
668#int_TIMER0 HIGH                                                                                     
669void  TIMER0_isr(void){
670set_timer0(15539);  //10ms
671 
672cents++;
673if(cents>9){decs++;cents=0;}
674if(decs>9){seg++;decs=0;}
675if(seg>59){min++;seg=0;}
676if(min>59)min=0;
677 
678 
679 
680}
681 
CONFIGURAÇÃO · PIC18F2520Cabeçalho de temporização, fusíveis e I²C

Configuração de clock a 20 MHz, prioridades de interrupção e barramento I²C escravo em C4/C3.

1#include <18F2520.h>
2#DEVICE HIGH_INTS=TRUE
3 
4#FUSES NOWDT                    //No Watch Dog Timer
5#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
6#FUSES H4                       //High speed osc with HW enabled 4X PLL
7#FUSES FCMEN                    //Fail-safe clock monitor enabled
8#FUSES IESO                     //Internal External Switch Over mode enabled
9#FUSES PUT                      //Power Up Timer
10#FUSES BROWNOUT                 //brownout reset
11#FUSES BORV20                   //Brownout reset at 2.0V
12#FUSES NOPBADEN                 //PORTB pins are configured as analog input channels on RESET
13#FUSES NOLPT1OSC                //Timer1 configured for low-power operation
14#FUSES MCLR                     //Master Clear pin enabled
15#FUSES STVREN                   //Stack full/underflow will cause reset
16#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
17#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
18#FUSES NODEBUG                  //No Debug mode for ICD
19#FUSES NOPROTECT                //Code not protected from reading
20#FUSES NOCPB                    //No Boot Block code protection
21#FUSES NOCPD                    //No EE protection
22#FUSES NOWRT                    //Program memory not write protected
23#FUSES NOWRTC                   //configuration not registers write protected
24#FUSES NOWRTB                   //Boot block not write protected
25#FUSES NOWRTD                   //Data EEPROM not write protected
26#FUSES NOEBTR                   //Memory not protected from table reads
27#FUSES NOEBTRB                  //Boot block not protected from table reads
28 
29#use delay(clock=20000000)
30//#use I2C(slave,sda=PIN_C4,scl=PIN_C3,address=0x66)
31#use i2c(slave,sda=PIN_C4, scl=PIN_C3, address =0x66)//,force_hw) ,fast
32 
33 
34 
35 
CÓDIGO 03 · PIC18F4550Rotinas de comunicação estruturada e análise angular

Rotinas do firmware de aquisição apresentadas separadamente por concentrarem o frame I²C estruturado, o cálculo de Q por fator de potência, frequência e sequência de fases.

1// Cabeçalho de configuração do firmware de aquisição com análise angular.
2#include <DS1307.C>
3#include <241025x4.c>
4 
5#include <math.h>  
6#include <string.h>
7//#include <stdlib.h>
8 
9#pragma zero_ram                       //- RAM is zerada antes de iniciar
10#pragma case
11 
12#define __USB_PIC_PERIF__ 1
13#DEFINE USB_HID_DEVICE  TRUE  
14//#define USB_CONFIG_HID_TX_SIZE   7
15//#define USB_CONFIG_HID_RX_SIZE   7
16 
17#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   
18#define USB_EP1_TX_SIZE   9//8//8      #define USB_EP1_TX_SIZE    (USB_CONFIG_HID_TX_SIZE+1)
19#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   
20#define USB_EP1_RX_SIZE   9//8//8 
21 
22//#define USB_CON_SENSE_PIN PIN_C6
23 
24#include <pic18_usb.h>   
25#include <usb_desc_hidm.h>   
26#include <usb.c> 
27 
28#define ResetKeyB       output_high(PIN_D6)
29#define NoRKeyB         output_low(PIN_D6)
30 
31#define Clk74166        PIN_D7
32#define S074166         input(PIN_E3)
33#define PZero           input(PIN_C2)
34#define HIKeyb          PIN_C0
35 
36void MedEnergia(void);
37int8 KeyPress(void);
38void EnviaMsgI2c(int8 tela, int8 campo, int8 *valor);
39void FaixaTexto(int8 x, int8 y,int8 t, int8 *texto, int1 Normal);
40float Tensao(int8 n);
41void MedVIPF(void);
42void FPot(float &FP,float &PKW,int8 i,int1 upd);
43void Q(int8 i,float FP, float PKW,int1 upd);
44void Arctang(signed int16 *S,signed int16 *Sc,signed int16 &A,signed int16 &B,signed int16 &C);
45float PW(int8 n);
46void MedPFP(int8 &x);
47int8 SeqFase(void);
48int8 Frequencia(void);
49int8 KeyNumb(int8 K);
50 
51static static int1 WH=0,PotAt=0,SF=0,VV=0;//,MPrinc=0
52static char Pn[7],msg[12],Unid[4];// dot2[2]=":",;
53//static char 
54//static int1 WH,PotAt,SF,VV;//,MPrinc=0
55static unsigned int8 ns=0,nPA,ord[6],StopMed;//OrdVI[6];//,OrdI[3];//OrdVI[6],
56//static unsigned int8 ns,nPA,KPI;
57static unsigned int16 Vr,FaseVA[10],FaseVB[10],FaseVC[10],FaseIA[10],FaseIB[10],FaseIC[10];//,TempoM;
58//static signed int16 VSFB[50],VSFC[50],VSFA[50];
59//static signed int16 
60static signed int32 PAtiva,ENERG,REATIVA,RWs,Ws,RVAs,VAs;//1,ENERG2,ENERG3;
61 
62/*
63signed int16 Seno[50]={
64125   ,249  ,368  ,482  ,588  ,685  ,771  ,844  ,905  ,951,
65982   ,998  ,998  ,982  ,951  ,905  ,844  ,771  ,685  ,588,
66482   ,368  ,249  ,125  ,0    ,-125 ,-249 ,-368 ,-482 ,-588,
67-685  ,-771 ,-844 ,-905 ,-951 ,-982 ,-998 ,-998 ,-982 ,-951,
68-905  ,-844 ,-771 ,-685 ,-588 ,-482 ,-368 ,-249 ,-125 ,0
69};
70 
71signed int16 Cos[50]={
72992   ,969  ,930  ,876  ,809  ,729  ,637  ,536  ,426  ,309,
73187   ,63   ,-63  ,-187 ,-309 ,-426 ,-536 ,-637 ,-729 ,-809,
74-876  ,-930 ,-969 ,-992 ,-1000,-992 ,-969 ,-930 ,-876 ,-809,
75-729  ,-637 ,-536 ,-426 ,-309 ,-187 ,-63  ,63   ,187  ,309,
76426   ,536  ,637  ,729  ,809  ,876  ,930  ,969  ,992  ,1000
77};
78*/
79 
80/*
81const signed int8 Seno[50]={
820,    13   ,25    ,37   ,48   ,59   ,68  ,77    ,84    ,90  ,95,
8398   ,100   ,100  ,98   ,95   ,90  ,84    ,77    ,68  ,59,
8448   ,37    ,25   ,13   ,0    ,-13 ,-25   ,-37   ,-48 ,-59,
85-68  ,-77   ,-84  ,-90  ,-95  ,-98 ,-100  ,-100 ,-98  ,-95,
86-90  ,-84   ,-77  ,-68  ,-59  ,-48 ,-37   ,-25  ,-13  //,0
87};
88 
89const signed int16 Cos[50]={
90100, 99   ,97    ,93   ,88  ,81  ,73  ,64   ,54   ,43  ,31,
9119   ,6     ,-6   ,-19 ,-31 ,-43 ,-54  ,-64  ,-73 ,-81,
92-88  ,-93   ,-97  ,-99 ,-100,-99 ,-97  ,-93  ,-88 ,-81,
93-73  ,-64   ,-54  ,-43 ,-31 ,-19 ,-6   ,6    ,19  ,31,
9443   ,54    ,64   ,73  ,81  ,88  ,93   ,97   ,99  //,100
95};
96 
97*/
98 
99int8 KeyNumb(int8 K){
100 
101   if(K>12)K=0;
102   else if(K>8)K-=2;
103   else if(K>4)K--;
104 
105return K;
106 
107}
108 
109////////////////////////////////////////////////////////////////////////////////
110void GravaMemI2C(int8 *IDs){    //int8 item,float valor){
111int8 i, tempo[7];//sec;//,sec,min,hrs,day,month,yr,dow;
112int16 NItens;
113 
114ds1307_init();
115 
116//// Set date for -> 15 June 2005 Tuesday
117//// Set time for -> 15:20:55
118//ds1307_set_date_time(15,6,5,2,15,20,55);
119 
120//ds1307_get_date(day,month,yr,dow);
121ds1307_get_time(tempo[0],tempo[1],tempo[2]);
122ds1307_get_date(tempo[3],tempo[4],tempo[5],tempo[6]);
123 
124//ds1307_get_time(hrs,min,sec);
125    //ds1307_get_date(day,month,yr,dow);
126    //ds1307_get_time(hrs,min,sec);
127//00:    N�mero de Registros
128 
129//01:    ID:   10bytes  (1-10)
130 
131//02:    Hora: 1 byte   (11)
132//03:    Min:  1 byte   (12)
133//04:    sec:  1 byte   (13)  -------------------------------------
134 
135//05:    Dia:  1 byte   (14)
136//06:    Mes:  1 byte   (15)
137//07:    Ano:  1 byte   (16)
138//08:    dow:  1 byte   (17)  --------------------------
139 
140//09:    Kd:   2 bytes  (18-19)
141//10:    NV:   1 byte   (20)
142//11:    Cart: 1 byte   (21)
143 
144//12:    Van:  6 bytes  (22-27)
145//13:    Vbn:  6 bytes  (28-33)
146//14:    Vcn:  6 bytes  (34-39)
147//15:    Ia:   6 bytes  (40-45)
148//16:    Ib:   6 bytes  (46-51)
149//17:    Ic:   6 bytes  (52-57)
150//18:    In:   6 bytes  (58-63)
151//19:    SF:   1 byte   (64)
152//20:    Freq: 1 byte   (65)
153//21:    Pa:   8 bytes  (66-73)
154//22:    Pb:   8 bytes  (74-81)
155//23:    Pc:   8 bytes  (82-89)
156 
157//24:    Ener: 8 bytes  (90-97)
158//25:    Erro: 6 bytes  (98-103)
159 
160//26:    Zfia: 6 bytes  (104-109)
161//Total: 109 bytes
162 
163NItens=readByte24AA1025(0x0000);
164NItens=1;
165 
166if(NItens==255)writeByte24AA1025(0x0000, 0);
167writeByte24AA1025(0x0000,NItens++);
168 
169for(i=0;i<9;i++)writeByte24AA1025((int32)NItens*107+1+i,IDs[i]);   
170 
171for(i=0;i<7;i++)writeByte24AA1025((int32)NItens*107+12+i,tempo[i]); 
172//tempo[0]=hrs
173//tempo[1]=min
174//tempo[2]=sec
175 
176//tempo[3]=day
177//tempo[4]=month
178//tempo[5]=yr
179//tempo[6]=dow (days of week)
180 
181//writeByte24AA1025((int32)NItens*107+1+11,hrs);   12+0  tempo[0] hrs
182//writeByte24AA1025((int32)NItens*107+1+12,min);   12+1  tempo[1] min
183//writeByte24AA1025((int32)NItens*107+1+13,min);   12+1  tempo[2] sec
184 
185//writeByte24AA1025((int32)NItens*107+1+14,day);   12+2  tempo[3] day
186//writeByte24AA1025((int32)NItens*107+1+15,month); 12+3  tempo[4] month
187//writeByte24AA1025((int32)NItens*107+1+16,yr);    12+4  tempo[5] year
188//writeByte24AA1025((int32)NItens*107+1+16,yr);    12+5  tempo[6] dow
189 
190}
191////////////////////////////////////////////////////////////////////////////////
192void MedEnergia(void){ 
193int8 i,j,k,KP,nkd,d,nv,campo=0,campoOld=0;//,dd
194static float EnAt,VRa,IRa,VRb,IRb,VRc,IRc;//, EnAp;
195char temp[6][12];//,ID,CAart,KD,NV;
196int16 Kd;
197int in=0;
198 
199 
200union Memoria2                                             
201{                      
202   int8 bbytes[12];                                    
203   int16 wwords[6];             
204}Leituras;  
205 
206 
207inicio:
208 
209for(i=0;i<3;i++){
210   FaseVA[i]=0;FaseVB[i]=0;FaseVC[i]=0;
211   FaseIA[i]=0;FaseIB[i]=0;FaseIC[i]=0;
212}
213 
214Kd=(int16)read_eeprom(1); //end Kd atual
215nkd=(int8)Kd;
216Leituras.bbytes[1]=read_eeprom(Kd+2); 
217Leituras.bbytes[0]=read_eeprom(Kd+3);                                                            
218Kd=Leituras.wwords[0]; 
219 
220 
221SeqFase();
222//for(i=0;i<6;i++)for(j=0;j<12;j++)temp[i][j]=0x20;
223 
224 
225strcpy(temp[0],"          ");
226strcpy(temp[1],"0");
227 
228sprintf(temp[2],"%lu",Kd);
229strcpy(temp[3],"1");
230 
231for(i=0;i<6;i++){
232   k=strlen(temp[i]);
233   for(j=k;j<12;j++)temp[i][j]=0x20;  
234}
235 
236 
237if(in==0){
238   temp[0][10]='a';
239   campo=0;
240}else campo=5;
241 
242campoOld=campo;
243 
244EnviaMsgI2c(4,0,temp[0]);//delay_ms(50);
245in=0;
246 
247for(i=1;i<6;i++){
248   //delay_ms(100);
249   delay_ms(10);
250   EnviaMsgI2c(4,i,temp[i]);
251}
252   
253delay_ms(50);
254 
255d=0;nv=0;//dd=0;
256//campo=0;campoOld=campo;
257 
258while(TRUE){
259KP=KeyPress();
260 
261   if(KP!=0){
262  
263      if(KP==4){
264         if(campo!=0)campo--;
265         else campo=5;
266         if (campo==4)campo=3;
267      }
268      else if(KP==8){
269         campo++;
270         if(campo>5)campo=0; 
271         
272         if (campo==4)campo=5;
273      }
274      else if(KP==12){
275         if(campo==2){
276            nkd++;
277            if(nkd>17)nkd=1;
278         }else if(campo==5){temp[campo][10]='0';return;}
279         
280         //else if(campo==3){
281            //nv++;
282            //if(nv>100)nv=1;
283         
284         //}
285      }
286      else if(KP==13){
287         if(campo==0){
288            if(d==0)d=1;
289            d--;
290            //msg[d]=0x20; 
291            //EnviaMsgI2c(4,0,msg);delay_ms(50);
292            
293            //////////////////////////////////////////////////////////////////////
294            
295            //temp[0][d]=KeyNumb(KP)+0x30;
296            temp[0][d]=0x20;
297            temp[0][10]='a';            
298            //d++;
299            //if(d>10)d=0;
300            EnviaMsgI2c(4,0,temp[0]);//delay_ms(50);
301              
302            /////////////////////////////////////////////////////////////////////////  
303         }
304         else if(campo==3){
305            if(nv==0)nv=1;
306            nv--;
307            temp[3][nv]=0x20;
308            temp[3][10]='a';
309            EnviaMsgI2c(4,3,temp[3]);
310         }
311         }//20h espa�o
312      else if(KP==15){
313         if(campo==5){
314            strcpy(msg,"           ");
315            EnviaMsgI2c(4,6,msg);//delay_ms(50);
316            break;
317         }
318      }//ENTER
319      else if(KP==16){
320         if(campo==2){
321            
322            nkd--;
323            if(nkd==0)nkd=17;
324         }else if(campo==5){temp[campo][10]='0';return;}
325         //else if(campo==3){
326            //nv--;
327            //if(nv==0)nv=100;
328         
329         //}
330      }
331      else{
332            //temp[campo][d]=KeyNumb(KP)+0x30;
333            //temp[campo][10]='a';      
334          if(campo==0){
335            temp[campo][d]=KeyNumb(KP)+0x30;
336            temp[campo][10]='a';            
337            d++;
338            if(d>10)d=0;
339            EnviaMsgI2c(4,0,temp[campo]);//delay_ms(50);
340         }  
341         else if(campo==3){
342            temp[campo][nv]=KeyNumb(KP)+0x30;
343            temp[campo][10]='a';            
344            nv++;
345       
346            if(nv>2)nv=0;
347            EnviaMsgI2c(4,3,temp[campo]);//delay_ms(50);
348         }
349      }
350 
351        if(KP==4||KP==8){
352         if(campoOld!=campo){
353            temp[campoOld][10]=0x20;
354            EnviaMsgI2c(4,campoOld,temp[campoOld]);
355         }
356         delay_ms(80);
357         temp[campo][10]='a';
358         EnviaMsgI2c(4,campo,temp[campo]);
359         delay_ms(50);
360         campoOld=campo;
361        }
362        
363        if(KP==12||KP==16){
364           if(campo==1){
365               if(temp[1][0]=='0')temp[1][0]='1';
366               else temp[1][0]='0';
367               //EnviaMsgI2c(4,1,temp[campo]);//delay_ms(50);
368            }
369            else if(campo==2){
370               Leituras.bbytes[1]=read_eeprom(2*nkd+1); 
371               Leituras.bbytes[0]=read_eeprom(2*nkd+2);                                                            
372               Kd=Leituras.wwords[0];
373               
374               sprintf(temp[2],"%lu",Kd);
375               //j=strlen(temp[2]);
376               //for(i=j;i<12;i++)temp[campo][i]=0x20;
377               //temp[campo][10]='a';
378               //EnviaMsgI2c(4,2,temp[campo]);//delay_ms(80);
379            }else if(campo==3){
380            
381               sprintf(temp[3],"%u",nv);
382               //j=strlen(temp[3]);
383               //for(i=j;i<12;i++)temp[campo][i]=0x20;
384               //temp[campo][10]='a';
385               //EnviaMsgI2c(4,3,temp[campo]);//delay_ms(80);
386            }
387               if(campo!=1){
388                  j=strlen(temp[campo]);
389                  for(i=j;i<12;i++)temp[campo][i]=0x20;
390                  temp[campo][10]='a';
391               }
392               EnviaMsgI2c(4,campo,temp[campo]);
393            
394        }    
395   }
396}
397 
398 
399REATIVA=0;ENERG=0;RWs=0,Ws=0,VAs=0,RVAs=0;
400WH=1;
401//TempoM=0;//StopMed=0;
402 
403output_high(HIKeyb);//delay_ms(100);
404   
405   StopMed=0;WH=1;
406   clear_interrupt(INT_TIMER0);
407   enable_interrupts(INT_TIMER0); 
408   clear_interrupt(INT_EXT2);
409   enable_interrupts(INT_EXT2);
410   
411 
412   set_timer0(45585);   //600Hz
413   //while(ns<100);   //MVOLT);//restart_wdt();//
414   //while(TRUE);
415   while(StopMed!=1);
416   StopMed=0;
417   //while(KeyPress()!=15);
418   disable_interrupts(INT_EXT2);
419   disable_interrupts(INT_TIMER0);  
420output_low(HIKeyb);   
421 
422//FaseVA[2];FaseIA[2];
423//FaseVB[2];FaseIB[2];
424//FaseVC[2];FaseIC[2];
425 
426while(RWs>1000){                  
427   RWs-=1000;              
428   Ws++;      
429}
430while(RWs<-1000){                  
431   RWs+=1000;              
432   Ws--;      
433}
434 
435EnAt=(float)Ws;
436 
437 
438//TempoM;
439 
440//EnviaMsgI2c(4,6,msg);//delay_ms(50);
441//char temp[6][12];
442 
443sprintf(temp[0],"%5.2f",EnAt);
444EnviaMsgI2c(5,0,temp[0]);//delay_ms(50);//tela 5???????????????????????????????????????????????????
445 
446//delay_ms(200);
447 
448 
449//EA=(unsigned int32) EnAt;
450 
451VRa=(float)FaseVA[2];
452VRa*=0.8505;
453VRa+=1.2759;
454sprintf(temp[0],"%5.2f",VRa);
455EnviaMsgI2c(5,1,temp[0]);
456//VA=(unsigned int32) VRa;
457 
458IRa=(float)FaseIA[2];
459IRa*=0.625;
460IRa+=0.625;
461sprintf(temp[0],"%5.2f",IRa);
462EnviaMsgI2c(5,2,temp[0]);
463//IA=(unsigned int32) IRa;
464 
465VRb=(float)FaseVB[2];
466VRb*=0.8505;
467VRb+=1.2759;
468sprintf(temp[0],"%5.2f",VRb);
469EnviaMsgI2c(5,3,temp[0]);
470//VB=(unsigned int32) VRb;
471 
472IRb=(float)FaseIB[2];
473IRb*=0.625;
474IRb+=0.625;
475sprintf(temp[0],"%5.2f",IRb);
476EnviaMsgI2c(5,4,temp[0]);
477//IB=(unsigned int32) IRb;
478 
479VRc=(float)FaseVC[2];
480VRc*=0.8505;
481VRc+=1.2759;
482sprintf(temp[0],"%5.2f",VRc);
483EnviaMsgI2c(5,5,temp[0]);
484//VC=(unsigned int32) VRc;
485 
486IRc=(float)FaseIC[2];
487IRc*=0.625;
488IRc+=0.625;
489sprintf(temp[0],"%5.2f",IRc);
490EnviaMsgI2c(5,6,temp[0]);
491WH=0;
492 
493 
494while(TRUE){
495 
496KP=KeyPress();
497 
498 
499if(KP==12){
500   sprintf(temp[0],"%u",KP);
501   EnviaMsgI2c(5,6,temp[0]);
502   return;
503}
504else if(KP==16){
505  sprintf(temp[0],"%u",KP);
506  EnviaMsgI2c(5,6,temp[0]);
507  in=1;
508  goto inicio;
509 
510}
511 
512 
513 
514}
515 
516}
517////////////////////////////////////////////////////////////////////////////////
518////////////////////////////////////////////////////////////////////////////////
519void FPot(float &FP,float &PKW,int8 i,int1 upd){
520static float FPold[3];
521 
522      FP/=PKW;
523      if(FP>1.0)FP=1.0;
524      if(FP<0.0)FP=0.0;
525      
526      if(abs(FP-FPold[i])>0.01 || upd){
527         sprintf(Pn,"%4.2f",FP);
528         strcpy(msg,Pn);//strcat(msg,Unid);
529         EnviaMsgI2c(3,i+9,msg);
530         FPold[i]=FP;//FP[i];
531      }    
532}
533 
534////////////////////////////////////////////////////////////////////////////////
535void Q(int8 i,float FP, float PKW,int1 upd){
536float Seno,temp;
537 
538      Seno=sqrt(1.0-FP*FP);
539      PKW*=Seno;
540      temp=PKW;
541      if(temp>999.9){temp/=1000.0;strcpy(Unid,"KVAR");}else strcpy(Unid,"VAR");
542      sprintf(Pn,"%4.1f",temp);   
543      strcpy(msg,Pn);strcat(msg,Unid);
544      EnviaMsgI2c(3,i+6,msg);
545}
546 
547 
548////////////////////////////////////////////////////////////////////////////////
549void Arctang(signed int16 *S,signed int16 *Sc,signed int16 *Fases){
550int8 i;
551 
552for(i=0;i<6;i++)
553Fases[i]=(signed int16)(atan2((float)S[i],(float)Sc[i])*57.2958);//180/PI
554 
555}
556////////////////////////////////////////////////////////////////////////////////
557float PW(int8 n){
558PAtiva=0;
559WH=0;PotAt=1;SF=0;VV=0;
560 
561   nPA=n;
562   ns=0;
563   
564   clear_interrupt(INT_TIMER0);
565   enable_interrupts(INT_TIMER0);                  
566      set_timer0(45585);   
567      while(ns<100);                      //MVOLT);//restart_wdt();//  
568   disable_interrupts(INT_TIMER0);  
569 
570   
571   PAtiva/=208,022;//09.832;
572   PAtiva+=167.390;
573   
574   PAtiva*=1.0559;//09.832;
575   PAtiva-=119.6;
576   
577   PAtiva*=0.8355;
578   PAtiva-=36.888;
579   PotAt=0;
580     
581   return PAtiva;
582}
583////////////////////////////////////////////////////////////////////////////////
584 
585////////////////////////////////////////////////////////////////////////////////
586void MedPFP(int8 &x){
587float PKW,Pold[3],PWold[3],FP,temp;//={999999.9,999999.9,999999.9};//V, I,
588int1 upd=1;
589int8 i,j,KPI;
590 
591 while(TRUE){
592 
593      for(i=0;i<3;i++){  
594         PKW=PW(i);
595         if(abs(PKW-PWold[i])>5 || upd){  
596            temp=PKW;
597            if(temp>999.9){temp/=1000.0;strcpy(Unid,"KW");}
598            else strcpy(Unid,"W");
599           
600            sprintf(Pn,"%5.1f",temp);
601            strcpy(msg,Pn);strcat(msg,Unid);; 
602            EnviaMsgI2c(3,i,msg);
603            PWold[i]=PKW;//PWt[i];
604         }     
605         
606         KPI=KeyPress();     
607         if(KPI==12 || KPI==16) goto fim;  
608         
609      //////////////////////////////////////////////////////////////////////////   
610       FP=PKW;///P[i];  
611      //////////////////////////////////////////////////////////////////////////
612      
613         //V=Tensao(i);
614         //I=Tensao(i+3);
615         //P[i]=(float)V*I;
616         PKW=(float)Tensao(i)*Tensao(i+3);
617         if(abs(PKW-Pold[i])>5|| upd){
618   
619            temp=PKW;
620            if(temp>999.9){temp/=1000.0;strcpy(Unid,"KVA");}
621            else strcpy(Unid,"VA");
622            
623            sprintf(Pn,"%5.1f",temp);
624            //for(j=0;j<15;j++)msg[i]=0;
625            strcpy(msg,Pn);strcat(msg,Unid);
626            EnviaMsgI2c(3,i+3,msg);
627            Pold[i]=PKW;//P[i];   
628         }
629         
630         KPI=KeyPress();     
631         if(KPI==12 || KPI==16) goto fim;  
632////////////////////////////////////////////////////////////////////////////////
633//////////////////////////////////////////////////////////////////////////////// 
634         FPot(FP,PKW,i,upd);
635         
636         KPI=KeyPress();     
637         if(KPI==12 || KPI==16) goto fim;           
638////////////////////////////////////////////////////////////////////////////////
639         Q(i,FP,PKW,upd);
640         
641         KPI=KeyPress();     
642         if(KPI==12 || KPI==16) goto fim;          
643 
644         
645      }
646      
647     fim:
648         
649         for(j=0;j<100;j++){
650          KPI=KeyPress(); 
651          if (KPI!=0)break;
652          delay_ms(10);
653         }
654         
655         if (KPI==12){x=222;return;}////////////////////////////////////////////////////////////////////////////////////////////
656         else if(KPI==16){x=0;return;}//{disable_interrupts(INT_EXT2);return;}      
657      
658   }
659}
660////////////////////////////////////////////////////////////////////////////////
661////////////////////////////////////////////////////////////////////////////////
662int8 SeqFase(void){
663signed int8 i,c,s,n;//,jk,j,j,
664signed int16 FVI[6],Vs[6],Vc[6],aux;//,k,ii;//,D;FVIx[6],
665 
666WH=0;PotAt=0;SF=1;VV=0;
667ns=0;
668 
669set_adc_channel(0);
670delay_us(20);
671for(i=0;i<10;i++){FaseVA[i]=0;FaseVB[i]=0;FaseVC[i]=0;}
672 
673clear_interrupt(INT_TIMER0);
674enable_interrupts(INT_TIMER0); 
675set_timer0(65533);
676while(ns<10);
677disable_interrupts(INT_TIMER0);  
678SF=0;
679 
680for(i=0;i<6;i++){
681      Vs[i]=0;
682      Vc[i]=0;
683};
684c=1;s=1;
685 
686   for(i=0;i<10;i++){   
687         if(i>=1&&i<=4)s=1;
688         else if(i>=6)s=-1;
689         else s=0;
690         
691         if(i<=2||i>=8)c=1;
692         else c=-1;
693         
694         Vs[0]+=FaseVA[i]*(signed int16)s;
695         Vs[1]+=FaseVB[i]*(signed int16)s;
696         Vs[2]+=FaseVC[i]*(signed int16)s;
697         
698         Vs[3]+=FaseIA[i]*(signed int16)s;
699         Vs[4]+=FaseIB[i]*(signed int16)s;
700         Vs[5]+=FaseIC[i]*(signed int16)s;
701         
702         Vc[0]+=FaseVA[i]*(signed int16)c;
703         Vc[1]+=FaseVB[i]*(signed int16)c;
704         Vc[2]+=FaseVC[i]*(signed int16)c;
705         
706         Vc[3]+=FaseIA[i]*(signed int16)c;
707         Vc[4]+=FaseIB[i]*(signed int16)c;
708         Vc[5]+=FaseIC[i]*(signed int16)c;
709         
710          
711   }
712   
713//for(i=3;i<6;i++){
714      //Vs[i]=0;
715      //Vc[i]=0;
716//};
717 
718     //for(i=0;i<10;i++){   
719         //if(i>=1&&i<=4)s=1;
720         //else if(i>=6)s=-1;
721         //else s=0;
722         //if(i<=2||i>=8)c=1;
723         //else c=-1;
724   
725         //Vs[3]+=FaseIA[i]*(signed int16)s;
726         //Vs[4]+=FaseIB[i]*(signed int16)s;
727         //Vs[5]+=FaseIC[i]*(signed int16)s;
728         
729         //Vc[3]+=FaseIA[i]*(signed int16)c;
730         //Vc[4]+=FaseIB[i]*(signed int16)c;
731         //Vc[5]+=FaseIC[i]*(signed int16)c;
732  // } 
733      
734 
735Arctang(Vs,Vc,FVI);
736 
737//FVI[0]=175;FVI[1]=53;FVI[2]=-66;FVI[3]=173;FVI[4]=53;FVI[5]=-63;
738 
739for(i=1;i<6;i++){
740   FVI[i]-=FVI[0];
741   if(FVI[i]>0)FVI[i]-=360; 
742   FVI[i]=abs(FVI[i]);
743}
744 
745FVI[0]=0;
746 
747//for(i=0;i<6;i++)ord[i]=i;
748 
749ord[0]=0;
750ord[1]=1;
751ord[2]=2;
752 
753ord[3]=4;
754ord[4]=5;
755ord[5]=6;
756 
757 
758do{
759   n=0;
760      for(i=0;i<5;i++){   
761         if(FVI[i]>FVI[i+1]){
762            aux=FVI[i];
763            FVI[i]=FVI[i+1];
764            FVI[i+1]=aux;
765            n++;
766            aux=ord[i];
767            ord[i]=ord[i+1];
768            ord[i+1]=aux;
769         }                           
770      } 
771}while(n>0);
772 
773for(i=2;i<5;i+=2){
774   if(ord[i]>3){    //ORD[2] OU ORD[4]
775      aux=ord[i];
776      ord[i]=ord[i+1];
777      ord[i+1]=aux;
778   }
779}
780 
781aux=ord[3];ord[3]=ord[1];ord[1]=ord[2];ord[2]=ord[4];ord[4]=aux;
782 
783//if(FVI[1]>FVI[2])i=0;else i=1;
784if(ord[1]>ord[2])i=0;else i=1;
785 
786 
787//ord[0]=0;
788//ord[1]=1;
789//ord[2]=2;
790 
791//ord[3]=4;
792//ord[4]=5;
793//ord[5]=6;
794 
795 
796//for(i=1;i<3;i++){
797   //if(ord[i]>3){
798      //aux=ord[i];ord[i]=ord[i+2];
799     // ord[i+2]=ord[i];
800   //}
801//}
802//  
803//ord[3]<-ord[1]<-ord[2]<-ord[4]<-ord[3]
804 
805//for(i=0;i<6;i++)FVIx[i]=FVI[i];
806 
807//do{
808   //n=0;
809   //for(i=0;i<5;i++){   
810      //if(FVIx[i]>FVIx[i+1]){
811         //aux=FVIx[i];
812         //FVIx[i]=FVIx[i+1];
813         //FVIx[i+1]=aux;
814         //n++;
815      //}                           
816   //} 
817//}while(n>0);
818 
819//for(i=0;i<6;i++)for(j=0;j<6;j++)if(FVIx[i]==FVI[j])ord[i]=j;
820 
821//for(i=0;i<5;i+=2){
822   //if(ord[i]>ord[i+1]){
823      //aux=ord[i];
824      //ord[i]=ord[i+1];
825      //ord[i+1]=aux;
826   //}
827//}
828 
829 
830/*
831aux=ord[1];
832ord[1]=ord[2];
833ord[2]=ord[4];
834 
835i=ord[3];
836ord[3]=aux+1;//ord[1];
837ord[4]=i+1;//ord[3];
838ord[5]++;
839if(FVI[1]>FVI[2])i=0;else i=1;
840 
841ord[0]=0;
842ord[1]=1;
843ord[2]=2;
844 
845ord[3]=4;
846ord[4]=5;
847ord[5]=6;
848*/
849 
850return i;
851 
852}
853///////////////////////////////////////////////////////////////////////////////
854int8 Frequencia(void){      
855///////////////////////////////////////////                                              
856#bit capture_1=0xf9e.2  //bite do de PIR1 (endere�o 0xf9e) testa captura
857int16 j, freq;//CCP1,  
858 
859j=0;                                  
860while(PZero&&j<20000){delay_us(1);j++;}
861   while(!PZero&&j<20000){delay_us(1);j++;}//&& j<0x1000){
862   set_timer1(0);
863   capture_1=0;   
864   while(!capture_1&&j<20000){delay_us(1);j++;}            //&& j<0x1000){
865if (j>=20000) CCP_1=0;///Era 0(zero) 
866freq=CCP_1; 
867freq/=100;
868freq=15000/freq;                   
869 
870return (int8)freq;
871}           
872///////////////////////////////////////////////////////////////////////////////
873 
874float Tensao(int8 n){
875//signed int32 Tensao(int8 n){
876//n=0; VAN  //set_adc_channel(0);
877 
878//n=1; VBN  //set_adc_channel(1);
879//n=2; VCN  //set_adc_channel(2);
880 
881//n=3; IA   //set_adc_channel(4);
882//n=4; IB   //set_adc_channel(5);
883//n=5; IC   //set_adc_channel(6);
884 
885//n=6; IN   //set_adc_channel(7);
886 
887int8 i;
888//int32 vsoma;// Irms=0.0, Periodo=0.0;Vrms,
889float V1,vsoma,vmaior,vmenor;
890 
891WH=0;PotAt=0;SF=0;VV=1;
892 
893if (n<6)set_adc_channel(ord[n]);
894else set_adc_channel(7);
895///////////////////////////////////////////////////////////////////////////////
896 
897   //V1=0;vsoma=0;vmaior=0;vmenor=1000;
898   //for (i=0;i<10;i++){     //for (k=0;k<6;k++){
899     //V1=Vrms();//faixa_t);
900      //if(V1>vmaior)vmaior=V1;                                                           
901      //if(V1<vmenor)vmenor=V1;                 
902      //vsoma+=V1;                                
903   //}                                           
904   //vsoma-=vmaior;                              
905   //vsoma-=vmenor;                              
906   //vsoma/=8.0; 
907   ////restart_wdt();
908   //return vsoma;  
909 
910///////////////////////////////////////////////////////////////////////////////
911delay_us(20);
912 
913 
914V1=0.0;vsoma=0.0;vmaior=0.0;vmenor=99999999.9;
915 
916for(i=0;i<5;i++){  
917   Vr=0;
918   ns=0;
919   clear_interrupt(INT_TIMER0);
920   enable_interrupts(INT_TIMER0); 
921      set_timer0(65533);                  //set_timer0(61588);//61588- 3Khz
922      while(ns<100);                      //MVOLT);//restart_wdt();//  
923   disable_interrupts(INT_TIMER0);  
924   
925   V1=(float)Vr;
926   if(V1>vmaior)vmaior=V1;                                                           
927   if(V1<vmenor)vmenor=V1;                 
928   vsoma+=V1;               
929   //soma+=(float)Vr; 
930}   
931   vsoma-=vmaior;vsoma-=vmenor;
932 
933   vsoma/=3000.0;
934   
935   if(n<3){
936      vsoma*=9.1898;
937      vsoma*=0.9272;
938      vsoma+=0.0464;
939   }
940   else {
941      vsoma*=6.9882;
942      vsoma*=0.8794;
943      vsoma-=0.0293;
944   }
945VV=0;
946 
947return vsoma;
948 
949}
950 
951///////////////////////////////////////////////////////////////////////////////
952///////////////////////////////////////////////////////////////////////////////
953void MedVIPF(void){
954int1 Up[3],upd=1;
955int8 i,j,f,fold=0,S,Sold=10,KPI=0;//,kp;,j
956char Vn[6];//,msg[15];
957float Vx,Iold[4],Vt[3],Vtold[3],V[3]={0,0,0};
958 
959 
960inicio:
961 
962WH=0;PotAt=0;SF=0;VV=0;
963 
964//enable_interrupts(INT_EXT2_L2H );
965//for(i=0;i<2;i++)Up[i]=0;
966for(i=0;i<3;i++)Up[i]=0;
967 
968while(TRUE){
969   strcpy(Unid,"V");
970   for(i=0;i<3;i++){
971  
972      Vt[i]=Tensao(i);
973      sprintf(Vn,"%5.1f",Vt[i]);
974      strcpy(msg,Vn);strcat(msg,Unid);
975      
976      if(abs(Vtold[i]-Vt[i])>0.1 ||upd ){EnviaMsgI2c(2, i, msg);Up[i]=1;}
977      
978      Vtold[i]=Vt[i];   
979   }   
980   
981 KPI=KeyPress();     
982 if(KPI==12 || KPI==16) goto fim;
983   
984   //if(Up[0]||Up[1])V[0]=sqrt(Vt[0]*Vt[0]+Vt[0]*Vt[1]+Vt[1]*Vt[1]);}
985   //if(Up[1]||Up[2])V[1]=sqrt(Vt[1]*Vt[1]+Vt[1]*Vt[2]+Vt[2]*Vt[2]);}
986   //if(Up[0]||Up[2])V[2]=sqrt(Vt[0]*Vt[0]+Vt[0]*Vt[2]+Vt[2]*Vt[2]);}   
987    
988    
989   if(Up[0]||Up[1]||Up[2]){
990      for(i=3;i<6;i++){
991         
992         V[i-3]=1.73205*Vt[i-3];////simplifica��o da equa��o sqrt(Vt[0]*Vt[0]+Vt[0]*Vt[1]+Vt[1]*Vt[1]);}
993         
994         sprintf(Vn,"%5.1f",V[i-3]);//Vt[i]);
995         
996         strcpy(msg,Vn);strcat(msg,Unid);
997         delay_ms(10);
998         EnviaMsgI2c(2,i, msg); 
999         
1000      }
1001   }
1002   for(i=0;i<3;i++)Up[i]=0;
1003   //Up[0]=0;Up[1]=0;Up[2]=0;
1004   
1005   
1006 KPI=KeyPress();     
1007 if(KPI==12 || KPI==16) goto fim;
1008 
1009 strcpy(Unid,"A");       
1010 for(i=0;i<4;i++){
1011       
1012      //for(i=0;i<15;i++)msg[i]=0x00;  
1013      
1014      Vx=Tensao(i+3);//Vx[i]=Tensao(i+3);
1015      sprintf(Vn,"%5.1f",Vx);//sprintf(Vn,"%5.1f",Vx[i]);
1016      
1017      //for(j=0;j<15;j++)msg[i]=0;
1018      strcpy(msg,Vn);strcat(msg,Unid);
1019      if(abs(Iold[i]-Vx)>0.1 ||upd )EnviaMsgI2c(2,i+6, msg);
1020      Iold[i]=Vx;
1021 }
1022      
1023 KPI=KeyPress();     
1024 if(KPI==12 || KPI==16) goto fim;
1025 
1026      f=Frequencia();
1027      if((fold-f)!= 0||upd ){
1028         strcpy(Unid,"HZ"); 
1029         
1030         //for(j=0;j<15;j++)msg[i]=0;
1031         sprintf(msg,"%3u",f);
1032         strcat(msg,Unid);
1033         EnviaMsgI2c(2,10,msg);
1034         delay_us(500);
1035         fold=f;
1036      }
1037     
1038     S=SeqFase();
1039     if(S!=Sold||upd ){
1040        Sold=S;   
1041        
1042        //for(j=0;j<15;j++)msg[i]=0;
1043        if(S==1)strcpy(msg," A B C");
1044        else strcpy(msg," A C B"); 
1045        delay_ms(20);
1046        EnviaMsgI2c(2,11,msg);
1047     }
1048   
1049upd=0;
1050 
1051for(j=0;j<100;j++){
1052 KPI=KeyPress(); 
1053 if (KPI!=0)break;
1054 delay_ms(10);
1055}
1056 //if(KPI==12 || KPI=16) goto fim;      
1057 
1058fim:
1059      //KPI=KeyPress();
1060      if (KPI==12){MedPFP(j);if(j==222)return;else upd=1;}
1061      else if(KPI==16)return;//{disable_interrupts(INT_EXT2);return;}
1062      //KPI=0;
1063      //delay_ms(10);
1064      
1065   }
1066}
1067////////////////////////////////////////////////////////////////////////////////
1068////////////////////////////////////////////////////////////////////////////////
1069int8 KeyPress(void){
1070//static int8 Kold=0;
1071int8 i,j,K;//,NL=5;
1072 
1073 
1074//output_low(HIKeyb);delay_us(100);
1075 
1076K=0;
1077output_high(Clk74166);//INICIALIZAR CLOCK DO 74166
1078 
1079ResetKeyB; delay_us(500);NoRKeyB;
1080//ResetKeyB; delay_us(500);NoRKeyB;
1081 
1082   for(i=0;i<5;i++){  
1083      output_high(Clk74166);
1084         for(j=1;j<9;j++){ 
1085            output_low(Clk74166);
1086            if(S074166)K=5+(4*i-j);
1087            delay_us(500);
1088            output_high(Clk74166);
1089            delay_us(500);
1090         }
1091   }
1092   
1093//output_high(HIKeyb);
1094return K;
1095}
1096 
1097////////////////////////////////////////////////////////////////////////////////
1098////////////////////////////////////////////////////////////////////////////////
1099 
1100void EnviaMsgI2c(int8 tela, int8 campo, int8 *valor){
1101char buffer[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//,msg[20];
1102static int8 i,n,l;//,ack;data,
1103 
1104n=0;
1105inicio:
1106n++;
1107 
1108l=strlen(valor);//+2; 13 caracteres
1109buffer[0]=tela;
1110buffer[1]=campo;
1111 
1112for(i=0;i<l;i++)
1113buffer[i+2]=valor[i];
1114 
1115for(i=l;i<14;i++)
1116buffer[i+2]=0x00;
1117 
1118 
1119i2c_start();
1120i2c_write(0x66);
1121i2c_write(0x00);
1122for(i=0;i<=15;i++){
1123   if(i2c_write(buffer[i])){
1124      if (n>200) break;
1125      i2c_stop();goto inicio;
1126   }
1127}
1128 
1129i2c_stop(); 
1130 
1131delay_ms(10);//delay_ms(20);
1132 
1133}
1134//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1135void main(){
1136BYTE const E[37]={
11370x11,0x01,0x01,//17 Kds, Kd inicial=1(0.2), N. voltas=1
11380x00,0xC8,  //0.200
11390x01,0x2C,  //0.300
11400x01,0x90,  //0.400
11410x01,0xF4,  //0.500
11420x03,0x84,  //0.900
11430x03,0xE8,  //1.000
11440x04,0xB0,  //1.200
11450x07,0x08,  //1.800
11460x07,0xD0,  //2.000
11470x09,0x60,  //2.400
11480x0E,0x10,  //3.600
11490x13,0x88,  //5.000
11500x15,0x18,  //5.400
11510x1C,0x20,  //7.200
11520x2A,0x30,  //10.800
11530x38,0x40,  //14.400
11540x54,0x60}; //21.600
1155//NKds=read_eeprom(0); 
1156//KdAtual=read_eeprom(1);
1157//Nvoltas=read_eeprom(2);   
1158int8 i,KP,item;
1159//char msg="abcdefghij";
1160 
1161enable_interrupts(GLOBAL);       //Turn on interrupts
1162setup_timer_0(T0_INTERNAL | T0_DIV_1); 
1163setup_adc_ports(AN0_TO_AN7|VSS_VREF);
1164 
1165setup_adc(ADC_CLOCK_DIV_64);//setup_adc(ADC_CLOCK_DIV_32);//setup_adc(ADC_CLOCK_DIV_16);
1166 
1167setup_ccp1(CCP_CAPTURE_RE);
1168setup_ccp2(CCP_OFF);
1169setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);//83.33ns * 8=666.666ns por incremento em TIMER1
1170//EXT_INT_EDGE(L_TO_H);
1171ext_int_edge( 2, H_TO_L); 
1172//#define L_TO_H              0x40
1173//#define H_TO_L   
1174 
1175disable_interrupts(INT_TIMER0);  //Disable (Enable) INT_TIMER0
1176disable_interrupts(INT_TIMER1);
1177disable_interrupts(INT_TIMER2);
1178disable_interrupts(INT_TIMER3);
1179disable_interrupts(INT_EXT2);
1180                                   
1181if(read_eeprom(0)==255)
1182for(i=0;i<37;i++)write_eeprom(i,E[i]);
1183 
1184output_low(HIKeyb);
1185 
1186//GravaMemI2C(msg);
1187//while(TRUE);
1188 
1189EnviaMsgI2c(1,0,msg);
1190 
1191SeqFase();
1192 
1193//MedEnergia();
1194 
1195while(TRUE){
1196         
1197         delay_ms(30); 
1198         KP=KeyPress();
1199         
1200         if(KP!=0){
1201            delay_ms(50);
1202            if (KP==4){
1203               //KP=0;
1204               //delay_ms(50);
1205               if(item==0)item=7;
1206               item--;
1207               strcpy(msg,"Null");
1208               EnviaMsgI2c(1,item,msg);
1209            }
1210            else if(KP==8){
1211               //KP=0;
1212               //delay_ms(50); 
1213               item++;if(item>6)item=0;
1214               //EnviaMsgI2c(1,KeyPress(),msg);
1215               strcpy(msg,"Null");
1216               EnviaMsgI2c(1,item,msg);
1217            }
1218           else if(KP==15){
1219               //KP=0;
1220               //delay_ms(50); 
1221               if(item==0) MedEnergia();
1222               else if(item==1)MedVIPF();//{MedVIPF();strcpy(msg,"C");EnviaMsgI2c(1,1,msg);}
1223               else if(item==2);
1224               else if(item==3);
1225               else if(item==4);
1226               else if(item==5);
1227               else if(item==6);//AjusteRelogio();;
1228               strcpy(msg,"C");EnviaMsgI2c(1,item,msg);
1229               
1230           }
1231               //if(KP!=15){
1232                  //strcpy(msg,"Null");
1233                  //EnviaMsgI2c(1,item,msg);           
1234               //}
1235               KP=0;
1236         }
1237}
1238 
1239}
1240//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1241 
1242#int_TIMER0 HIGH
1243void TIMER0_isr(void){
1244static int8 n=0,nn=0,ft;//,x=0;
1245static signed int16 Vm1, Im1,Vm2, Im2,Vm3, Im3;//V[100],
1246 
1247output_high(PIN_B6);
1248 
1249if(WH||SF)set_timer0(45585);//600Hz   45570-297Hz
1250else set_timer0(61588);//61588- 3Khz
1251 
1252if(WH) {
1253   //output_high(PIN_B3);
1254   //TempoM++;
1255   set_adc_channel(ord[0]);   //0
1256   delay_us(5);
1257   Vm1=read_adc();//-511;
1258 
1259   set_adc_channel(ord[3]);   //4
1260   delay_us(5);
1261   Im1=read_adc();//-511;
1262   
1263   set_adc_channel(ord[1]);   //1
1264   delay_us(5);
1265   Vm2=read_adc();//-511;
1266 
1267   set_adc_channel(ord[4]);   //5
1268   delay_us(5);
1269   Im2=read_adc();//-511;
1270   
1271   set_adc_channel(ord[2]);   //2
1272   delay_us(5);
1273   Vm3=read_adc();//-511;
1274   
1275   set_adc_channel(ord[5]);   //6
1276   delay_us(5);
1277   Im3=read_adc()-511;/////////////////////////////////////////////////////
1278   
1279   set_adc_channel(ord[2]);   //2
1280   delay_us(5);
1281   Vm3+=read_adc();//-511;
1282   
1283   set_adc_channel(ord[4]);   //5
1284   delay_us(5);
1285   Im2+=read_adc();//-511;
1286   
1287   set_adc_channel(ord[1]);  //1
1288   delay_us(5);
1289   Vm2+=read_adc();//-511;
1290   
1291   set_adc_channel(ord[3]);  //4
1292   delay_us(5);
1293   Im1+=read_adc();//-511;
1294   
1295   set_adc_channel(ord[0]);  //0
1296   delay_us(5);
1297   Vm1+=read_adc();//-511;
1298   
1299   Vm1/=2;Im1/=2;Vm2/=2;Im2/=2;Vm3/=2;
1300   Vm1-=511;Vm2-=511;Vm3-=511;Im1-=511;Im2-=511;
1301 
1302   ENERG+=(signed int32)Vm1*Im1+Vm2*Im2+Vm3*Im3;
1303   FaseVA[1]+=(unsigned int16)abs(Vm1);
1304   FaseIA[1]+=(unsigned int16)abs(Im1);
1305   
1306   FaseVB[1]+=(unsigned int16)abs(Vm2);
1307   FaseIB[1]+=(unsigned int16)abs(Im2);
1308   
1309   FaseVC[1]+=(unsigned int16)abs(Vm3);
1310   FaseIC[1]+=(unsigned int16)abs(Im3);
1311   
1312   n++;nn++;
1313     
1314    if (n>99){          // if (n>100){
1315      //output_high(PIN_B4);
1316            Ws+=ENERG/1000;     //SVIi=SVI/1000;  
1317      
1318            if(ENERG<0)RWs-=ENERG%1000;
1319            else RWs+=ENERG%1000; 
1320            ENERG=0;//ENERG2=0;ENERG3=0;n=0;
1321 
1322            n=0;
1323      //output_low(PIN_B4);         
1324    }        
1325    
1326    if(nn>9){
1327      //output_high(PIN_B5);
1328      FaseVA[1]/=10;FaseVB[1]/=10;FaseVC[1]/=10;
1329      FaseIA[1]/=10;FaseIB[1]/=10;FaseIC[1]/=10;
1330      
1331      if (FaseVA[2]==0)ft=0;else ft=1;
1332      FaseVA[2]+=FaseVA[1];
1333      FaseIA[2]+=FaseIA[1];
1334      
1335      FaseVB[2]+=FaseVB[1];
1336      FaseIB[2]+=FaseIB[1];
1337      
1338      FaseVC[2]+=FaseVC[1]; 
1339      FaseIC[2]+=FaseIC[1];
1340      
1341      if(ft==1){
1342         FaseVA[2]/=2;FaseIA[2]/=2;//*FaseIA[1];
1343         FaseVB[2]/=2;FaseIB[2]/=2;//*FaseIA[1];
1344         FaseVC[2]/=2;FaseIC[2]/=2;//*FaseIA[1];
1345      }
1346      FaseVA[1]=0;FaseVB[1]=0;FaseVC[1]=0;FaseIA[1]=0;FaseIB[1]=0;FaseIC[1]=0;
1347      
1348      nn=0;
1349      //output_low(PIN_B5);
1350    }
1351   
1352    //output_low(PIN_B3);        
1353    
1354}
1355else if(PotAt){
1356 
1357   set_timer0(45585);         //600Hz
1358   
1359   set_adc_channel(ord[nPA+3]);
1360   delay_us(5);
1361   Im1=read_adc()-511;
1362   
1363   set_adc_channel(ord[nPA]);
1364   delay_us(5);
1365   Vm1=read_adc()-511;
1366   
1367   set_adc_channel(ord[nPA+3]);
1368   delay_us(5);
1369   Im1+=read_adc()-511;
1370    
1371   Im1/=2;
1372 
1373   PAtiva+=(signed int32)Vm1*Im1;
1374   ns++;
1375}
1376else if(SF){
1377////////////////////////////////////////////////////////////////////////////////
1378   set_adc_channel(0);
1379   delay_us(5);
1380   FaseVA[ns]=read_adc();
1381   
1382   set_adc_channel(4);
1383   delay_us(5);
1384   FaseIA[ns]=read_adc();
1385   
1386   set_adc_channel(1);
1387   delay_us(5);
1388   FaseVB[ns]=read_adc();
1389   
1390   set_adc_channel(5);
1391   delay_us(5);
1392   FaseIB[ns]=read_adc();
1393   
1394   set_adc_channel(2);
1395   delay_us(5);
1396   FaseVC[ns]=read_adc();
1397   
1398   set_adc_channel(6);
1399   delay_us(5);
1400   FaseIC[ns]=read_adc();//-511;
1401   
1402   set_adc_channel(2);
1403   delay_us(5);
1404   FaseVC[ns]+=read_adc();
1405   
1406   set_adc_channel(5);
1407   delay_us(5);
1408   FaseIB[ns]+=read_adc();
1409   
1410   set_adc_channel(1);
1411   delay_us(5);
1412   FaseVB[ns]+=read_adc();
1413   
1414   set_adc_channel(4);
1415   delay_us(5);
1416   FaseIA[ns]+=read_adc();
1417   
1418   set_adc_channel(0);
1419   delay_us(5);
1420   FaseVA[ns]+=read_adc();
1421 
1422   FaseVA[ns]/=2;FaseVB[ns]/=2;FaseVC[ns]/=2;FaseIB[ns]/=2;FaseIA[ns]/=2;
1423 
1424   ns++;
1425 
1426}
1427else if(VV){
1428   Vm1=read_adc();
1429   if (Vm1>511)Vm1-=511;else Vm1=511-Vm1; 
1430   Vr+=(unsigned int16)Vm1;
1431   ns++;
1432}
1433 
1434 
1435output_low(PIN_B6);
1436}
1437 
1438////////////////////////////////////////////////////////////////////////////////
1439#int_EXT2
1440void EXT2_isr(void){
1441   StopMed++;
1442}
1443 
1444