aniblue07_bendlr_back.gifaniblue07_bendlr_next.gif

Funcionamento do código do AVR no modo de Debug

A primeira tarefa que o microrato faz é enviar uma frame ao PC. Essa frame contém informação sobre o estado dos sensores, e informação do estado anterior do microrato em termos de deslocamento.

A frame que é enviada pelo AVR para o PC tem 17 Bytes e sua constituição é a seguinte:

Text Box: 0-Cabeçalho
1-Cabeçalho
2-SFH-Sensor Farol High (mais significativo)
3-SZPT-Sensor Zona Preta Trás
4-S1-Sensor Esquerda
5-S2-Sensor Frente - Esquerda
6-SZPF-Sensor Zona Preta frente
7-S4-Sensor Frente
8-S5-Sensor Frente - Direita
9-S6-Sensor Direita
10-SFL-Sensor Farol Low (menos significativo)
11-M1L-Motor 1 Low (velocidade do motor 1; menos significativo)
12-M1H-Motor 1 High (velocidade do motor1; mais significativo)
13-M2L- Motor 2 Low (velocidade do motor2; menos significativo)
14-M2H- Motor 2 High (velocidade do motor2;mais significativo)
15-TL-Tempo Low(menos significativo do tempo a que andou)
16-TH- Tempo High(mais significativo do tempo a que andou)
17-EI- Estado dos Interruptores

 


O cabeçalho é obviamente para detectar o início de uma frame.

O valor dos sensores de objecto já vêm traduzidos para centímetros (0..30cm). Os sensores de zona preta vêm tal como são adquiridos, e o sensor de farol vem com 10 bits, logo são necessários 2 bytes. Na realidade o valor outros sensores também são adquiridos com 10 bits, mas para reduzir o número de bytes a transmitir, e assim minimizar o tempo de ciclo, os 2 bits menos significativos são cortados. O byte 17 contém o estado dos interruptores, que segundo as normas do microrato servem para iniciar, e de pausa.

Após o AVR ter enviado esta frame para o PC, o PC responde com a frame de controlo. Essa frame tem a seguinte estrutura:

 

 


A parte da frame a verde é totalmente reencaminhada para o 8515, em que os dois primeiros bytes são o cabeçalho, o terceiro byte para o nosso caso particular é sempre “0x01”, e significa que esta ordem deve interromper a ordem que estava a ser executada se alguma, e deve ser executada. Se esse byte fosse “0x02” significava que a ordem apenas deveria ser executada após o fim da ordem anterior. Os restantes bytes são as velocidades para os dois motores, e a duração que essas velocidades devem-se manter. O significado dos bytes é o mesmo que na frame anterior. O último byte é o OL (Ordens Led’s) e contém a informação para actuar sobre os led’s. Esta actuação, mais uma vez, tem por objectivo cumprir as regras do concurso microrato.

O AVR,  após ter enviado os 9 primeiros bytes para o 8515, entra no modo de espera pelo ciclo seguinte. Entretanto vai recebendo por interrupção a resposta do 8515, à ordem transmitida. Essa resposta contém a informação do que foi executado até ao ponto em que foi sobreposta a nova ordem. A partir dessa informação consegue-se saber qual foi o deslocamento do microrato no ciclo anterior. A frame de resposta do 8515 tem a seguinte estrutura:

 

 


O cabeçalho é composto pelos três primeiros bytes. O primeiro apenas quer dizer que a ordem anterior estava correcta. Caso não estivesse correcta o 8515 responderia com dois bytes de “0x44”. Os outros dois bytes é que são verdadeiramente os cabeçalhos. Os restantes são as velocidades a que andaram os dois motores, e durante quanto tempo. A maneira de como a partir destes elementos se vai conhecer o deslocamento do microrato será descrito na secção que fala sobre o código de controlo, que é executado na fase de debug no PC.


Enquanto o AVR está à espera que chegue so próximo ciclo, por interrupções estão a ser adquiridos os valores dos sensores. A tensão de saída dos sensores, como já foi dito no capítulo da descrição do hardware, tem pouca variação, logo é muito sensível a ruídos. Assim os valores adquiridos vão actualizando um vector passando por um filtro de esquecimento. O objectivo deste filtro é ter em consideração o valor anterior de cada sensor. O peso atríbuido ao valor antigo foi calculado experimentalmente, em que os critérios para a sua decisão foram: não ter muita oscilação; e ter um tempo de resposta rápido para que possa ver um obstáculo a tempo. O  filtro de esquecimento tem a seguinte equação:

 


Se l fôr 0 estamos a desprezar o novo valor. Se l fôr 1 estamos a desprezar o valor antigo. E se l fôr 0.5 estamos a fazer a média aritmética. Para fazer esta operação em C, teremos de usar float’s. Como já foi referido, temos de evitar usar floats, pois são operações demoradas. Assim multiplicamos por um factor, e depois dividimo-lo. Deste modo evitamos o uso de float’s, e ganhamos tempo, mesmo usando uma divisão.

 

 


A equação usada foi a seguinte :

 

O valor usado para l foi de 77, o que em termos da equação geral dá um l de 0.6, o que quer dizer que estamos a dar um peso de 60% ao novo valor, e um peso de 40% ao antigo.

Os valores dos sensores vão sendo actualizados desde modo e apenas imediatamente antes de enviar a frame para o PC é que os valores do sensores de obstáculos (S1,S2,S4,S5,S6), até então em hexadécimal, são convertidos para centímetros(5..30).

Esta converção é baseada numa calibração prévia dos sensores de obstáculos para 4 distâncias (5cm,10cm,15cm,30cm). Assim para um dado valor é atribuído o valor correspondente à recta que une os pontos de calibração mais próximos.

No gráfico do lado podemos ver a recta de calibração do sensor 4.

Mais uma vez os valores dos pontos são calculados evitando o uso de float’s. Para tal usamos o arco-tangente e o seno tabelados. Essas funções também são as mesmas no lado do AVR, e no lado do PC.

No lado do AVR apenas falta referir em pormenor as tarefas que executam a transmissão/recepção série 115200bps por software.

Mal estas funções são chamadas, são inibidas quaiquer interrupções, visto que o controlo dos tempos entre os bits é feito por tempo de instruções. A primeira função a ser chamada é a  “sendbyte” que envia os 18 bytes um de cada vez. Após a conclusão desta, é chamada de imediato a função “readbyte” que fica à espera da resposta (controlo) do PC. Só sai desta função quando recebe os 10 bytes.

Em termos de tempos de execução as tarefas de enviar são muitos rápidas. Como o processamento do PC também é rápido comparativamente com o AVR, o tempo que a função de leitura demora é também pequeno.

Podemos ver nas figuras seguinte o tempo que as três operações demoram e o tempo de ciclo.


Tempos de execução das tarefas de comunicação


Repetição de uma operação ao longo de um ciclo

aniblue07_bendlr_back.gifaniblue07_bendlr_next.gif