Descrição do Protocolo Utilizado

Índice:

> Introdução.
> Descrição dos Bytes Enviados e Recebidos.
> - RX_PREAMBLE e TX_PREAMBLE
> - RX_L_HEADER e RX_H_HEADER
> - RX_L_HOMEADD e RX_H_ADD
> - RX_CTRL
> - RX_SOURCEADD
> - RX_DESTADD
> - RX_MESSAGE e RX_DATA
> - RX_PARITY
> - TX_PREAMBLE
> - TX_L_HEADER e TX_H_HEADER
> - PARITY
> Outros registos (Bytes) utilizados no programa.
> - ERROR
> - SER_DAT

Introdução

Foi necessário criar um protocolo de comunicação entre os Power Line Modem de forma a que não existisse quaisquer perca de dados e se conseguisse endereçar apenas um dos Power Line Modem, assim como existir a possibilidade de apenas um servidor actuar os power line modem.

Assim, caso se pretenda actuar simultaneamente dois microcontroladores ( power line modems), bastam que estes tenham os mesmos endereços. Da mesma maneira caso se pretenda ter vários servidores a actuar simultaneamente os microcontroladores também estes devem ter os mesmos endereços.
Desta maneira, consegue-se distinguir o problema de termos, por exemplo, duas habitações adjacentes com este sistema, onde não deve existir qualquer interferência entre as habitações.

Como aplicação final, decidiu-se criar um sistema em que existe um ‘servidor’ que endereça um microcontrolador através da linha eléctrica, e que o ‘manda’ :

  Activar (N.L.1) um Bit à escolha (Não só das portas, mas também de qualquer posição de memória).
  Desactivar (N.L.0) um Bit à escolha (Não só das portas, mas também de qualquer posição de memória).
  Enviar para uma porta pré-definida ( P1 neste caso ), um byte.

De notar que muito facilmente se consegue criar qualquer outra aplicação, visto o programa estar feito de maneira a redireccionar facilmente quaisquer outras instruções. Para isso existe uma depuração se o endereço enviado corresponde ao próprio endereço do microcontrolador.
O endereço de cada máquina corresponde a um endereço de 16 bits logo podendo existir virtualmente 2^16 = 65535 microcontroladores ligados a um só servidor. Além disso existe mais um nibble que varia com o valor duma porta do microcontrolador e que possibilita a alteração do endereço do microcontrolador pela simples comutação de um switch por exemplo.
A nível de depuração de erros, existe uma verificação de paridade, visto a linha eléctrica ser muito ruidosa logo ser provável que existam erros de transmissão.
Embora em aplicações como esta, devido à elevada possibilidade de ocorrerem erros de transmissão, fosse recomendável criar um, qualquer outro tipo de verificação de erros, (a verificação de paridade pode ser facilmente confundida quando existem, por exemplo, dois erros simultâneos na transmissão de um byte) optámos por não o implementar no nosso protocolo, visto existirem muitos endereços (2^20=1048576) disponíveis para a implementação de mais power line modems, logo consegue-se uma verificação de erros pois quando estes endereços não estão ocupados, existe uma muito boa percentagem de o erro de transmissão ser detectado.

Para explicação do protocolo propriamente dito, apresentamos a ordem dos bytes enviados e recebidos assim como a sua descrição.

Descrição dos bytes enviados e recebidos:

Esquema dos bytes enviados e recebidos:
Byte N.º | De | Para | Valor
1 | Servidor | MicroControlador | RX_PREAMBLE
2 | Servidor | MicroControlador | RX_L_HEADER
3 | Servidor | MicroControlador | RX_H_HEADER
4 | Servidor | MicroControlador | RX_L_HOMEADD
5 | Servidor | MicroControlador | RX_H_ADD
6 | Servidor | MicroControlador | RX_CTRL
7 | Servidor | MicroControlador | RX_SOURCEADD
8 | Servidor | MicroControlador | RX_DESTADD
9 | Servidor | MicroControlador | RX_MESSAGE
10 | Servidor | MicroControlador | RX_DATA
11 | Servidor | MicroControlador | RX_PARITY
12 | MicroControlador | Servidor | TX_PREAMBLE
13 | MicroControlador | Servidor | TX_L_HEADER
14 | MicroControlador | Servidor | TX_H_HEADER
15 | MicroControlador | Servidor | PARITY

