Implementação do Protocolo em Programação

Inicialização de todas as Constantes
  Endereços do PLM e do Servidor que o endereça.
  Tempo de espera entre cada recepção.
  ...

Programa Principal :

> Actualização do pino do Watch Dog do Power Line Modem.
> Espera por uma Recepção Serial
> ou por um Time_Out . Demasiado Tempo entre Recepções.

Caso Ocorra uma 1.ª Recepção Serial ( Primeira Transmissão ) :

> Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Sei que recebi o 1.º Byte : RX_STATUS = 01h;

> Retorno ao Main (Programa Principal)
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Ponho a 0 todos os bytes necessários para a Recepção
>   Guardo no RX_PREAMBLE o valor do 1.º Byte recebido.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 2.º Byte
>   Incremento o RX_STATUS (RX_STATUS=02h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_L_HEADER o valor do 2.º Byte recebido.
>   Se o 2.º Byte recebido(RX_L_HEADER) for diferente à constante LR_HEADER.
>     Header_Error ->N2
>   caso contrário:
>     Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>     Caso ocorra o Time_Out -> N1
> Foi recebido o 3.º Byte
>   Incremento o RX_STATUS (RX_STATUS=03h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_H_HEADER o valor do 3.º Byte recebido.
>   Se o 3.º Byte recebido(RX_H_HEADER) for diferente à constante HR_HEADER.
>     Header_Error ->N2

>   caso contrário:

>     Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>     Caso ocorra o Time_Out -> N1
> Foi recebido o 4.º Byte
>   Incremento o RX_STATUS (RX_STATUS=04h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_L_HOMEADD o valor do 4.º Byte recebido.
>   Se o 4.º Byte recebido(RX_L_HOMEADD) for diferente à constante L_HOMEADD.
>     HomeAdd_Error ->N3
>   caso contrário:
>     Guardo no 8.º Bit do Byte de paridade (PARITY.7) a paridade do RX_L_HOMEADD.
>     Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>     Caso ocorra o Time_Out -> N1
> Foi recebido o 5.º Byte
>   Incremento o RX_STATUS (RX_STATUS=05h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_H_HOMEADD o valor do 5.º Byte recebido.
>   Se o 5.º Byte recebido(RX_H_HOMEADD) for diferente à constante H_HOMEADD.
>     HomeAdd_Error ->N3
>   caso contrário:
>     Guardo no 7.º Bit do Byte de paridade (PARITY.6) a paridade do RX_H_HOMEADD.
>     Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>     Caso ocorra o Time_Out -> N1
> Foi recebido o 6.º Byte
>   Incremento o RX_STATUS (RX_STATUS=06h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_CTRL o valor do 6.º Byte recebido.
>   Guardo no 6.º Bit do Byte de paridade (PARITY.5) a paridade do RX_CTRL.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 7.º Byte
>   Incremento o RX_STATUS (RX_STATUS=07h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_SOURCEADD o valor do 7.º Byte recebido.
>   Guardo no 5.º Bit do Byte de paridade (PARITY.4) a paridade do RX_SOURCEADD.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 8.º Byte
>   Incremento o RX_STATUS (RX_STATUS=08h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_DESTADD o valor do 8.º Byte recebido.
>   Guardo no 4.º Bit do Byte de paridade (PARITY.3) a paridade do RX_DESTADD.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 9.º Byte
>   Incremento o RX_STATUS (RX_STATUS=09h)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_MESSAGE o valor do 9.º Byte recebido.
>   Guardo no 3.º Bit do Byte de paridade (PARITY.2) a paridade do RX_MESSAGE.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 10.º Byte
>   Incremento o RX_STATUS (RX_STATUS=0Ah)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_DATA o valor do 10.º Byte recebido.
>   Guardo no 2.º Bit do Byte de paridade (PARITY.1) a paridade do RX_DATA.
>   Retorno ao Main, espero pelo próximo byte, até o Time_Out não ocorrer.
>   Caso ocorra o Time_Out -> N1
> Foi recebido o 11.º Byte
>   Incremento o RX_STATUS (RX_STATUS=0Bh)
>   Activo o byte para indicação ao Main que houve uma recepção : Status = 01h;
> Retorno ao Main
>   Passo ao modo de recepção ( Por causa do Status=01h);
>   Guardo no RX_PARITY o valor do 11.º Byte recebido.
>   Se o 11.º Byte recebido(RX_PARITY) for diferente do Byte de Paridade preenchido
>   com a paridade dos bytes recebidos até agora:
>     Parity Error ->N4
>   caso contrário:
>     Modifico o Byte indicador do estado (STATUS) para indicar ao Main que pode passar
>     para o Modo de Transmissão :
>     STATUS=00000011B;
>     TX_STATUS=1H;
>     Desabilito a interrupção por overflow do Time_Out;
>     Volto para o Main;

Depois de todos os bytes recebidos, transmite-se para o servidor a confirmação.

> Envio o TX_PREAMBLE;
>   Incremento o TX_STATUS (TX_STATUS=2)
> Envio o TX_L_HEADER;
>   Incremento o TX_STATUS (TX_STATUS=3)
> Envio o TX_H_HEADER;
>   Incremento o TX_STATUS (TX_STATUS=4)
> Envio o PARITY;
>   Modifico o Byte indicador do estado (STATUS) para indicar ao Main que pode executar a instrução que lhe foi enviada. STATUS=00000101B;
> Volto para o Main;

Depois de todos os bytes enviados, depura-se a instrução enviada.

> Se o RX_CTRL.0 (6.º Byte Recebido) for diferente de 1 :
> Reset : Simula-se um Reset por software (Voltar para o Princípio desta Página).
> caso contrário :
>   Se o RX_MESSAGE (9.º Byte Recebido) for :

>   > RX_MESSAGE.0 = 1: Activo o Bit cujo endereço é definido pelo RX_DATA
>   > (10.º Byte Recebido).
>   > -> setb RX_DATA
>   > RX_MESSAGE.1 = 1 :Desactivo o Bit cujo endereço é definido pelo RX_DATA
>   > (10.º Byte Recebido).
>   > -> clr RX_DATA
>   > RX_MESSAGE.2 = 1 : Não faço nada.
>   > RX_MESSAGE.3 = 1 : Movo para uma porta pré-definida (P1) o byte recebido
>   > (RX_DATA) -> mov P1,RX_DATA
>   > Ponho o RX_STATUS e o STATUS a 0 e volto para o MAIN.
>   > ( A Recepção, Transmissão e Execução da Instrução Recebida foi bem Sucedida )
>   > caso contrário activo o 8.º bit do Byte de Erros (SETB ERROR.7)

N1 - Qd o Time Out Ocorre.
N2 - Caso o 2.º e o 3.º Bytes recebidos(RX_L_HEADER e RX_H_HEADER) forem diferentes
às constantes LR_HEADER e HR_HEADER respectivamente.
N3 - Caso o 4.º e o 5.º Bytes recebidos(RX_L_HOMEADD e RX_H_HOMEADD) forem diferentes
às constantes L_HOMEADD e H_HOMEADD respectivamente.
N4 - Caso o Byte de Paridade Recebido (RX_PARITY) seja diferente daquele que foi preenchido
com a paridade dos bytes recebidos(PARITY)
N5 - SoftReset

Back | Up | Forward

To front page | Pages by Nuno Nunes. |