Relatório 7

Alexandre Abib Valentim RA 058624 Joe Takayuki Ueda RA 061754

Aula 13 e 14 - Interface Serial

Nas semanas correspondentes a essas aulas foi terminada a montagem da placa e início dos testes de comunicação serial com o computador.

A montagem realizada foi a seguinte:

/media/Attachments/courseEA079_1S2010/Eale_7/fig2.JPG

Com a montagem pronta, foi iniciada a fase de testes. Para realizar a comunicação serial foi criado um programa simples que realiza a comunicação via porta serial utilizando o HyperTerminal. O programa foi criado com a ajuda do Processor Expert, utilizando o componente SCI. Com esse componente implementado, ele foi configurado para trabalhar sem interrupção, num Baud Rate de 9600. O resto das configurações foram deixadas na sua forma padrão.

/media/Attachments/courseEA079_1S2010/Eale_7/fig1.JPG

Com essa configuração o programa implementado foi simples:

while(1){
    while(!AS1_GetCharsInRxBuf());
    erro = AS1_RecvChar(&char);
    erro = AS1_SendChar(char);

A função desse programa é muito simples. Ele funciona como um loop infinito que espera um flag de caracter recebido no registrador adequado. Quando um caractere é recebido, o programa o coloca em uma variável e reenvia para o HyperTerminal, o que causa um Eco de caracter, ou seja, o caracter digitado é exibido na tela do HyperTerminal. Para alterar o programa para que ele envie o mesmo caractere mais de uma vez, basta copiar a ultima linha várias vezes ou utilizar um loop.

As funções RecvChar e SendChar são implementadas pelo programa da seguinte maneira:

byte AS1RecvChar(AS1_TComData *Chr)
{
byte Result = Err_OK;
byte StatReg = SCI1S1;

if (StatReg & (SCI1S1_OR_MASK | SCI1S1_NF_MASK | SCI1S1_FE_MASK | SCI1S1_PF_MASK) {
 Result = ERR_COMMON;
   } else if (!(StatReg & SCI1S1_RDRF_MASK)){
   Return ERR_RXEMPTY;
   } else {
   }
   Chr = SCI1D;
   return Result;
 }

Essa rotina primeiramente lê o registrador de status da SCI1 (SCI1S1) e, em seguida, faz testes com os flags do mesmo em busca de possíveis erros. Se não houver, ele pega dos dados do registrador de dados da SCI1 (SCI1D) e coloca no endereço dado como parâmetro de entrada. Ela também tem como valor de retorno o código de erro final, que ajuda a identificar qual problema pode ter ocorrido.

A outra rotina será:

byte AS1_SendChar(AS1_TComData Chr)
{
 if(!SCI1S1_TDRE) {
  return ERR_TXFULL;
 }
 SCI1D = (byte)Chr;
 return ERR_OK;
}

Essa função é bem mais simples que a anterior, ela simplesmente checa se o buffer de saída está cheio, em caso afirmativo, retorna um código de erro, e em caso negativo coloca o caractere dado como parâmetro no buffer de saída e retorna o código de erro de "OK".