RX_PREAMBLE e TX_PREAMBLE

Este byte é o primeiro byte recebido e enviado (Chamemos-lhe um “start byte”).Fica disponível para futuras implementações, caso seja preciso :

  Aumentar o número de estações.
  Fazer um qualquer outro tipo de ”Checksum Error” (melhor nível de depuração ).

No programa utilizado, é simplesmente enviado e recebido mas não existe qualquer tipo de depuração com outro valor pré-definido. No entanto foi incluído no programa de forma a, para uma futura implementação, não se tivesse de alterar todo o código fonte.
Envia-se neste programa o Byte ‘FFh’ para que os outros modems que possivelmente iriam transmitir passem a detectar a portadora na linha, logo esperam que esta fique disponível.

RX_L_HEADER e RX_H_HEADER

Estes dois bytes (o low e o high) enviados pelo servidor, representam a estação (microcontrolador) que se deseja endereçar. No microcontrolador, esse endereço está definido como duas Equates (LR_HEADER e HR_HEADER), e pode mesmo ser alterado quando o programa está em execução através da possibilidade de alteração de qualquer byte da memória.
Se não for igual ao endereço do microcontrolador, este sofre um pequeno reset a nível de software, em que fica no modo de espera outra vez, até ser ele, o endereçado.

RX_L_HOMEADD e RX_H_ADD

Estes dois bytes (o low e o high) enviados pelo servidor, representam o endereço do servidor que está a endereçar.
No microcontrolador, esse endereço está definido como duas Equates (L_HOMEADD e H_HOMEADD).
Se não for igual ao endereço do microcontrolador, este também sofre um pequeno reset a nível de software, em que fica no modo de espera outra vez, até reconhecer o servidor.
Nestes bytes decidimos fazer um controle de paridade, pois podem existir por exemplo dois servidores, cada um com vários microcontroladores, estes com endereços iguais.

RX_CTRL

Se o RX_CTRL.0 = 0 então verifica-se o que é que o servidor quer que o microcontrolador faça.
Se RX_CTRL Diferente de 0 então existe um RESET completo ... ( redefinição de todos os registos e restauro de todas as equates ...)

RX_SOURCEADD

É verificada a Paridade (Nova implementação em estudo.)

RX_DESTADD

Corresponde a mais um nibble no endereço do microcontrolador.
É comparada com a ADDRESS definida no inicio (através da P1 (Porta 1 do microcontrolador) - Para implementação de um Switch por ex. ).
Caso RX_DESTADD seja diferente de ADDRESS a flag de erro (ERROR.2) passa ao nível lógico 1 (um).
Também neste byte é verificada a paridade.

RX_MESSAGE e RX_DATA

Neste byte (RX_MESSAGE), está definido o que se quer que o microcontrolador faça. Os seus bits representam o seguinte :

  Bit 0 -> Quando activo executa : setb RX_DATA ,e.g. Activa o bit cujo endereço é definido pelo RX_DATA.
  Bit 1 -> Quando activo executa : clr RX_DATA ,e.g. Desactiva o bit cujo endereço é definido pelo RX_DATA.
  Bit 2 -> Redireccionado no Programa . Reservado para futuras implementações.
  Bit 3 -> Quando activo executa : mov P1,RX_DATA, e.g. Escreve na porta 1 o valor de RX_DATA
  Bit 4 -> Não existe redireccionamento no programa. Reservado para futuras implementações.
  Bit 5 -> Não existe redireccionamento no programa. Reservado para futuras implementações.
  Bit 6 -> Não existe redireccionamento no programa. Reservado para futuras implementações.
  Bit 7 -> Não existe redireccionamento no programa. Reservado para futuras implementações.

Se for um dos Bits não redireccionados que esteja activado, o Bit de Erro (ERROR.7) fica a 1.

RX_PARITY

