universidade positivo núcleo de ciências exatas e tecnológicas

Transcrição

universidade positivo núcleo de ciências exatas e tecnológicas
0
UNIVERSIDADE POSITIVO
NÚCLEO DE CIÊNCIAS EXATAS E TECNOLÓGICAS
ENGENHARIA ELÉTRICA
CONTROLADOR X10 PARA AUTOMAÇÃO RESIDENCIAL
CURITIBA, 2009
MAURO STREISKY
WAGNER REZENDE
CONTROLADOR X10 PARA AUTOMAÇÃO RESIDENCIAL
Trabalho apresentado ao Curso de
Engenharia Elétrica da Universidade Positivo,
para obtenção de avaliação parcial da
disciplina de Trabalho de Conclusão de Curso
(TCC), como requisito para obtenção do grau
de Engenheiro Eletricista, sob orientação do
Prof. Msc. Roberto Selow
CURITIBA, 2009
AGRADECIMENTOS
Agradeço aos professores pela colaboração no
desenvolvimento do trabalho e na solução dos
problemas, aos amigos que juntos enfretaram
essa longa jornada, aos pais pelo eterno apoio
e principalmente a minha esposa, pelo apoio
moral, amor e paciência.
Mauro Streisky
Gostaria de agradecer primeiramente a Deus,
pela oportunidade e capacitação fornecida ao
longo do curso de Engenharia Elétrica,
agradeço também a minha família pelo apoio,
amor e compreenção durante esses 5 anos e a
todos
que
me acompanharam nessa
impressionante trajetória.
"Se ando em meio à tribulação, tu me refazes a
vida; estendes a mão contra a ira dos meus
inimigos; a tua destra me salva." - Salmos,
138:7
Wagner W. Rezende
“As pessoas que dizem não ter mais nada a
aprender não atingiram o limite do
conhecimento, posto que este provém de
fontes inesgotáveis; alcançaram, isto sim, o
limite de sua própria competência ! “
(Licínio César Porto)
LISTA DE FIGURAS
Figura 01: Réplica aplicada aos bits na transmissão X10 ....................................... 12
Figura 02: Processo de modulação OOK (On Off Keying) ...................................... 13
Figura 03: Pacote de dados X10 ............................................................................. 14
Figura 04: Redundância aplicada aos bits na transmissão X10 .............................. 14
Figura 05: Visão geral do projeto ............................................................................ 16
Figura 06: Controle dos dispositivos X10 via aplicativo........................................... 17
Figura 07: Fonte de alimentação do controlador ..................................................... 18
Figura 08: Circuito de transmissão de dados .......................................................... 19
Figura 09: Circuito de sincronismo .......................................................................... 19
Figura 10: Circuito de recepção de dados............................................................... 20
Figura 11: Diagrama em blocos de circuito PLL...................................................... 21
Figura 12: VCO travando o sinal de saída .............................................................. 22
Figura 13: Demodulação do sinal através do filtro PLL ........................................... 22
Figura 14: Montagem completa no protoboard........................................................ 26
Figura 15: Circuito transformerless no protoboard .................................................. 27
Figura 16: Circuito de recepção de dados no protoboard ....................................... 28
Figura 17: Circuito modelo, representado no datasheet do LM567......................... 28
Figura 18: Kit Micrcontrolador PIC (Brastron).......................................................... 29
Figura 19: Amostra da correção do software (House Code) ................................... 30
Figura 20: Função mover ........................................................................................ 30
Figura 21: Função monta frame .............................................................................. 30
Figura 22: Exemplo incorreto do pacote de dados para transmissão X10 .............. 32
Figura 23: Tela principal da interface gráfica........................................................... 33
Figura 24: Tela de help de como cadastrar um novo dispositivo............................. 34
Figura 25: Tela de configuração dos dispositivos.................................................... 34
Figura 26: Tela de configuração dos cenários......................................................... 35
Figura 27: Tela de configuração do simulador de presença.................................... 36
Figura 28: Texto de ajuda sobre o campo house code ........................................... 36
Figura 29: Lay out da placa do controlador ............................................................. 37
Figura 30: Visão 3D da placa roteada ..................................................................... 37
Figura 31: Sinal de saído do PWM.......................................................................... 40
Figura 32: Sinal de saída do circuito de detecção de passagem por zero .............. 40
Figura 33: Tamanho da portadora transmitida ........................................................ 41
LISTA DE TABELAS
Tabela 01: Relação de macro e micro atividades.................................................... 24
Tabela 02: Relação de custos previstos no projeto................................................. 25
Tabela 03: Problemas encontrados na fonte de alimentação transformerless ........ 27
Tabela 04: Lista de componentes ........................................................................... 38
LISTA DE ACRÓNIMOS, SIGLAS E SÍMBOLOS
- Ohm;
µF – micro Faraday;
ANSI - American National Standards Institute;
bps – bits por segundo;
C – Capacitor;
CI – Circuito Integrado;
– Frequência;
– Frequência Inicial;
Hz – Hertz;
k
- kilo Ohm;
kHz – kilo Hertz;
LCD – Liquid Crystal Display;
mA – mili Amper;
ms – mili segundos;
mVpp – mili Volts pico-a-pico;
OOK – On Off Keying;
PC – Personal Computer;
PCI – Placa de Circuito Impresso;
PLC – Power Line Communication;
PLL – Phase Locked Loop;
PWM – Pulse Wide Modulation;
R – Resistor;
USB – Universal Serial Bus;
V – Volts;
Vca – Tensão alternada;
Vcc – Tensão contínua;
Vpp – Tensão pico-a-pico;
Vrms – Tensão eficaz;
VCO – Voltage Controlled Oscilator;
X10 – Protocolo aberto desenvolvido para automação comercial;
XC – Reatância Capacitiva.
SUMÁRIO
1. INTRODUÇÃO .................................................................................................. 10
2. JUSTIFICATIVA................................................................................................ 10
3. OBJETIVOS ESPECÍFICOS............................................................................. 11
4. FUNDAMENTAÇÃO TEÓRICA ........................................................................ 11
4.1 TRANSMISSÃO DE DADOS PELA REDE ELÉTRICA .............................. 12
4.2 ENDEREÇAMENTO NO SISTEMA X10 .............................................. 13
4.3 COMUNICAÇÃO NO SISTEMA X10 .............................................. 14
5. ESPECIFICAÇÃO TÉCNICA ............................................................................ 16
5.1 INTERFACE COM O USUÁRIO................................................................. 16
5.2 FONTE DE ALIMENTAÇÃO................................................................. 17
5.3 MICROPROCESSADOR................................................................ 18
5.4 CIRCUITO DE TRANSMISSÃO DE DADOS........................... 18
5.5 CIRCUITO DE SINCRONIZAÇÃO .................................. 19
5.6 CIRCUITO DE RECEPÇÃO DE DADOS................. 20
5.6.1 FILTRO PLL (PHASE LOCKED LOOP)....... 20
6. FLUXOGRAMA FUNCIONAL........................................................................... 23
7. PLANO DE TRABALHO................................................................................... 24
8. IMPLEMENTAÇÃO........................................................................................... 26
8.1 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO HARDWARE ................ 26
8.2 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO FIRMWARE............. 29
8.3 CONFIGURAÇÕES DO SOFTWARE .............................................. 32
8.4 PLACA DE CIRCUITO IMPRESSO (PCB) .................................. 37
8.5 RELAÇÃO DE COMPONENTES ........................................... 38
9. RESULTADOS.................................................................................................. 40
10. CONCLUSÃO ................................................................................................. 42
11. REFERÊNCIAS BIBLIOGRÁFICAS ............................................................... 43
12. DOCUMENTOS CONSULTADOS .................................................................. 43
APENDICE A .......................................................................................................... 44
APENDICE B .......................................................................................................... 45
APENDICE C .......................................................................................................... 54
ANEXO A................................................................................................................ 56
10
1. INTRODUÇÃO
O desejo de se conceber residências inteligentes não é novo. Há muito
tempo o homem deseja possuir um lar onde ele possa interagir com o ambiente, e
que este atenda a suas necessidades de conforto e praticidade. Aliando-se essas
necessidades à tecnologia, surgiram inúmeros sistemas com intuito de preencher
essa lacuna, entre eles o sistema de automação residencial conhecido como X10.
Baseado no princípio de oferecer ao usuário uma interface simples, segura,
de uso intuitivo e que se comunique com o padrão comercial do X10, este projeto
propõe o desenvolvimento de um controlador microprocessado que implemente essa
tecnologia e que além de suas funcionalidades, seja de baixo custo.
2. JUSTIFICATIVA
Como a proposta do projeto de um controlador para automação residencial
não é desenvolver nenhuma tecnologia nova e sim uma aplicação baseada em um
padrão comercial, dentre os vários sistemas destinados à automação residencial
disponíveis no mercado, o projeto foi baseado em um que atende a todas essas
prerrogativas:
•
Simplicidade de instalação;
•
Padrão aberto de comunicação;
•
Utilização da rede elétrica como meio físico de transmissão de dados;
•
Ampla base instalada;
•
Diversidade de fornecedores de dispositivos sensores e acionadores
de cargas;
•
Estabilidade da tecnologia;
•
Baixo custo.
Atendendo a todas essas características, o protocolo X10 mostrou-se como
a melhor alternativa para o desenvolvimento do projeto.
11
3. OBJETIVOS ESPECÍFICOS
Os objetivos do projeto são:
•
Elaborar um controlador microprocessado capaz de se comunicar e
controlar dispositivos comerciais baseados no padrão X10;
•
Dotar o controlador com a função de comunicação bidirecional;
•
Implementar por software as funções do protocolo X10;
•
Desenvolver uma interface gráfica através do PC para acesso e
programação das funções de controle;
•
Desenvolver uma interface via modem celular para possibilitar o
acionamento remoto das funções do controlador via mensagem de
texto;
•
Implementar a comunicação serial sobre USB entre o controlador e o
PC;
•
Delimitar a abrangência do sinal às dependências equivalentes de
uma residência.
4. FUNDAMENTAÇÃO TEÓRICA
O protocolo X10 desenvolvido pela empresa escocesa Pico Electronics Ltd.
entre 1976 e 1978 (DIGITAT, 2009), foi o primeiro protocolo idealizado para trafegar
sobre
a
rede
Communications
elétrica
destinado
à
automação
residencial
(Power
Line
PLC). Ser um protocolo aberto, com equipamentos de baixo
custo e sem necessidade de investimento em infra-estrutura nas residências, fez do
modelo X10 líder mundial em sistemas de domótica (A CASA INTELIGENTE, 2009).
A seguir é apresentado o protocolo X10, sendo descrita a forma como a
informação trafega na rede elétrica, a estrutura dos pacotes de dados e detalhes de
segurança da transmissão.
12
4.1 TRANSMISSÃO DE DADOS PELA REDE ELÉTRICA DE BAIXA TENSÃO
O protocolo X10 utiliza a onda sinusoidal da rede elétrica de baixa tensão
como sincronismo. Para isto são referenciadas as interseções ocorridas em 0V tanto
na transição de subida, quanto na transição de descida.
Para a informação do protocolo X10 ser transmitida em sistemas
monofásicos, bifásicos e trifásicos, cada bit é replicado duas vezes durante um semiciclo sinusoidal. Usando como referência um bit inserido no ponto de sincronismo, a
primeira réplica possui um atraso de aproximadamente 2,778ms e a segunda réplica
um atraso de 5,556ms. Tais atrasos coincidem com os pontos 120º e 240º do sinal
sinusoidal, equivalentes a origem de cada fase sem interferir no intervalo de
sincronismo (figura 1).
FIGURA 1 – RÉPLICA APLICADA AOS BITS NA TRANSMISSÃO X10.
FONTE: PRÓPRIA
Com o método de sincronismo definido, pode-se afirmar que a taxa de
transmissão do protocolo X10 está limitada em 120bps para rede elétrica de 60Hz
ou 100bps para a rede elétrica de 50Hz.
Os bits adicionados na rede elétrica são modulados na forma de uma onda
quadrada, com freqüência de 120kHz, amplitude de 5Vpp e 1ms de duração. Esse
tipo de modulação é conhecida como On Off Keying (OOK). Neste caso, a
modulação dos dados é feita da seguinte forma: se houver um bit com valor 1 a ser
transmitido, um sinal elétrico com essas características é gerado e adicionado na
rede elétrica. Caso o valor do bit seja 0, nenhum sinal é gerado (PADRÃO X10,
2009). A figura 2 ilustra o processo.
13
FIGURA 2 – PROCESSO DE MODULAÇÃO OOK (ON OFF KEYING)
SINAL MODULADO
1
0
1
1
0
0
1
BITS DE INFORMAÇÃO
FONTE: PRÓPRIA
4.2 ENDEREÇAMENTO NO SISTEMA X10
Equipamentos X10 utilizados para transmissão e gerenciamento dos dados
que trafegam pela rede elétrica são denominados controladores, entretanto, os
equipamentos utilizados para acionamento de cargas como lâmpadas, tomadas,
cortinas
elétricas,
instalados
em
cada
ponto
automatizado
da
residência
denominam-se módulos receptores.
O endereçamento X10 possibilita 256 combinações possíveis, com a
vantagem de vários módulos receptores poderem compartilhar o mesmo endereço,
constituindo uma zona de automação. As 256 combinações estão distribuídas em 16
letras (House Code¹), onde cada letra possui 16 números com duas características,
Unit Code² ou Function Code³. Todo controlador contém configuração House Code,
porém, os módulos receptores, além dos House Codes, também possuem
endereçamento Unit Code e controle realizados através do Function Code (DIGITAT,
2009).
Como exemplo pode-se estabelecer em uma mesma residência a macror
região A para controlar 16 zonas de iluminação, a macro região B para controlar 16
1 - House Code: Atribui macror regiões para automação da residência;
2 - Unit Code: Determina o endereçamento do módulo receptor na macror região definida pelo House
Code;
3 - Function Code: Indica ao módulo receptor o comando solicitado pelo usuário.
14
zonas de tomadas, a macror região C para controlar 16 zonas de sensores de
presença, e assim por diante.
4.3 COMUNICAÇÃO NO SISTEMA X10
Baseado nas informações do item 4.2, é apresentada a estrutura dos
pacotes de dados utilizados para o controle dos módulos receptores (vide Apêndice
A). Os 4 primeiros bits do pacote de dados são utilizados para sinalizar o início da
comunicação, logo após são transmitidos 4 bits para o House Code, finalizando com
a transmissão de 5 bits referentes ao Unit Code ou ao Function Code (figura 3).
FIGURA 3 – PACOTE DE DADOS X10.
FONTE: PRÓPRIA
Cada bit dos comandos House Code e Unit Code ou Function Code é
enviado 2 vezes, primeiramente é transmitido o valor do bit e logo em seguida seu
valor complementar, resultando em um pacote de dados de 22 bits, que por sua vez
é transmitido duas vezes (figura 4). Toda essa redundância serve para aumentar a
segurança e a confiabilidade da transmissão.
FIGURA 4 – REDUNDÂNCIA APLICADA AOS BITS NA TRANSMISSÃO X10.
FONTE: PRÓPRIA
1 - House Code: Atribui macror regiões para automação da residência;
2 - Unit Code: Determina o endereçamento do módulo receptor na macror região definida pelo House
Code;
3 - Function Code: Indica ao módulo receptor o comando solicitado pelo usuário.
15
Após a transmissão duplicada dos 22 bits, ou seja, 44 bits transmitidos em
22 ciclos sinusoidais, são necessários 3 ciclos sem nenhuma informação transmitida
para que o sistema aceite outro comando de automação. Este caso denomina-se
Tempo de Silêncio4.
Por exemplo, para ligar um módulo X10 que esteja na macror região A
(House Code A) e considerando que este seja o módulo de número 2 (Unit Code 2),
a seguinte seqüência binária deveria ser enviada, um bit por cada passagem por
zero (sincronismo)(BURROUGHS, 2002):
- Envia o endereçamento 2 vezes:
1110
01101001
10101001
01
START
HOUSE CODE A
UNIT CODE 2
SUFIX
1110
01101001
10101001
01
START
HOUSE CODE A
UNIT CODE 2
SUFIX
- Aguarda 3 ciclos completos (6 passagens por zero):
000000
- Envia o comando 2 vezes:
1110
01101001
01011001
10
START
HOUSE CODE A
ON
SUFIX
1110
01101001
01011001
10
START
HOUSE CODE A
ON
SUFIX
- Aguarda mais 3 ciclos completos para enviar o próximo comando:
000000
Podemos observar que o unit code e o function code vem sempre depois do
house code. O que os diferencia é o sufixo.
Então, para um comando de ligar é necessário enviar 100 bits de informação,
o que corresponde a um intervalo de tempo de 833ms.
4 – Para os comandos Brigth e Dim apresentados no apêndice A, não há Tempo de Silêncio.
16
5. ESPECIFICAÇÃO TÉCNICA
O diagrama da figura 5 nos oferece uma visão geral do projeto.
FIGURA 5 – VISÃO GERAL DO PROJETO
FONTE: PRÓPRIA
Com base no diagrama, o projeto é subdividido em 6 partes:
a) Interface com o usuário;
b) Fonte de alimentação:
c) Microprocessador;
d) Circuito de transmissão de dados;
e) Circuito de sincronização;
f) Circuito de recepção de dados.
5.1 INTERFACE COM O USUÁRIO
Através de uma interface gráfica via aplicativo rodando sobre um
microcomputador padrão IBM PC o usuário tem uma visão completa do sistema de
17
automação de sua residência, podendo controlar individualmente os dispositivos,
fazer
troca
de
cenários
(acionamento
programado
de
vários
dispositivos
simultaneamente) ou ainda programar ações como a simulação de presença e o
acionamento através de timmers (com tempos pré definidos). Tanto os comandos
quanto as programações são enviadas para o controlador via interface USB. Um
exemplo de uma instalação típica é mostrada na figura 6.
FIGURA 6 – CONTROLE DOS DISPOSITIVOS X10 VIA APLICATIVO
FONTE: PRÓPRIA
Já o display de LCD tem uma função apenas informativa.
5.2 FONTE DE ALIMENTAÇÃO
De modo a deixar o módulo controlador com uma montagem bem compacta
e como a corrente de alimentação tem um valor baixo (menor que 300mA), o projeto
prevê o uso de uma fonte de alimentação sem o uso de transformador
VRMS
(transformerless). O cálculo da corrente é feito da seguinte I
RMS =
XC
forma:
Para uma tensão padrão de alimentação de 127 Vca, temos:
I RMS =
VRMS
= 127(2π 60C ) ≅ 48mA / µF
XC
18
Como o circuito necessita de duas tensões estabilizadas (+ 15Vcc e +5Vcc),
inseriu-se após a etapa de filtragem composta de um capacitor e de um diodo zener
dois circuitos reguladores monolíticos. O circuito completo pode ser visto na figura 7.
FIGURA 7 – FONTE DE ALIMENTAÇÃO DO CONTROLADOR
FONTE: PRÓPRIA
Essa etapa do projeto foi baseada no artigo técnico TB008 (Transformerless
Power Suplly) da Microchip.
5.3 MICROPROCESSADOR
Este é o componente principal do projeto, pois a implementação do protocolo
X10 é feita toda através de firmware. Para desempenhar esta função essencial, foi
selecionado o microprocessador PIC 16F877A fabricado pela Microchip.
A seleção deste modelo foi feita pela sua grande versatilidade, ao
conhecimento em programação adquirido ao longo do curso, a sua memória FLASH
interna para armazenamento do programa, a sua capacidade integrada de fazer a
modulação PWM (Pulse Wide Modulation) e a variedade de configurações de seus
pinos de entrada e de saída. O diagrama em blocos que mostra a arquitetura interna
do microprocessador pode ser visto no anexo A.
5.4 CIRCUITO DE TRANSMISSÃO DE DADOS
É o circuito responsável por fazer a transformação dos bits de dados em um
sinal modulado, o qual é enviado sobre a rede elétrica. É composto por uma etapa
de modulação de 120kHz e um filtro passa alta. O padrão de modulação adotado é o
19
OOK, conforme visto no item 4.1. A oscilação do modulador é obtida pela saída
PWM do microcontrolador e um amplificador do tipo “push-pull” condiciona o sinal de
saída. O circuito completo pode ser visto na figura 8.
FIGURA 8 – CIRCUITO DE TRANSMISSÃO DE DADOS
FONTE: PRÓPRIA
5.5 CIRCUITO DE SINCRONIZAÇÃO
Esse é um dos circuitos mais importantes do controlador, pois é através do
sinal de sincronismo que os dados são transmitidos e/ou recebidos. Ele é composto
por um detector de passagem por zero que gera na saída um pulso retangular com
5Vcc e 200 s de duração. Esse pulso é encaminhado para o pino 33 do
microprocessador, que por sua vez detecta a bordas de subida gerando a
interrupção externa. Quando isso ocorre, o algoritmo verifica se há dados a serem
recebidos ou transmitidos e executa a lógica de cada caso. Esse processo é melhor
detalhado no fluxograma funcional (item 6).
FIGURA 9 - CIRCUITO DE SINCRONISMO
200 s
8,333
ms
FONTE: PRÓPRIA
20
5.6 CIRCUITO DE RECEPÇÃO DE DADOS
Essa etapa é responsável por demodular o sinal proveniente da
comunicação com outro dispositivo X10. Ela é composta por filtro passa alta, um
limitador de tensão e um detector de portadora de 120kHz (figura 10). A detecção da
portadora é feita através de um filtro PLL (Phase Locked Loop). O detalhamento do
funcionamento do circuito PLL é feito no item 5.6.1. Após o sinal ser demodulado, o
trem de bits contendo a informação é aplicado a entrada do microprocessador, e um
algoritmo de leitura faz a decodificação / interpretação desses dados.
FIGURA 10 – CIRCUITO DE RECEPÇÃO DE DADOS
PIC16F877A
V1
127 Vrms
60 Hz
0°
3
C1
100nF
R1
1MO
0
2
FILTRO PLL
DETECTOR DE
PORTADORA
IN
6,8V
1
6,8V
0
FONTE: PRÓPRIA
5.6.1 Filtro PLL (Phase Locked Loop)
PLL é o nome de um dos mais importantes circuitos encontrados em
aplicações eletrônicas de todos os tipos. O PLL está para a freqüência assim como o
amplificador operacional está para a tensão (BRAGA, Newton C, 2007).
A explicação do funcionamento desse circuito baseia-se no diagrama em
blocos da figura 11.
21
FIGURA 11 – DIAGRAMA EM BLOCOS DE CIRCUITO PLL
FILTRO
PASSA BAIXA
AMPLIFICADOR
DE ERRO
SAÍDA
COMPARADOR
DE FASE
VCO
OSCILADOR CONTROLADO POR TENSÃO
CIRCUITO DE TEMPO
C
R
FONTE: REVISTA SABER ELETRÔNICA, ANO 19, NÚMERO 127, NOVEMBRO / DEZEMBRO 2007
O primeiro bloco do circuito é comparador de fase. Nele são comparadas as
fases do sinal de entrada com a gerada pelo VCO (Voltage Controlled Oscillator) e
em sua saída aparece uma tensão proporcional a diferença entre as fases. Esse
sinal de tensão é então aplicado a um filtro passa baixa e depois de amplificado, é
encaminhado a entrada do bloco VCO. Esse sinal de tensão serve para controlar a
freqüência de oscilação. O bloco VCO gera um sinal cuja freqüência pode ser
deslocada dentro de uma faixa determinada pela relação RC externa. O sinal de
saída do bloco é então realimentado no comparador de fase fechando o loop.
Considerando uma situação inicial que não existe sinal de entrada, então o
sinal de saída do PLL é o próprio sinal do bloco VCO, cuja freqüência central é dada
pela relação:
f0 =
1
R.C
Quando um sinal com freqüência f é aplicado à entrada, então o comparador
de fases entrará em ação e comparará a freqüência deste sinal com a gerada pelo
bloco VCO. Se as freqüências forem diferentes, o sinal de saída do comparador será
um sinal cuja freqüência é (f-f0). Se essa diferença for pequena, então um sinal com
uma leve oscilação é aplicado a entrada do bloco VCO. A reação do VCO a esse
sinal será uma alteração na freqüência de oscilação, cujo valor tende a se aproximar
da freqüência f do sinal de entrada.
No momento em que f=f0 a saída do comparador de fases vai à zero,
“travando” o VCO exatamente na freqüência de entrada. A figura 12 ilustra este
processo.
22
FIGURA 12 – VCO TRAVANDO O SINAL DE SAÍDA
TRAVAMENTO
FONTE: REVISTA SABER ELETRÔNICA, ANO 19, NÚMERO 127, NOVEMBRO / DEZEMBRO 2007
Utilizando esse conceito e implementando um circuito de detecção de tom,
podemos fazer a detecção da portadora de 120kHz, fazendo dessa forma a
demodulação do sinal (figura 13).
FIGURA 13 – DEMODULAÇÃO DO SINAL ATRAVÉS DO FILTRO PLL
FILTRO PLL
FONTE: PRÓPRIA
23
6. FLUXOGRAMA FUNCIONAL
O fluxograma demonstra a lógica de funcionamento do algoritmo que
implementa o protocolo X10.
24
Analisando o fluxograma, pode-se observar que o ponto de partida do
algoritmo é sempre baseado nas interrupções. Elas podem ser serial ou externa. A
interrupção serial é gerada quando o usuário executada alguma ação, como enviar
um comando. No instante em que os dados chegam ao buffer, o microprocessador
executa as rotinas relativas a essa tarefa e aguarda a próxima interrupção. Já a
interrupção externa é gerada toda vez que o sinal da portadora fundamental passa
por zero. Isso ocorre a cada 8,333 ms.
7. PLANO DE TRABALHO
Para que o projeto possa ser bem sucedido, é necessário que seja feito além
das atividades técnicas, um planejamento das atividades identificando os
responsáveis e o prazo de realização de cada tarefa. Esse planejamento está
detalhado na tabela 1. Outro ponto importante é o detalhamento dos custos
envolvidos no projeto, o qual está demonstrado na tabela 2.
TABELA 1 – RELAÇÃO DE MACRO E MICRO ATIVIDADES
RELAÇÃO POR MACRO ATIVIDADES
ID
RESPONSÁVEL
PRAZO
01 Entrega da proposta
Equipe
26/02/09
02 Apresentação oral da proposta
Equipe
05/03/09
03 Entrega final da proposta
Equipe
20/03/09
Equipe
22/04/09
05 Apresentação oral do item 04 para a banca
Equipe
05/05/09
06 Entrega da monografia - Especificações Técnicas
Equipe
01/06/09
07 Apresentação oral do item 06 para a banca
Equipe
16/03/09
08 Apresentação de 20% das implementações
Equipe
30/06/09
09 Apresentação de 60% das implementações
Equipe
18/07/09
10 Entrega da monografia - Implementações
Equipe
28/09/09
11 Avaliação final das implementações
Equipe
06/10/09
04
TAREFA
Entrega da monografia – Introdução e
Fundamentação Teórica
25
12 Entrega final da monografia completa
Equipe
26/10/09
13 Apresentação final do projeto
Equipe
10/11/09
14 Entrega da versão definitiva da monografia
Equipe
30/11/09
RELAÇÃO POR MICRO ATIVIDADES
ID
TAREFA
RESPONSÁVEL
PRAZO
15 Compra dos componentes eletrônicos
Wagner
02/06/09
16 Compra dos módulos de acionamento
Mauro
19/06/09
17 Projeto dos circuitos
Equipe
01/07/09
18 Simulação dos protótipos
Mauro
31/07/09
19 Montagem dos protótipos
Wagner
16/08/09
20 Diagramação da PCI
Wagner
28/09/09
21 Montagem das bibliotecas X10
Mauro
16/08/09
22 Programação do PIC
Equipe
16/08/09
23 Desenvolvimento da interface do aplicativo
Equipe
30/09/09
TABELA 2 – RELAÇÃO DE CUSTOS PREVISTOS NO PROJETO
PLANILHA DE CUSTOS
ITEM
QUANTIDADE
VALOR UNITÁRIO
VALOR TOTAL
Microcontrolador
01
R$13,00
R$13,00
Display de LCD
01
R$18,90
R$18,90
CI PLL
01
R$7,00
R$7,00
Componentes
Diversos
R$66,00
R$66,00
Miscelania
Diversos
R$30,00
R$30,00
Confecção da PCI
01
R$30,00
R$30,00
$49,99
$49,99
(R$ 97,65)
(R$ 97,65)
01 KIT contendo:
Módulos de
acinamento X10
- 3 lamp modules;
- 3 appliance modules;
- 2 wall switches;
TOTAL
R$262,55
26
8. IMPLEMENTAÇÃO
Como forma de modularizar o projeto e evitar eventuais problemas na
implementação dos circuitos (comuns em montagens eletrônicas), todo o hardware
desenvolvido (figura 14) foi dividido em vários blocos, sendo estes previamente
simulados em protoboard para a realização de suas respectivas análises. Essa
metodologia colabora na descoberta e na correção dos problemas, garantindo que
cada bloco incluso no projeto não danifique a ele próprio e nem ao restante dos
circuitos já testados, mas apresente as características idealizadas.
Para elaboração do software e do firmware foram utilizadas as plataformas
Borland Builder C++ 5 e CCS (também conhecida como PIC C Compiler),
respectivamente. Essas plataformas auxiliam no desenvolvimento do código fonte
pois a cada pré compilação elas verificam erros de sintaxe e impossibilitam a
compilação do programa caso hajam erros.
FIGURA 14 – MONTAGEM COMPLETA NO PROTOBOARD
FONTE – PRÓPRIA.
8.1 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO HARDWARE
A fonte de tensão transformerless foi o primeiro circuito a ser montado e
simulado (figura 15). A análise de seu funcionamento foi realizada utilizando um
27
variador de tensão alternada (VARIAC) de 0 a 240Vac, onde gradualmente foi
aplicada uma tensão elétrica à fonte transformerless até aproximadamente 127 Vac e
com um voltímetro avaliada a saída do circuito correspondente a 5 Vcc.
Mesmo tendo funcionado logo na primeira montagem, a tabela 03 apresenta
os problemas apresentados pela fonte:
TABELA 3 – PROBLEMAS ENCONTRADOS NA FONTE DE ALIMENTAÇÃO TRANSFORMERLESS
Problema
A fonte transformerless
parou de funcionar
após a inclusão de
01
todos os blocos de
hardware do projeto.
A troca dos capacitores
de poliéster para
aumentar a capacidade
02 de corrente da fonte
desestabilizou a tensão
na saída do circuito
transformerless.
Motivo
A carga consumida por todos os
circuitos estava saturando sua
capacidade de distribuição de
corrente.
Redimensionado os capacitores de
poliéster 2µ2F para 3µ3F, pois
sabendo que a tensão Vrms é
constante, a corrente resultante é
corrigida apenas com a alteração da
reatância capacitiva.
A fonte transformerless é um
circuito dependente da corrente
consumida.
I consumida > I
transformerless
Resp.: Tensão Baixa
I consumida < I
transformerless
Resp.: Tensão Alta
Onde: I = Corrente
FIGURA 15 – CIRCUITO TRANSFORMERLESS NO PROTOBOARD
FONTE – PRÓPRIA.
Correção
Adicionado um potenciômetro na
saída da fonte transformerless para
ajustar a corrente consumida.
28
Para a simulação do circuito de recepção (figura 16) de dados utilizou-se
uma fonte externa de 5Vcc para alimentar o circuito e um gerador de funções
sintonizado em 120kHz, onda quadrada e 200mVpp.
FIGURA 16 – CIRCUITO DE RECEPÇÃO DE DADOS NO PROTOBOARD
FONTE – PRÓPRIA.
Nos testes realizados não houveram problemas relacionados ao circuito,
porém para sintonizar o PLL, o resistor de 2,4k
LM567
está
dimensionado
para
frequências
sugerido pelo datasheet do CI
de
100kHz
(figura
17),
consequentemente substituiu-se o resistor por um potenciômetro de 0 a 10k ,
facilitando tanto a sintonia de 120kHz, para a correção de possíveis erros na
frequência decorrente da transmissão.
FIGURA 17 – CIRCUITO MODELO, PREPRESENDADO NO DATASHEET DO LM567
FONTE - NACIONAL SEMICONDUCTOR, LM567/LM567C TONE DECODER, FEVEREIRO 2003.
29
8.2 TESTES, MEDIÇÕES E CONFIGURAÇÕES DO FIRMWARE
Por suportar a estrutura C ANSI e possuir mais recursos de simulação, a
plataforma Borland Builder C++ 5 foi adotada para o desenvolvimento e simulação
prévia do firmware. Após a conclusão desta etapa, o código fonte foi migrado para a
plataforma CCS a qual gera um arquivo hexadecimal específico para o
microcontrolador. Quanto à funcionalidade do firmware, esta foi simulada e corrigida
utilizando o Kit Microcontrolador PIC desenvolvido pela empresa Brastron (figura
18).
FIGURA 18 – KIT MICRCONTROLADOR PIC (BRASTRON)
FONTE – BRASTRON INDÚSTRIA ELETRÔNICA.
O primeiro problema encontrado pela plataforma CCS durante o início dos
testes de compilação indicava insuficiência de memória para o armazenamento da
tabela dos códigos do protocolo X10 (Apêndice A). Este foi resolvido com a
alteração do tipo das variáveis utilizadas na biblioteca X10Codes (Apêndice C),
substituindo as variáveis do tipo int por variáveis do tipo short. A simples troca do
tipo das variáveis fez com que o número de bits reservados por função reduzisse por
16 vezes, uma vez que variáveis do tipo int instanciam 16 bits e as variáveis do tipo
short instancia 1 bit (figura 19).
30
FIGURA 19 – AMOSTRA DA CORREÇÃO DO SOFTWARE, REFERENTE AOS VALORES ATRIBUIDOS PARA OS HOUSE
CODES
// HOUSE CODES
short HouseA[8] =
short HouseB[8] =
short HouseC[8] =
short HouseD[8] =
short HouseE[8] =
short HouseF[8] =
{0,1,1,0,1,0,0,1};
{1,0,1,0,1,0,0,1};
{0,1,0,1,1,0,0,1};
{1,0,0,1,1,0,0,1};
{0,1,0,1,0,1,1,0};
{1,0,0,1,0,1,1,0};
FONTE – PRÓPRIA.
Um problema que foi detectado e não pode ser solucionado, foi relativo ao
compilador CCS que ao chamar uma função que tem como parâmetro de entrada
um vetor de ponteiros, e o índice dos elementos não começam em zero, o programa
assume um comportamento aleatório na execução da lógica programada.
A função que usa este tipo de estrutura é a Mover (figura20). Essa função
faz parte da função MontaFrame (figura21) que tem como objetivo montar o frame
de dados que será transmitido.
FIGURA 20 – FUNÇÃO MOVER
void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant)
{
int k=0;
for (k;k<Quant;k++)
{
Dst[IniDst + k] = Src[IniSrc + k];
}
}
FONTE – PRÓPRIA.
FIGURA 21 – FUNÇÃO MONTA FRAME
Void MontaFrame(void)
{
//Monta o frames com 100 bits a ser transmitido
Mover(TxFrame,0,Start,0,4);
//4 bits
Mover(TxFrame,4,House,0,8);
//8 bits
Mover(TxFrame,12,Unit,0,10);
//10 bits
Mover(TxFrame,22,Start,0,4);
//4 bits
Mover(TxFrame,26,House,0,8);
//8 bits
Mover(TxFrame,34,Unit,0,10);
//10 bits
Mover(TxFrame,44,Wait,0,6);
//6 bits
Mover(TxFrame,50,Start,0,4);
//4 bits
Mover(TxFrame,54,House,0,8);
//8 bits
Mover(TxFrame,62,Function,0,10); //10 bits
Mover(TxFrame,72,Start,0,4);
//4 bits
Mover(TxFrame,76,House,0,8);
//8 bits
Mover(TxFrame,84,Function,0,10); //10 bits
Mover(TxFrame,94,Wait,0,6);
//6 bits
}
FONTE – PRÓPRIA.
31
Para tentar solucionar esse problema foram realizadas as seguintes etapas:
Análise da sintaxe das funções MontaFrame, Mover e do vetor TxFrame;
Simulação da função MontaFrame no Borland Builder C++ 5;
Atualização do compilador CCS;
Apesar das funções funcionarem no ambiente do Borland e da atualização
do compilador CCS para a última versão (4.057), nenhuma das tentativas resultou
em êxito. Para contornar esse problema, a lógica da função MontaFrame teve que
ser substituída por vários laços for. Para consultar a função MontaFrame com as
modificações, consulte a página 47 (Apêndice B).
Outro problema que foi detectado na análise do sinal de saída do PWM,
foram picos irregulares de tensão com intervalos de aproximadamente 40µs.
Empiricamente constatou-se que há alteração no valor utilizado para configuração
do duty cicle é de acordo com o tipo da variável declarada para a função PWM.
Caso a declaração seja feita com o tipo long int, o PWM trabalha com 10 bits e com
excursão máxima numérica é de 0 a 1023, mas para o caso da função PWM
declarada como int, o sistema trabalha com 8 bits, possuindo conseqüentemente
excursão máxima numérica de 0 a 255.
A maior dificuldade apresentada foi não encontrar nenhuma referência
bibliográfica que explicitasse esse modelo.
O ponto fundamental para a funcionalidade integrada do hardware com o
software está vinculado a compreensão de um erro existente no artigo AN236
(X-10® Home Automation Using the PIC16F877A) desenvolvido pela Microchip. O
exemplo indicado no 4º parágrafo, da 2ª coluna, da 13ª pagina do artigo, induz ao
pensamento de que a utilização da redundância complementar dos bits atribuídos ao
House Code é realizada em blocos de 04 bits (figura 22).
32
FIGURA 22 - EXEMPLO INCORRETO DO PACODE DE DADOS PARA TRANSMISSÃO X10.
FONTE: MICROCHIP TECHNOLOGY, 2002.
O conhecimento adquirido através de outros artigos e buscas na internet,
favoreceram na compreensão do erro no artigo da Microchip, onde a correção
impondo um bit complementar para cada bit transmitido no House Code levou ao
funcionamento total da base do projeto controlador X10.
Obs.: o código fonte de todo o firmware encontra-se no Apêndice B.
8.3 CONFIGURAÇÕES DO SOFTWARE
Para que o usuário possa ter um ambiente para interagir com o controlador,
foi desenvolvida uma interface gráfica onde o mesmo pode acessar todos os
recursos disponíveis, como controlar um dispositivo individualmente, configurar um
cenário ou ainda cadastrar uma seqüência de ações para o simulador de presença.
A interface foi divida em 4 partes para uma melhor organização estrutural,
sendo elas:
- Tela Principal;
33
- Configuração de dispositivos;
- Configuração de cenários;
- Configuração do simulador de presença.
Na tela principal (figura 23), o usuário pode acessar as funções já
programadas e ainda controlar os dispositivos cadastrados.
FIGURA 23 – TELA PRINCIPAL DA INTERFACE GRÁFICA.
FONTE: PRÓPRIA.
Além dos comandos, essa tela traz algumas informações como o status dos
equipamentos cadastrados, o último comando X10 detectado na rede (quando outro
controlador envia sinais pela rede), o nível de sinal do modem celular e o
detalhamento da última mensagem de texto recebida (número do celular que
originou a mensagem, data e hora).
Através das mensagens de texto é possível comandar um dispositivo
específico, trocar um cenário ou ainda habilitar / desabilitar o simulador de presença.
34
Para o usuário principiante, quando ele acessar alguma das funções pela
primeira vez, o sistema detectará e o ajudará com algumas telas de help
automáticas, explicando sobre o uso desta funcionalidade (figura 24).
FIGURA 24 – TELA DE HELP DE COMO CADASTRAR UM NOVO DISPOSITIVO.
FONTE: PRÓPRIA.
Para que os dispositivos de controle existentes possam ser colocados no
software, uma tela de configuração de dispositivos pode ser acessada através do
menu principal (figura 25).
FIGURA 25 – TELA DE CONFIGURAÇÃO DOS DISPOSITIVOS.
FONTE: PRÓPRIA.
35
Nessa tela pode-se escolher o house code, o unit code e ainda fornecer uma
descrição sobre o dispositivo (Ex: A01 – Abajur da Sala). Ela ainda permite excluir
algum dispositivo já cadastrado.
Para a configuração dos cenários, a interface provê uma tela para este fim
específico (figura 26).
FIGURA 26 – TELA DE CONFIGURAÇÃO DOS CENÁRIOS.
FONTE: PRÓPRIA.
Aqui o usuário pode nomear o cenário, incluir os dispositivos a serem
controlados e ainda definir uma ação para cada dispositivo. Assim depois de
concluída essa configuração, o usuário terá a disposição um ambiente pré
configurado ao qual ele pode selecionar a sua utilização pela tela principal. Como
exemplo, o cenário “jantar” pode deixar toda a iluminação da sala com um brilho
mais aconchegante para esta ocasião.
A última estrutura é a tela para configuração da seqüência de ações do
simulador de presença (figura 27).
36
FIGURA 27 – TELA DE CONFIGURAÇÃO DO SIMULADOR DE PRESENÇA.
FONTE: PRÓPRIA.
Através dessa tela o usuário pode cadastrar diversas seqüências temporais
como os respectivos comandos para cada dispositivo. Isso permite, por exemplo,
que quando a pessoa viaja, a sua casa pode ficar no modo simulador de presença,
onde a seqüência pré definida é executada simulando assim a presença humana na
casa.
Para uma maior facilidade na utilização da interface, em alguns campos está
habilitada a função “F1”, a qual fornece um descritivo de ajuda sobre aquele campo
em questão. No exemplo da figura 28 está a ajuda para o campo house code.
FIGURA 28 – TEXTO DE AJUDA SOBRE O CAMPO HOUSE CODE.
FONTE: PRÓPRIA.
37
8.4 PLACA DE CIRCUITO IMPRESSO (PCI)
Para confecção da placa de circuito impresso, o software escolhido para
fazer o roteamento da placa foi o Proteus versão 7.4. A figura 29 mostra o layout das
trilhas e componentes enquanto que a figura 30 mostra uma visão 3D roteada.
FIGURA 29 – LAY OUT DA PLACA DO CONTROLADOR
FONTE – PRÓPRIA
FIGURA 30 – VISÃO 3D DA PLACA ROTEADA
FONTE – PRÓPRIA
38
8.5 RELAÇÃO DE COMPONENTES
TABELA 4 – LISTA DE COMPONETES
!
#!
%
#
"
#
#
"
#
)
#
#
$
#
)
- .
-6
-6
-6
-6
-6
-6
-6 &
-
& ' #
& ' "
* + ,*
/ 0 1
" " #)!
""! $"
!! $"
!! - 4
!! #)!
!!! #% 5
! #% 5
% - 4
)( - 4
!! - 4
%! - 4
! - 4
!! 5
" " - 4
"" - 4
"" - 4
6- $ ((/
7& %$(
()7 !)
()7 !
( !%
( %
1#"# 7
8 5"9
, -6
"2 "2!3
0
0
0
! "!
! "!
! $!
! !%
! !(
" !!
#! !!
! "!
! !
! !
! !%
! #%
! !
! !
! !%
! !%
! !%
! !%
! !%
! !
! !%
! !%
! !%
% !
# )!
! %!
! %!
! ("
! ("
"% !!
! #!
! )!
! "!
! "!
! $!
! #%
! )
" !!
#! !!
! 3!
! #!
! #!
! %
! %!
! !
! !
! #!
! !%
! !
! !
! "!
! !
! !%
! !%
! !
% !
# )!
! %!
! %!
! ("
! ("
"% !!
! !
! )!
39
-
$& : ;
#& : ;
+ )!!(
+% 3
$
$
7- #2 $
#!
#
<
<
=
$
- >
?
,
@
A
7
#
$
$
(
#
#
C
#
#
#
1
1
1
1
1
1
D
! !B
%
%
#(
#!!
!!
)(!
$#!
B
B%
#8)
!B
#(B
"$B
!B
$ !B
&#
%
)
E
-%)(
-%)
-%%(
#+ #3!(
, -6 !
"!
!B
!!
!!
! !
! !
! !
! !
!!
$!
! !"
%!
! !
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
! !)
# )!
#!
! (!
! (!
! (!
"!
! !
!!
!!
!!
! #!
! !
! !
! !
!!
$!
!
%!
! !
!!
! #)
! #)
! !)
! !)
! !)
! !)
! !)
!#
! !)
! !)
!!
! !)
!!
# )!
#!
)!
! (!
! (!
# $!
$!
!!
# )%
40
9. RESULTADOS
Segundo a especificação do protocolo (PADRÃO X10, 2009) alguns
parâmetros devem ser atendidos para garantir a comunicação entre os dispositivos:
a) Frequencia de oscilação da portadora: 120kHz ± 5%
A frequencia de oscilação na saída do PWM obtida foi 120kHz (figura 31)
FIGURA 31 – SINAL DE SAÍDA DO PWM
FONTE – PRÓPRIA
b) Deteccção de cruzamento por zero: 100 s ± 100 s
O circuito de sincronismo acusa a passagem por zero com um erro de 41 s (figura 32).
FIGURA 32 – SINAL DE SAÍDA DO CIRCUITO DE DETECÇÃO DE PASSAGEM POR ZERO
FONTE – PRÓPRIA
41
c) Tamanho da portadora transmitida: 1ms ± 50 s
O tamanho da portadora obtida foi extamente 1ms (figura 33)
FIGURA 33 – TAMANHO DA PORTADORA TRANSMITIDA
FONTE – PRÓPRIA
d) Potência média de saída do transmissor: 60mW (5Vpp, 5 )
Pelas
medições
realizadas,
o
estágio
de
amplificação
fornece
aproximadamente 130mW de potência na saída.
Nos testes de banca, todas as transmissões foram bem sucedidas. Apesar
disso, experiências mostram que casa maiores que 185 m2 passam a ser um
problema para a cobertura do sinal. O sintoma mais comum é o envio e o não
recebimento de comandos. (PADRÃO X10, 2009)
Casos onde o transmissor está em uma fase e o módulo receptor está em
outra, há a necessidade de se fazer o acoplamento entre as fases. Isso pode ser
feito através de bridges ou com a colocação de capacitores de 0,1 F entre as fases.
O teste de acoplamento utilizando capacitores foi realizado em laboratório sendo
bem sucedido.
42
10. CONCLUSÃO
O desenvolvimento desse projeto abrangeu uma série de fatores
importantes, que vão do acadêmico ao comercial. Do ponto de vista acadêmico sua
importância está na interdisciplinaridade do conceito, que para sua realização
necessitou conhecimentos sobre modulação de sinais, algoritmos, programação em
C
e
C++,
comunicação serial,
protocolos
de
comunicação,
interrupções,
microprocessadores, eletrônica digital, circuitos elétricos e eletrônica básica. Do
ponto de vista comercial, destaca-se o alto potencial de comercialização devido à
aplicabilidade, uma vez que o uso da rede elétrica como meio de transmissão de
dados nos permite automatizar qualquer tipo de residência, sendo ela nova ou
antiga, ou ainda espaços comerciais como teatros, cinemas e salas comerciais.
Aliado a tudo isso ainda temos um baixo custo de produção, o qual pode ser
reduzido mais ainda se produzido em escala industrial, e a interatividade, visto que a
interface gráfica fornece um ambiente único onde o usuário pode controlar todas as
funções com comodidade, praticidade e segurança, além claro da funcionalidade da
mensagem de texto, que permite o acesso remoto das funções do controlador.
Uma característica não explorada na fase do projeto foi a bidirecionalidade
da comunicação celular via mensagem de texto, que hoje só tem a função de
recebimento. Porém com as devidas modificações essa funcionalidade pode ser
adicionada ao controlador para, por exemplo, enviar uma mensagem de texto
quando detectada a presença de intrusos.
Apesar do foco acadêmico, o desenvolvimento desse tipo de projeto
representa não só a aplicação dos conhecimentos obtidos na faculdade, mas
também uma excelente oportunidade de negócios para os futuros engenheiros.
43
9. REFERÊNCIAS BIBLIOGRÁFICAS
AURESIDE – ASSOCIAÇÃO BRASILEIRA DE AUTOMAÇÃO RESIDENCIAL –
PROTOCOLOS . Disponível em:
http://www.aureside.org.br/temastec/default.asp?file=protocolos09.asp. Acesso em
23/02/2009
PADRÃO X10. Disponível em: http://members.tripod.com/~albt/x10.htm. Acesso em
25/02/2009
A CASA INTELIGENTE. Disponível em:
http://www.acasainteligente.com/imprensa.asp?idImp=2. Acesso em 25/02/2009
DIGITAT - DIGITAL HABITAT. Disponível em:
http://digitat.info/modules/sections/index.php?op=printpage&artid=5. Acesso em 25/02/2009
BRAGA, Newton C.. Conhecendo o PLL. Revista Saber Eletrônica, ano 19, numero 127,
novembro / dezembro 2007.
BURROUGHS, Jon. X10 HOME AUTOMATION USING PIC16F877A. Artigo técnico
AN236.Microchip Tecnology Inc., 2002
D’SOUZA, Stan. TRANSFORMELLES POWER SUPPLY. Artigo técnico TB008.Microchip
Tecnology Inc., 2000
10. DOCUMENTOS CONSULTADOS
PROJETO EM X10. Disponível em:
http://maia.empacotal.com/nuno//plm/descrica.htm . Acesso em 25/02/2009
X10 – CUSTOMER SUPPORT. Disponível em: http://www.x10.com/support2.htm. Acesso
em 23/02/2009
BOLZANI,Caio Augustus M.. Residências Inteligentes. 1 Ed. São Paulo: Livraria da Física,
2004.
MORESCHI, Eduardo H. ; SOARES,Gyl. Sistema de Acionamento Residencial Através
da Rede Elétrica. Trabalho de Conclusão de Curso. Curitiba, 2007.
PIC16F87X Data Sheet: 28/40 – Pin 8 – Bit CMOS FLASH Microcontrollers.
Disponível
em:
http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf
Acesso em 23/03/2009.
.
44
APÊNDICE A – LISTA DE CÓDIGOS X10
TABELA A1 – ENDEREÇO DOS DISPOSITIVOS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
NUMBER CODE
X1 X2 X4 X8
0
1
1
0
1
1
1
0
0
0
1
0
1
0
1
0
0
0
0
1
1
0
0
1
0
1
0
1
1
1
0
1
0
1
1
1
1
1
1
1
0
0
1
1
1
0
1
1
0
0
0
0
1
0
0
0
0
1
0
0
1
1
0
0
X16
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP
TABELA A2 – MACRO REGIÕES
HOUSE CODES
H1 H2 H4
A
0
1
1
B
1
1
1
C
0
0
1
D
1
0
1
E
0
0
0
F
1
0
0
G
0
1
0
H
1
1
0
I
0
1
1
J
1
1
1
K
0
0
1
L
1
0
1
M
0
0
0
N
1
0
0
O
0
1
0
P
1
1
0
FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP
TABELA A3 – CÓDIGO DAS FUNÇÕES
All units OFF
All lights ON
ON
OFF
Dim
Bright
All lights OFF
Extended Code
Hail Request
Hail Acknowledge
Pre-set Dim
Extended Data (analog)
Status: ON
Status: OFF
Status: Request
FUNCTION CODE
X1
X2
X4
0
0
0
0
0
0
0
0
1
0
0
1
0
1
0
0
1
0
0
1
1
0
1
1
1
0
0
1
0
0
1
0
1
1
1
0
1
1
0
1
1
1
1
1
1
FONTE - ARTIGO TÉCNICO AN236 - MICROCHIP
H8
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
X8
0
1
0
1
0
1
0
1
0
1
X
0
1
0
1
X16
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
45
APÊNDICE B – CÓDIGO FONTE DO FIRMWARE
// PROGRAMA PRINCIPAL
//UTILIZAÇÃO DOS PINOS
// C0 - LED:INDICA X10TX
// C1 - LED:INDICA X10RX
// C2 - SAIDA PWM
// C4 - ENTRADA VINDA DO PLL
// C5 - LED:COMANDO NO BUFFER SERIAL
// C6 - TXSERIAL
// C7 - RXSERIAL
// B0 - INTERRUPÇÃO EXTERNA - SINAL DE SINCRONISMO
// B1 - RELE - LIGA / DESLIGA
// A1 - ENTRADA PLL
//BIBLIOTECAS .h
#include <16F877A.h>
#include <string.h>
//DIRETIVAS DO PIC
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT
#use delay(clock=12000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
//BIBLIOTECAS .c
#include <mod_lcd.c>
#include <X10Codes.c>
//DECLARAÇÃO DAS FUNÇÕES
void Inicializa(void);
void MontaFrame(void);
void Decodifica(void);
void Transmite(void);
void X10Receive(void);
void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant);
short Compara(short *Vetor1, int Pos1, short *Vetor2, int Pos2, int Num);
//DECLARAÇÃO DAS VARIAVEIS
short TxSet=0,RxSet=0,NewTxCmd=0,TxFrame[101],House[8],Unit[10],Function[10],RxFrame[44],AddOk=0;
char Cmd[10],Hs[3],Ut[4],Fc[4];
int y=0,i=0,m,n=0,Func_Dmm=0;
void Main(void)
{
Inicializa();
printf("\n\n\r---------------\n\r");
printf("CONTROLADOR X10\n\r");
printf("---------------\n\r");
for(;;)
{
if(!TxSet)
{
if(NewTxCmd)
{
disable_interrupts(INT_EXT);
Decodifica();
printf("COMANDO DECODIFICADO\n\r");
printf("H:%s,U:%s,F:%s\n\r",Hs,Ut,Fc);
printf("Start: ");
for(y=0;y<4;y++)
{
printf("%d",Start[y]);
}
printf("\n\r");
printf("House: ");
46
for(y=0;y<8;y++)
{
printf("%d",House[y]);
}
printf("\n\r");
printf("Unit: ");
for(y=0;y<10;y++)
{
printf("%d",Unit[y]);
}
printf("\n\r");
printf("Function: ");
for(y=0;y<10;y++)
{
printf("%d",Function[y]);
}
printf("\n\r");
MontaFrame();
printf("FRAME X10\n\r");
}
}
}
for(y=0;y<101;y++)
{
printf("%d",TxFrame[y]);
}
printf("\n\r");
TxSet = 1;
lcd_pos_xy(1,1);
lcd_escreve("TRANSMITINDO....");
NewTxCmd = 0;
output_low(pin_c5);//Comando no Buffer Serial;
output_high(pin_c0);//TX;
enable_interrupts(INT_EXT);
}
// INTERRUPÇÕES
#INT_RDA
void Serial(void)
{
gets(Cmd);
NewTxCmd = 1;
output_high(pin_c5);//Comando no Buffer Serial;
}
#INT_EXT
void Externa(void)
{
//printf("INT_EXT\n\r");
if(TxSet)
{
disable_interrupts(INT_EXT);
Transmite();
enable_interrupts(INT_EXT);
}
else
{
disable_interrupts(INT_EXT);
Delay_us(1100);
if (input(pin_a1))
//if(TesteRx[t])
{
RxSet = 1;
output_high(pin_c4);
47
}
else
{
RxSet = 0;
output_low(pin_c4);
}
X10Receive();
enable_interrupts(INT_EXT);
}
}
// FUNÇÕES
void Transmite(void)
{
if(i<101)
{
if(TxFrame[i])
{
set_pwm1_duty(12);
//Transmite Fase R
Delay_ms(1);
//Delay_us(10);
set_pwm1_duty(0);
///Delay_us(1778);
///set_pwm1_duty(255);
//Transmite Fase S
///Delay_ms(1);
//Delay_us(10);
///set_pwm1_duty(0);
///Delay_us(1778);
///set_pwm1_duty(255);
//Transmite Fase T
///Delay_ms(1);
//Delay_us(10);
///set_pwm1_duty(0);
}
i++;
}
else
{
TxSet = 0;
lcd_pos_xy(1,1);
lcd_escreve("CONTROLADOR X10");
i = 0;
memset(TxFrame,0,sizeof(TxFrame));
output_low(pin_c0);//TX;
}
}
void Inicializa(void)
{
enable_interrupts(INT_RDA);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
lcd_ini();
lcd_escreve('
\f'
);//apaga display
lcd_pos_xy(1,1);
lcd_escreve("CONTROLADOR X10");
lcd_pos_xy(1,2);
lcd_escreve("TCC VER:03/2009");
setup_timer_2(T2_DIV_BY_1,24,1);
48
setup_ccp1(ccp_pwm);
set_pwm1_duty(0);
memset(TxFrame,0,sizeof(TxFrame));
memset(Hs,0,sizeof(Hs));
memset(Ut,0,sizeof(Ut));
memset(Fc,0,sizeof(Fc));
memset(Cmd,0,sizeof(Cmd));
ext_int_edge( L_TO_H );
}
void MontaFrame(void)
{
if(Func_Dmm==1)
{
//Monta o frames com 101 bits a ser transmitido
TxFrame[0]=0;
//Mover(TxFrame,1,Start,0,4);//0
//4 bits
for(y=0;y<4;y++)
{
TxFrame[1+y]=Start[y];
}
//Mover(TxFrame,5,&House[0],0,8);//4
for(y=0;y<8;y++)
{
TxFrame[5+y]=House[y];
}
//Mover(TxFrame,13,Unit,0,10);//12
for(y=0;y<10;y++)
{
TxFrame[13+y]=Function[y];
}
//Mover(TxFrame,23,Start,0,4);//22
for(y=0;y<4;y++)
{
TxFrame[23+y]=Start[y];
}
//10 bits
//4 bits
//Mover(TxFrame,27,House,0,8);//26
for(y=0;y<8;y++)
{
TxFrame[27+y]=House[y];
}
//8 bits
//Mover(TxFrame,35,Unit,0,10);//34
for(y=0;y<10;y++)
{
TxFrame[35+y]=Function[y];
}
//10 bits
//Mover(TxFrame,45,Quiet,0,6);//44
//for(y=0;y<6;y++)
//{
// TxFrame[45+y]=0;
//}
//6 bits
//Mover(TxFrame,51,Start,0,4);//50
for(y=0;y<4;y++)
{
TxFrame[51+y]=Start[y];
}
//4 bits
//Mover(TxFrame,55,House,0,8);//54
for(y=0;y<8;y++)
{
TxFrame[55+y]=House[y];
}
//Mover(TxFrame,63,Function,0,10);//62
for(y=0;y<10;y++)
{
TxFrame[63+y]=Function[y];
//8 bits
//10 bits
49
}
//Mover(TxFrame,73,Start,0,4);//72
for(y=0;y<4;y++)
{
TxFrame[73+y]=Start[y];
}
//4 bits
//Mover(TxFrame,77,House,0,8);//76
for(y=0;y<8;y++)
{
TxFrame[77+y]=House[y];
}
//8 bits
//Mover(TxFrame,85,Function,0,10);//84
for(y=0;y<10;y++)
{
TxFrame[85+y]=Function[y];
}
//10 bits
//Mover(TxFrame,95,Quiet,0,6);//94
//6 bits
for(y=0;y<6;y++)
{
TxFrame[95+y]=0;
}
}
if(Func_Dmm==0)
{
//Monta o frames com 101 bits a ser transmitido
TxFrame[0]=0;
//Mover(TxFrame,1,Start,0,4);//0
//4 bits
for(y=0;y<4;y++)
{
TxFrame[1+y]=Start[y];
}
//Mover(TxFrame,5,&House[0],0,8);//4
for(y=0;y<8;y++)
{
TxFrame[5+y]=House[y];
}
//Mover(TxFrame,13,Unit,0,10);//12
for(y=0;y<10;y++)
{
TxFrame[13+y]=Unit[y];
}
//Mover(TxFrame,23,Start,0,4);//22
for(y=0;y<4;y++)
{
TxFrame[23+y]=Start[y];
}
//10 bits
//4 bits
//Mover(TxFrame,27,House,0,8);//26
for(y=0;y<8;y++)
{
TxFrame[27+y]=House[y];
}
//8 bits
//Mover(TxFrame,35,Unit,0,10);//34
for(y=0;y<10;y++)
{
TxFrame[35+y]=Unit[y];
}
//10 bits
//Mover(TxFrame,45,Quiet,0,6);//44
//for(y=0;y<6;y++)
//{
// TxFrame[45+y]=0;
//}
//6 bits
//Mover(TxFrame,51,Start,0,4);//50
for(y=0;y<4;y++)
{
//4 bits
50
}
TxFrame[51+y]=Start[y];
//Mover(TxFrame,55,House,0,8);//54
for(y=0;y<8;y++)
{
TxFrame[55+y]=House[y];
}
//8 bits
//Mover(TxFrame,63,Function,0,10);//62
for(y=0;y<10;y++)
{
TxFrame[63+y]=Function[y];
}
//Mover(TxFrame,73,Start,0,4);//72
for(y=0;y<4;y++)
{
TxFrame[73+y]=Start[y];
}
//4 bits
//Mover(TxFrame,77,House,0,8);//76
for(y=0;y<8;y++)
{
TxFrame[77+y]=House[y];
}
//Mover(TxFrame,85,Function,0,10);//84
for(y=0;y<10;y++)
{
TxFrame[85+y]=Function[y];
}
}
//Mover(TxFrame,95,Quiet,0,6);//94
for(y=0;y<6;y++)
{
TxFrame[95+y]=0;
}
}
//10 bits
//8 bits
//10 bits
//6 bits
void Decodifica(void)
{
//Separa a string recebida pela serial em 3 partes - House, Unit, Function
strncpy(Hs,Cmd,2); //House
strncpy(Ut,Cmd+2,3); //Unit
strncpy(Fc,Cmd+5,3); //Function
//Identifica qual house(A,B,C,...) foi solicitada
if(!strcmp(Hs,HA))Mover(House,0,HouseA,0,8);
else if(!strcmp(Hs,HB))Mover(House,0,HouseB,0,8);
else if(!strcmp(Hs,HC))Mover(House,0,HouseC,0,8);
else if(!strcmp(Hs,HD))Mover(House,0,HouseD,0,8);
else if(!strcmp(Hs,HE))Mover(House,0,HouseE,0,8);
else if(!strcmp(Hs,HF))Mover(House,0,HouseF,0,8);
else if(!strcmp(Hs,HG))Mover(House,0,HouseG,0,8);
else if(!strcmp(Hs,HH))Mover(House,0,HouseH,0,8);
else if(!strcmp(Hs,HI))Mover(House,0,HouseI,0,8);
else if(!strcmp(Hs,HJ))Mover(House,0,HouseJ,0,8);
else if(!strcmp(Hs,HK))Mover(House,0,HouseK,0,8);
else if(!strcmp(Hs,HL))Mover(House,0,HouseL,0,8);
else if(!strcmp(Hs,HM))Mover(House,0,HouseM,0,8);
else if(!strcmp(Hs,HN))Mover(House,0,HouseN,0,8);
else if(!strcmp(Hs,HO))Mover(House,0,HouseO,0,8);
else if(!strcmp(Hs,HP))Mover(House,0,HouseP,0,8);
//Identifica qual unit foi solicitada
if(!strcmp(Ut,U01))Mover(Unit,0,Unit01,0,10);
else if(!strcmp(Ut,U02))Mover(Unit,0,Unit02,0,10);
else if(!strcmp(Ut,U03))Mover(Unit,0,Unit03,0,10);
else if(!strcmp(Ut,U04))Mover(Unit,0,Unit04,0,10);
else if(!strcmp(Ut,U05))Mover(Unit,0,Unit05,0,10);
else if(!strcmp(Ut,U06))Mover(Unit,0,Unit06,0,10);
else if(!strcmp(Ut,U07))Mover(Unit,0,Unit07,0,10);
else if(!strcmp(Ut,U08))Mover(Unit,0,Unit08,0,10);
51
else if(!strcmp(Ut,U09))Mover(Unit,0,Unit09,0,10);
else if(!strcmp(Ut,U10))Mover(Unit,0,Unit10,0,10);
else if(!strcmp(Ut,U11))Mover(Unit,0,Unit11,0,10);
else if(!strcmp(Ut,U12))Mover(Unit,0,Unit12,0,10);
else if(!strcmp(Ut,U13))Mover(Unit,0,Unit13,0,10);
else if(!strcmp(Ut,U14))Mover(Unit,0,Unit14,0,10);
else if(!strcmp(Ut,U15))Mover(Unit,0,Unit15,0,10);
else if(!strcmp(Ut,U16))Mover(Unit,0,Unit16,0,10);
//Identifica qual função foi solicitada
if(!strcmp(Fc,F01)){Mover(Function,0,AllUnitsOff,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F02)){Mover(Function,0,AllUnitsOn,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F03)){Mover(Function,0,On,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F04)){Mover(Function,0,Off,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F05)){Mover(Function,0,Dm,0,10);Func_Dmm=1;}
else if(!strcmp(Fc,F06)){Mover(Function,0,Brgt,0,10);Func_Dmm=1;}
else if(!strcmp(Fc,F07)){Mover(Function,0,AllLightsOff,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F08)){Mover(Function,0,ExtendedCode,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F09)){Mover(Function,0,HailRequest,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F10)){Mover(Function,0,HailAcknowledge,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F11)){Mover(Function,0,PresetDim,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F12)){Mover(Function,0,ExtendedData,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F13)){Mover(Function,0,StatusOn,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F14)){Mover(Function,0,StatusOff,0,10);Func_Dmm=0;}
else if(!strcmp(Fc,F15)){Mover(Function,0,StatusRequest,0,10);Func_Dmm=0;}
}
void Mover(short *Dst, int IniDst, short *Src, int IniSrc, int Quant)
{
int k=0;
for (k;k<Quant;k++)
{
Dst[IniDst + k] = Src[IniSrc + k];
}
}
short Compara(short *Vetor1, int Pos1, short *Vetor2, int Pos2, int Num)
{
int m,n=0;
for(m=0;m<Num;m++)
{
if(Vetor1[Pos1+m]==Vetor2[Pos2+m])n++;
}
}
if(n==Num)
return 1;
else
return 0;
//rotina de recebimento
void X10Receive(void)
{
int x;
short a,b;
//ROTACIONA OS BITS RECEBIDOS DENTRO DO FRAME
for(x=0;x<43;x++)
{
RxFrame[x]=RxFrame[x+1];
}
//INSERE O BIT RECEBIDO NO FIM DO VETOR
if(RxSet)
RxFrame[43]=1;
else
RxFrame[43]=0;
//VERIFICA SE HÁ UM FRAME COM DOIS CONJUNTOS DE START BIT
52
if((RxFrame[0]==1) && (RxFrame[1]==1) && (RxFrame[2]==1) && (RxFrame[3]==0) && (RxFrame[22]==1) &&
(RxFrame[23]==1) && (RxFrame[24]==1) && (RxFrame[25]==0))
{
output_high(pin_c1);//Liga led RX;
//VERIFICA SE FRAMES SÃO IGUAIS
//Compara(RxFrame,0,RxFrame,22,22)
n=0;
for(m=0;m<22;m++)
{
a=RxFrame[m];
b=RxFrame[22+m];
if(a==b)n++;
}
if(n==22)
{
for(y=0;y<43;y++)
{
printf("%d",RxFrame[y]);
}
printf("\n\r");
//VERIFICA SE O FRAME É DE ENDEREÇO
if((RxFrame[20]==0) && (RxFrame[21]==1))
{
//Compara(RxFrame,4,HouseA,0,8)
n=0;
for(m=0;m<8;m++)
{
a=RxFrame[4+m];
b=HouseC[m];
if(a==b)n++;
}
if(n==8)
{
output_high(pin_c3);//Liga led RX;
//Compara(RxFrame,12,Unit02,0,10)
n=0;
for(m=0;m<10;m++)
{
a=RxFrame[12+m];
b=Unit02[m];
if(a==b)n++;
}
if(n==10)
AddOk=1;
}
output_low(pin_c3);//Liga led RX
}
//VERIFICA SE O FRAME É DE COMANDO
if((RxFrame[20]==1) && (RxFrame[21]==0) && AddOk)
{
//Compara(RxFrame,12,On,0,10)
n=0;
for(m=0;m<10;m++)
{
a=RxFrame[12+m];
b=On[m];
if(a==b)n++;
}
if(n==10)
output_high(pin_b1);
//Compara(RxFrame,12,Off,0,10)
n=0;
for(m=0;m<10;m++)
53
{
a=RxFrame[12+m];
b=Off[m];
if(a==b)n++;
}
if(n==10)
output_low(pin_b1);
//Compara(RxFrame,12,AllUnitsOff,0,10)
n=0;
for(m=0;m<10;m++)
{
a=RxFrame[12+m];
b=AllUnitsOff[m];
if(a==b)n++;
}
if(n==10)
output_low(pin_b1);
}
AddOk=0;
memset(RxFrame,0,sizeof(RxFrame));
output_low(pin_c1);//Desliga led RX;
}
else
{
}
}
}
memset(RxFrame,0,sizeof(RxFrame));
output_low(pin_c1);//Desliga led RX;
54
APÊNDICE C – CÓDIGO FONTE DO FIRMWARE
// DEFINIÇÕES DOS CÓDIGOS DO PROTOCOLO X10
// Criação - 2009
// HOUSE CODES
short HouseA[8] = {0,1,1,0,1,0,0,1};
short HouseB[8] = {1,0,1,0,1,0,0,1};
short HouseC[8] = {0,1,0,1,1,0,0,1};
short HouseD[8] = {1,0,0,1,1,0,0,1};
short HouseE[8] = {0,1,0,1,0,1,1,0};
short HouseF[8] = {1,0,0,1,0,1,1,0};
short HouseG[8] = {0,1,1,0,0,1,1,0};
short HouseH[8] = {1,0,1,0,0,1,1,0};
short HouseI[8] = {0,1,1,0,1,0,1,0};
short HouseJ[8] = {1,0,1,0,1,0,1,0};
short HouseK[8] = {0,1,0,1,1,0,1,0};
short HouseL[8] = {1,0,0,1,1,0,1,0};
short HouseM[8] = {0,1,0,1,0,1,0,1};
short HouseN[8] = {1,0,0,1,0,1,0,1};
short HouseO[8] = {0,1,1,0,0,1,0,1};
short HouseP[8] = {1,0,1,0,0,1,0,1};
// UNIT CODES
short Unit01[10] = {0,1,1,0,1,0,0,1,0,1};
short Unit02[10] = {1,0,1,0,1,0,0,1,0,1};
short Unit03[10] = {0,1,0,1,1,0,0,1,0,1};
short Unit04[10] = {1,0,0,1,1,0,0,1,0,1};
short Unit05[10] = {0,1,0,1,0,1,1,0,0,1};
short Unit06[10] = {1,0,0,1,0,1,1,0,0,1};
short Unit07[10] = {0,1,1,0,0,1,1,0,0,1};
short Unit08[10] = {1,0,1,0,0,1,1,0,0,1};
short Unit09[10] = {0,1,1,0,1,0,1,0,0,1};
short Unit10[10] = {1,0,1,0,1,0,1,0,0,1};
short Unit11[10] = {0,1,0,1,1,0,1,0,0,1};
short Unit12[10] = {1,0,0,1,1,0,1,0,0,1};
short Unit13[10] = {0,1,0,1,0,1,0,1,0,1};
short Unit14[10] = {1,0,0,1,0,1,0,1,0,1};
short Unit15[10] = {0,1,1,0,0,1,0,1,0,1};
short Unit16[10] = {1,0,1,0,0,1,0,1,0,1};
// FUNCTION CODES
short AllUnitsOff[10] = {0,1,0,1,0,1,0,1,1,0}; //F01
short AllUnitsOn[10] =
{0,1,0,1,0,1,1,0,1,0}; //F02
short On[10] =
{0,1,0,1,1,0,0,1,1,0}; //F03
short Off[10]=
{0,1,0,1,1,0,1,0,1,0}; //F04
short Dim[10] =
{0,1,1,0,0,1,0,1,1,0}; //F05
short Bright[10] =
{0,1,1,0,0,1,1,0,1,0}; //F06
short AllLightsOff[10]= {0,1,1,0,1,0,0,1,1,0}; //F07
short ExtendedCode[10] = {0,1,1,0,1,0,1,0,1,0}; //F08
short HailRequest[10] = {1,0,0,1,0,1,0,1,1,0}; //F09
short HailAcknowledge[10] = {1,0,0,1,0,1,1,0,1,0}; //F10
short PresetDim[10] =
{1,0,0,1,1,0,1,0,1,0}; //F11
short ExtendedData[10] = {1,0,1,0,0,1,0,1,1,0}; //F12
55
short StatusOn[10] =
{1,0,1,0,0,1,1,0,1,0}; //F13
short StatusOff[10] =
{1,0,1,0,1,0,0,1,1,0}; //F14
short StatusRequest[10] = {1,0,1,0,1,0,1,0,1,0}; //F15
//CONSTANTS
short Quiet[6] = {0,0,0,0,0,0};
short Start[4]= {1,1,1,0};
char HA[3] = "HA";
char HB[3] = "HB";
char HC[3] = "HC";
char HD[3] = "HD";
char HE[3] = "HE";
char HF[3] = "HF";
char HG[3] = "HG";
char HH[3] = "HH";
char HI[3] = "HI";
char HJ[3] = "HJ";
char HK[3] = "HK";
char HL[3] = "HL";
char HM[3] = "HM";
char HN[3] = "HN";
char HO[3] = "HO";
char HP[3] = "HP";
char U01[4] = "U01";
char U02[4] = "U02";
char U03[4] = "U03";
char U04[4] = "U04";
char U05[4] = "U05";
char U06[4] = "U06";
char U07[4] = "U07";
char U08[4] = "U08";
char U09[4] = "U09";
char U10[4] = "U10";
char U11[4] = "U11";
char U12[4] = "U12";
char U13[4] = "U13";
char U14[4] = "U14";
char U15[4] = "U15";
char U16[4] = "U16";
char F01[4] = "F01";
char F02[4] = "F02";
char F03[4] = "F03";
char F04[4] = "F04";
char F05[4] = "F05";
char F06[4] = "F06";
char F07[4] = "F07";
char F08[4] = "F08";
char F09[4] = "F09";
char F10[4] = "F10";
char F11[4] = "F11";
char F12[4] = "F12";
char F13[4] = "F13";
char F14[4] = "F14";
char F15[4] = "F15";
56
ANEXO A – ARQUITETURA INTERNA DO PIC16F877A
FONTE – DATSHEET PIC16F877A - MICROCHIP

Documentos relacionados