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
Back
UP
Up
FORWARD
Forward

BackTo front page Pages by Nuno Nunes.