Testes Com O Logic16
Medindo Ondas Constantes
Para um primeiro teste a ser realizado com o Logic16 e que fosse de fácil entendimento, decidiu-se realizar a captura do sinal obtido na compilação do código disponibilizado nos posts anteriores. Leia mais em: http://www2.decom.ufop.br/imobilis/componente-analisador-de-sinais-logic16-pt-2/
O código mencionado, intercala num intervalo de 1 em 1 segundo, o led integrado no Arduino no pino 13 de saída de sinal digital.
Sabendo que o Arduino se encarregará de enviar sinais digitais num intervalo constante para o led integrado a placa, pode-se então capturar tal sinal através com o módulo Logic16.
Assim após enviar o código blink ao Arduino e certificá-lo que tal está executando de forma correta, pode-se montar o sistema analisador do sinal de acordo com as instruções a seguir. Mas antes, deve-se verificar se todos os componentes mencionados estão disponíveis para o uso e em bom estado de funcionamento.
Assim, com todos os equipamentos DESLIGADOS de qualquer fonte de energia, inserimos o cabo 1×9 (9 cabos coloridos) no Logic16. Pode-se notar que ao virar o Logic de cabeça para baixo, haverá instruções de como deve ser encaixado este cabo.
Observação: Como será utilizado somente uma captura de sinal, será utilizado apenas 1 cabo 1×9 que será encaixado no lado onde está descrito como lado A. Deve-se sempre encaixar o cabo 1×9 respeitando que o cabo de cor preta deve ser ligado diretamente ao VCC (1) e, por consequência o cabo cinza será ligado ao GND (0). Isso é necessário para criar um padrão em todos os experimentos. O cabo cinza tem uma indicação em sua ponta no qual é inscrita GROUNG (Figura 1).
Com o cabo 1×9 já posicionado, iniciaremos a conexão física com o Arduino. Será adicionado um fio macho-macho a porta 13 do Arduino. Assim, o sinal que será envido ao led, também será enviado a porta 13 e portanto, podemos capturar o sinal requerido. Assim, deve-se conectar este cabo no cabo de cor marrom que estão ligados ao Logic16.
Deve-se então definir o intervalo de captura de amostra dos sinais. Primeiramente será definido no primeiro campo da Figura 2. A quantidade de capturas.
Supondo que queremos uma captura total de 10 segundos, selecionamos 100 M samples, ou seja, 100 milhões de capturas ao total. Após isso, será escolhido o tempo da captura de sinais. Será definido um intervalo de 10MHz , ou seja, capturas de 1/10.000.000 segundo.
A Figura 2 exibe exatamente como ficará os campos após o preenchimento.
Medindo
Sendo 1M igual a um milhão, temos que 100 M samples significa realizar 100.000.000 de amostras sendo que cada é realizada em 10MHz , temos o seguinte cálculo:
Premissas:
100M = 100.000.000
10Mhz = 10.000.000hz
e a fórmula
resultado = capturas/intervalo
realiza-se o cálculo,
100.000.000/10.000.000 = 10/1 = 10s
Assim, toda captura terá um total de 10 segundos.
Após todo este cálculo, devemos ligar os equipamentos a energia.
Observação: Ao ligar os equipamentos, pode-se notar que o Arduino ligará automaticamente/normalmente, porém o Logic16 não ligará. De fato isto acontece. Ele será iniciado somente na abertura do software Saleae Logic, ou seja, sua luz que indica que está em funcionamento acenderá somente quando iniciarmos o aplicativo de captura de sinal. Mesmo que não façamos nenhuma leitura ainda, devemos iniciar o aplicativo para certificar o funcionamento do módulo.
Após realizado todos os cálculos do intervalo que se quer capturar e energizar todos os equipamentos, podemos então acionar o botão “Start”.
Como não definimos nenhum acionamento automático (Triggers) o resultado da captura será como a Figura 3:
Porém, o tempo onde ocorre a primeira borda de subida sempre irá variar pois o momento que acionamos apertando o botão de captura, o início da captura nunca será o mesmo, mesmo que o autor caso repita inúmeras vezes este mesmo teste. Nem mesmo para cada leitor que realizar estes mesmos passos. Ou melhor, abordando de uma maneira mais clara, seria quase impossível (se não falar impossível diretamente) acionar a leitura deste mesmo teste no exato momento que foi realizado esta que está descrita neste relatório.
Assim, para resolver tal problema, utiliza-se da trigger para automatizar a captura do sinal de maneira uniforme para todos os testes realizados como mostra a Figura 4.
É possível ver que o início, analisando o tempo decorrido da captura, é contado a partir da primeira borda de subida encontrada. Mesmo que o analisador fique vários minutos a procura desta borda, ele ficará capturando dados mas serão ‘descartados’ por não enquadrar ao requisito do usuário e neste exemplo, ao encontrar a primeira borda de subida.
Todos os resultados serão iguais para todos os usuários que realizarem este experimento.
Ondas Aleatórias
Também foi realizados testes com a biblioteca de números randômicos do Arduino (Disponível em: http://arduino.cc/en/reference/random). Assim, ao invés de utilizar a constante 1000 (equivalente a 1 (um) segundo) para o acionamento do led será utilizado números randômicos gerados pelo próprio Arduino.
Sendo assim, será repetido o mesmo procedimento do capítulo onde relata sobre Ondas Constantes e porém com o código descrito abaixo.
O código a ser enviado ao Arduino é uma junção do código utilizado anteriormente com a biblioteca de números randômicos:
[code language=”c”]
long randNumber;
int led = 13;
void setup() {
pinMode(led, OUTPUT);
randomSeed(analogRead(0));
}
void loop() {
digitalWrite(led, HIGH);
randNumber = random(10,1000);
delay(randNumber);
digitalWrite(led, LOW);
randNumber = random(10,1000);
delay(randNumber);
}
[/code]
Com os números sendo gerados num intervalo entre 10 e 1000, é possível ter o led aceso ou apagado em intervalo randômicos definido por meio desse número gerado em milésimos de segundo como mostra a Figura 5.
Assim, é possível ver como os ondas reagem sobre leds que comportam de forma randômica através da captura dos dados pelo módulo Logic16.
Sinais Sincronizados
Abaixo foi descrito um outro código que envia dois sinais constantes sincronizados a dois pinos de saída do Arduino, sendo eles 10 e 9 respectivamente.
O pino 9 intercala entre enviar e não enviar sinais 2,5x (duas vezes e meia) mais rápido que o pino 10 possibilitando o leitor verificar as transições que o Arduino faz com os pinos.
[code language=”c”]
int pino1 = 10;
int pino2 = 9;
void setup() {
pinMode(pino1, OUTPUT);
pinMode(pino2, OUTPUT);
}
void loop() {
digitalWrite(pino1, HIGH);
\\Diferença de tempo a ser analisada
digitalWrite(pino2, HIGH);
delay(100);
digitalWrite(pino2, LOW);
delay(100);
digitalWrite(pino2, HIGH);
delay(100);
digitalWrite(pino2, LOW);
delay(100);
digitalWrite(pino2, HIGH);
delay(100);
digitalWrite(pino1, LOW);
digitalWrite(pino2, LOW);
delay(100);
digitalWrite(pino2, HIGH);
delay(100);
digitalWrite(pino2, LOW);
delay(100);
digitalWrite(pino2, HIGH);
delay(100);
digitalWrite(pino2, LOW);
delay(100);
}
[/code]
Tal teste pode parecer simples demais, porém, seu propósito é verificar qual a diferença da ação de alterar o valor dos sinais dos dois pinos e assim, verificar a precisão do componente Logic16.
Pra nós humanos, é imperceptível, porém existe um tempo para que o controlador do Arduino decodifique a próxima instrução que ele deverá fazer e realizá-la. E para tal propósito que realizará este terceiro teste utilizando o módulo para a captura ambos os sinais e verificar a diferença entre a mudança das ondas para o Arduino.
Assim nas Figuras 6 e 7, no qual o intervalo é de 10s e 100ms respectivamente, tal diferença ainda não é perceptível.
Porém, quando aproximamos o tempo em unidades de microssegundos, fica perceptível a diferença no tempo das bordas de subida entre as os dois pinos.
Como dito anteriormente, humanos não conseguem perceber a diferença no tempo. Mas com a ferramenta certa (que neste caso foi utilizado o Logic16) e testes realizados de forma padronizada, é possível descrever tais situações que poderiam serem descritos como de difícil solução para uma forma simplificada e de fácil visualização tal como é mostrado na Figura 8.
Porém, não está explícito a diferença real do tempo entre as bordas. Mas o Saleae Logic possui uma ferramenta que marca locais com ‘bandeiras’ para a medição de tempo entre tais bandeiras. Assim, no canto direito superior, há uma sessão chamada Measurements que permite definir onde tais bandeiras serão demarcadas.
Para adicionar a primeira bandeira, é necessário clicar sobre a etiqueta em T1 para marcar o início da contagem e o mesmo para o T2. O resultado será semelhante a Figura 9.
Medidas Com Logic16
Assim, na mesma sessão (Measurements), terá as informações do tempo de início e término da contagem e assim a diferença entre eles juntamente com a margem de erro do cálculo da captura do sinal. Tudo isso é fornecido automaticamente pelo software Saleae Logic no qual delimita a sua margem de erro de acordo com cada equipamento utilizado.
Portanto, no teste realizado pelo autor, a diferença obtida no teste foi de 6.4 us. Ou seja, o Arduino, para decodificar a próxima instrução e realizar a operação sem nenhum delay entre elas, levou 6.4 us pra que a ação seja totalmente realizada.
Este processo envolve muitas coisas como a busca da instrução, a decodificação, e execução desta (também conhecido do inglês ‘fetch-decode-execute‘) no qual há uma série de passos a serem realizados pelo controlador do Arduino para a execução até o momento da realização da mudança do sinal na porta de saída.
Texto Na Serial
A função do analisador lógico Logic16 é simplesmente captura os sinais decorrentes a cada fio conectado a ele.
Como por obrigatoriedade os protocolos devem ser definidos antes da captura dos dados, a captura dos sinais torna um procedimento simples sendo a obtenção dos sinais mais rápida e eficiente evitando testes desnecessários na captura.
A interpretação dos sinais obtidos fica por conta do software ligado diretamente ao analisador. O Saleae Logic é responsável por receber os dados obtidos e interpretá-los da maneira que o usuário achar conveniente perante os protocolos disponíveis e estipulados previamente no software.
Assim, com o Async Serial, é possível reconhecer informações tais como texto enviadas pelo fio capturado (Desde que esta não possua nenhum mecanismo de criptografia acoplado ao texto enviado).
Código No Arduino
Assim, após compilado o seguinte código no Arduino, e definido o protocolo de leitura como o Async Serial, será possível visualizar o texto no qual o Arduino está enviando.
[code language=”c”]
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print(“C2ISC – Grupo de Pesquisa do IFMG – Concepção
de Circuitos Integrados e Sistemas de Comunicação.”);
}
[/code]
Na Figura 11 exibe uma parte do texto lido e a Figura 12 exibe as medidas da captura de cada caractere que no qual foi utilizado o caractere C do início da frase para a medição como mostra a figura.
Saída De Dados
É possível salvar os dados coletados de modo persistente para que estes sejam analisados posteriormente.
Tais formatos podem ser do próprio software sendo eles as extensões de arquivos no formato logicsettings e logicdata no qual os dois salvam as configurações utilizadas para a captura mas somente o segundo citado salva os dados obtidos por ela.
Há outras três maneiras de salvar a captura em arquivos. Arquivos no formato VCD, Binary e CSV que podem ser abertos por outros programas a escolha do usuário de acordo com o suporte a leitura e manipulação destes arquivos.
Article Name: Componente analisador de sinais Logic16 e seu software Saleae Logic – Parte 3 de 3
Description: Exemplos de uso do analisador lógico.
Author: Rodolfo Labiapari Mansur Guimarães
Publisher Name: Laboratório iMobilis
Referência: http://www2.decom.ufop.br/imobilis/componente-analisador-de-sinais-logic16-e-seu-software-saleae-logic-parte-3-de-3/