Página 1 de 1

USART Mestre-Escravos (9 bits)

MensagemEnviado: 10 Mai 2007 11:26
por MOR_AL
Caros colegas.

Após fazer alguns programinhas em C e Mikrobasic percebi que eu estava estourando a capacidade da pilha stack. Apesar do compilador informar este fato (9 níveis), na montagem elétrica até que funcionou. O fato é que não se pode usar um programa que indique estouro da pilha. Estava tratando tudo, ou quase tudo, com interrupções e estas faziam todo o procedimento necessário. Sei que interrupções devem ser usadas para pequenas tarefas, deixando a parte principal fora delas, mas o programa fica bem mais estruturado se usarmos as interrupções com todo o procedimento. Como havia feito o mesmo programa também em linguagem assembler, percebi que a ocupação da pilha era de 4 ou 5 níveis. Sendo assim, comecei a escrever rotinas básicas em assembler, para formar uma pequena biblioteca. Outra vantagem é que a ocupação de memória de programa é bem menor.

No momento estou fazendo uma rotina em ASM, referente à USART em modo assíncrono, do tipo mestre-escravo (Start_bit, 9 bits de dados e Stop_bit).

Cheguei a um impasse e gostaria de contar com o auxílio de vocês.

O problema é o seguinte:

Consultando o manual (16F628), na recepção de um dado (caractere ou endereço) tem-se as seguintes condições:

.....ADDEN(do Rx).......RX9D......Interrupção?......TCREG <-- RSR?.........Dado
a)..........0......................0..................S.........................S....................caractere
b)..........0......................1...................?........................?............................?
c)..........1......................0...................N........................N........................--------
d).........1.......................1...................S........................S....................Endereço

O manual não fornece maiores informações sobre a condição (b), ADDEN = 0 e RX9D = 1.
Não se sabe se haverá interrupção e nem se o dado contido em RSR será transferido para o registro RCREG.

Antes de alguma comunicação, os elementos escravos se encontram com seu bit ADDEN = 1, aguardando a transmissão de um endereço por parte do mestre. Quando o mestre deseja estabelecer comunicação com algum escravo, ele envia um endereço do escravo e TX9D = 1. Os escravos, encontrando-se na condição (d), identificam que o dado é um endereço. O escravo, cujo endereço coincide com o enviado pelo mestre, se prepara para receber caracteres e faz ADDEN = 0. O mestre passa a enviar caracteres e a condição TX9D = 0. O escravo agora encontra-se na condição (a), seu ADDEN é '0' e recebe RX9D = 0.

ATÉ AÍ TUDO BEM, TUDO FUNCIONA DE ACORDO COM O ESPERADO.

Acontece que há situações em que o escravo não tem conhecimento de quantos caracteres serão recebidos. Sendo assim, ele (o escravo) deverá manter seu bit ADDEN = 0, considerando que o próximo dado seja um caractere e não um endereço. Se o mestre desejar se conectar a outro escravo, ele enviará TX9D = 1. O escravo que mantinha comunicação com o mestre passará para a condição (b) (está com ADDEN = 0 e recebe RX9D = 1).

AÍ APARECE A MINHA DÚVIDA!

Uma forma de se evitar esta condição, seria o mestre informar ao escravo que este deve encerrar a recepção de caractere. O mestre envia um código ("fim da transmissão") ao escravo. O escravo identifica este código e faz ADDEN = 1, preparando-se, a partir deste instante, para ler endereço. Isso resolve, mas cria uma limitação no sistema. O código "fim da transmissão" não poderá mais ser considerado como caractere para os escravos.

PERGUNTO:

Existe algum protocolo que trate especificamente deste detalhe?

Algum de vocês tem conhecimento deste detalhe?

Já pesquisei em outras "Notas de Aplicação" (Application Notes) que tratam da USART e não achei nada que trate da condição apresentada no item (b).

Aguardo algum retorno.


MOR_AL