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