Recebe o Byte de Paridade de forma a que se possa verificar se a transmissão foi correcta de forma a que, se necessária, exista uma retransmissão.

Os seus bits representam o seguinte:
Bit | Deve ser igual ao: | Contém a Paridade de :
RX_PARITY.0 | PARITY.0 (=0) | Não Implementado (=0)
RX_PARITY.1 | PARITY.1 | RX_DATA
RX_PARITY.2 | PARITY.2 | RX_MESSAGE
RX_PARITY.3 | PARITY.3 | RX_DESTADD
RX_PARITY.4 | PARITY.4 | RX_SOURCEADD
RX_PARITY.5 | PARITY.5 | RX_CTRL
RX_PARITY.6 | PARITY.6 | RX_H_HOMEADD
RX_PARITY.7 | PARITY.7 | RX_L_HOMEADD

Se a Paridade for diferente daquela que o servidor emitiu então a flag de erro (ERROR.3) fica com o nível lógico 1 (um).

TX_PREAMBLE

-> Ver RX_PREAMBLE .

TX_L_HEADER e TX_H_HEADER

Estes dois bytes ( o low e o high ) enviados pelo microcontrolador, representam o servidor que se deseja endereçar.
No microcontrolador, esse endereço está definido como duas equates (TX_L_HEADER e TX_H_HEADER.
O servidor pode então reconhecer que é ele o endereçado e receber então o resto do Acknoledge.

PARITY

Nesta altura o microcontrolador manda o byte de Paridade de forma a que o servidor reconheça que todos os bytes foram correctamente recebidos.
Para ver a que cada bit do byte de paridade corresponde, ver o byte RX_PARITY .

Outros Registos (Bytes) Utilizados no Programa.

ERROR

- ERROR.0 -> Caso o servidor não esteja a endereçar este microcontrolador em particular, este bit fica com o nível lógico 1.
  Ocorre quando pelo menos um dos 2.º e o 3.º byte recebidos, RX_L_HEADER e RX_H_HEADER for diferente de respectivamente LR_HEADER e HR_HEADER, visto serem esses os bytes que definem o endereço do microcontrolador.
- ERROR.1 ->Desenvolvemos o protocolo e o programa de forma a que um microcontrolador só responda a um só servidor.
  Para isso, o servidor também tem de enviar o seu próprio endereço (RX_L_HOMEADD e RX_H_ADD) de forma a que o microcontrolador possa comparar com dois bytes (duas constantes) pré-definidas :L_HOMEADD e H_HOMEADD.
- ERROR.2 ->Além do endereço do microcontrolador definido por equates, também decidimos acrescentar uma extensão ao endereço do próprio microcontrolador mas que fosse facilmente alterada, sem alteração do programa.
  Assim, este byte recebido é comparado com um outro (ADDRESS) que é definido pelo estado lógico duma porta do microcontrolador, logo pode ser variado facilmente com a adição de um switch um de alguns jumpers. O servidor deve então saber a posição dos switchs para enviar o endereço correcto. Caso não seja este o microcontrolador a ser endereçado, o bit ERROR.2 passa para o nível lógico 1.
- ERROR.3 ->À medida que os bytes vão sendo recebidos, procede-se à actualização da sua paridade no byte de paridade PARITY. O servidor deve também calcular o byte de paridade dos bytes enviados, e enviar o byte de paridade calculado por ele : RX_PARITY, o microcontrolador compara então estes dois bytes e passa o nivel lógico do bit ERROR.3 caso sejam diferentes, o que indica que houve um erro na transmissão.
- ERROR.4 ->Neste protocolo há um número exacto de bytes recebidos. Caso o servidor envie mais algum byte do que aqueles que foram pré-definidos, então o bit ERROR.4 é passado para o nível lógico 1.
  Isto é util para caso existam mais power line modems na rede mas a funcionar com outro qualquer protocolo, não perturbem o funcionamento dos que obedecem a este protocolo.

SER_DAT

Este byte contém o byte recebido pela interrupção serial (MOV SER_DAT,SBUF).

Back | Up | Forward

To front page | Pages by Nuno Nunes. |