Multiplexação de saída de dados em um monitor de porta paralela

Exibição de barramento de dados multiplexados com saída paralela e porta serial Arduino.

O artigo descreve o método de multiplexação do uso da porta D do microprocessador ATMEL 328P (Arduino NANO), a fim de fornecer saída de bytes alternativos ao monitor e trocar por canal serial.

De alguma forma, montei um dispositivo para monitorar o nível de monóxido de carbono (CO) a partir de elementos desnecessários - um monitor do Nokia N95, Arduino NANO com portas ruins (D3 e D11, interrompido devido a um curto-circuito malsucedido de +400 volts ao depurar um gerador de alta tensão), placas tocando sons e sensor de monóxido de carbono MQ7. Todos esses detalhes, em um grau ou outro, estavam com defeito (exceto no sensor) e não foram encontrados em nenhum outro projeto. Curiosamente, descobriu-se que o dispositivo é muito útil ao usar um fogão no país. O verão de 2019 acabou não sendo quente e eu esquentei o fogão quase todos os dias por algumas semanas em julho, combinando agradável (meditação sobre a chama) com útil (reciclagem de árvores de lixo serradas). Acabou sendo muito fácil controlar os regimes de combustão, todas as manipulações com as abas foram imediatamente refletidas nas leituras do dispositivo, o que possibilitou o controle inteligente do fogão. O dispositivo não está descrito neste artigo; existem muitos dispositivos na Internet para todos os gostos. Uma característica distintiva do meu dispositivo é a função de monitoramento contínuo da saúde do sensor de CO com base em uma comparação da curva de referência armazenada e obtida em tempo real, bem como a alta taxa de reação a alterações no nível de CO alcançadas pela comparação dos dados armazenados no ciclo anterior com os atuais.

O foco deste artigo é aumentar a velocidade do processador e a exibição com troca de dados em bytes paralelos.

A tela possui troca de bytes paralela e, apesar do uso de todos os métodos conhecidos por mim para aumentar a taxa de câmbio, a saída para ela acabou sendo bastante lenta. O principal motivo é a necessidade de gerar bits de dados em bits para diferentes bits de portas diferentes, pois o Arduino Nano não possui uma única porta completa com largura de um byte. Esse modo de saída requer aproximadamente 8 vezes mais tempo do que gravar um byte em um registro. O NANO possui uma única porta D de pleno direito, mas seus bits menos significativos são usados ​​para a porta serial do hardware, através da qual os esboços são carregados no processador e o esboço é trocado com a máquina host.

Eu encontrei uma maneira relativamente simples de usar a saída de exibição byte a linha. Este método consiste no uso alternado da porta D para enviar dados para um monitor e trocar dados por um canal serial.

O método proposto pode aumentar significativamente a velocidade da troca integral com a tela (cerca de 3 vezes de acordo com minhas medidas). A palavra “integral” significa que foram medidos os tempos totais de execução das operações de renderização de tela no nível macro. É provável que a medição do tempo no nível de E / S atômica proporcionasse um ganho significativamente maior (na região da mesma ordem).

As medições foram realizadas em um modelo especialmente montado (veja a Figura 1) da seguinte maneira:

  1. No programa de teste, os carimbos de data / hora foram colocados com a saída para a máquina host.
  2. O display foi conectado aos pinos D2 - D9, um programa de teste foi carregado, no qual o byte era emitido distribuindo o byte por bits.
  3. O display foi conectado aos terminais D0 - D7, um programa de teste foi carregado, no qual o byte era emitido usando o comando PORTD = data.

imagem

imagem
Figura 1. Fotos do layout para testar a multiplexação de saída

Os programas são exatamente os mesmos, a alternância do método de saída foi realizada alterando os nomes das rotinas SendDat e SendCom para SendDat1 e SendCom1, respectivamente.
A saída do programa para o monitor de série interno foi registrada no OneNote e analisada.

imagem
Figura 2. Medindo o tempo necessário para exibir no modo de saída de bytes

imagem
Figura 3. Medição do tempo da tela no modo de saída de bits

Os resultados da medição estão resumidos na tabela 1.

imagem
Tabela 1. Ganho integrado na taxa de câmbio

As desvantagens do método proposto são a necessidade de usar comandos adicionais para alternar os modos de exibição e trocar por uma porta serial.
Você também pode esperar algumas dificuldades ao receber dados da máquina host. A recepção é possível apenas com a inclusão explícita do modo de canal serial, o que requer uma organização clara dos processos no esboço com base no tempo.

O estudo do manual do processador forneceu as seguintes informações: a inclusão do modo de porta serial intercepta o controle das pernas D0 e D1 no nível do hardware. Isso significa que as tentativas de controlar as pernas a partir do esboço não fornecerão o resultado desejado.

Um estudo mais aprofundado da questão mostrou que, se você não incluir a porta serial no esboço com o comando Serial.open (), a porta D inteira permanecerá à disposição do usuário. Você pode colocar a porta no modo de saída em todas as pernas com o comando DDRD = 0xFF e enviar o byte inteiro com o comando PORTD = data ao mesmo tempo, onde a variável data contém os dados de saída.

Colocar a porta D no modo de saída é suficiente uma vez (em Configuração). A ativação subsequente do modo de comunicação serial não afeta o modo da porta D - ele permanece no modo de saída paralela de 8 bits. Quando o modo de troca serial está ativado, os terminais D0 e D1 entram nos modos de recepção e transmissão, respectivamente. “1” aparecerá no pino D1, independentemente do estado anterior do bit D1, e esse “1” estará nesse pino o tempo todo enquanto o modo de transmissão serial estiver ativado, exceto nos momentos da transmissão do símbolo. Quando o modo de transmissão serial é desativado, as saídas D0 e D1 entram no estado de saída e os sinais do registro de saída aparecem nelas. Se no registro de saída no lugar de D1 houver "0", uma margem negativa será gerada na saída, o que levará à transmissão do caractere falso para o canal serial.

Agora vamos considerar a questão - mas esse uso da porta D impedirá o download de programas? Quando o programa é carregado, o processador é redefinido pelo pulso gerado pelo controlador da porta USB do FT232RL (ou seu CH340 analógico) quando o sinal DTR é definido. O sinal DTR vai de 1 a 0 e uma queda negativa no capacitor redefine o processador. Após uma redefinição, o processador liga a porta serial, inicia o carregador de inicialização e recebe o código do programa. Portanto, alterar o modo de operação da porta D não interfere no carregamento normal do esboço.
Se o esboço exigir saída para a porta serial, o comando Serial.open () será suficiente antes dos comandos de saída.

No entanto, há sutileza. Consiste no fato de que a entrada RxD do chip FT232RL permanece conectada à saída TxD e os dados que são exibidos no visor são recebidos e enviados à máquina host. Esses dados parecem ruído, embora na realidade não sejam (Figura 4).

imagem
Figura 4. Visualização da tela no modo de saída de bytes sem bloqueio

Existem duas maneiras de lidar com esse sinal desnecessário.

A primeira maneira é o software. Consiste no fato de que o esboço antes da saída usa o comando Serial.println () para criar uma nova linha antes da saída de informações úteis. Isso tornará mais fácil para a máquina host analisar as linhas recebidas e destacar as informações úteis do esboço.

A segunda maneira é o hardware. A entrada RxD do FT232RL é conectada à saída TxD através de um resistor de 1 kΩ. Para bloquear a transferência de informações, basta conectar a entrada RxD FT232RL a "1". Tornar isso o caminho mais fácil é uma das conclusões gratuitas do Arduino. Eu usei a saída do D8. Para executar esta ação, soldei o terminal 7 do resistor RP1B com um valor nominal de 1 kOhm de fios com um conector no final, passando-o pelos orifícios na placa para fixação mecânica. Na Figura 5, essa conexão é mostrada por uma linha vermelha; a Figura 6 mostra uma fotografia do ponto de solda.

imagem
Figura 5. Parte do circuito do Arduino Nano

imagem
Figura 6. Local de solda de um fio adicional no Arduino NANO

Esse mecanismo funciona assim: após a redefinição, a perna D8 está no modo de entrada de alta impedância e a placa Arduino não interfere com a operação normal do mecanismo de carregamento de programas na placa.

Quando é necessário começar a controlar a exibição no esboço, o pino D8 é alternado para o modo de pino ativo, ele é definido como "1" (isso bloqueia a transferência de dados do pino TxD Atmel328P para o pino RxD FT232RL) e depois o comando Serial.end (); é executado. O procedimento é importante porque, após desligar o modo de transmissão serial, o bit D1 aparece no pino TxD, que é armazenado no registro de saída da porta D do registro de bytes anterior nesta porta. Se o bit D1 for "0", quando o modo de transmissão serial estiver desativado, a perna do processador mudará de "1" para "0" e isso gerará uma transmissão de caracteres parasitas no canal serial.

No processo de depuração, também tivemos que esperar o final da transferência de todo o buffer para a máquina host antes de bloquear o canal serial, caso contrário, alguns dos dados transmitidos seriam perdidos.

Quando um esboço precisa habilitar a transferência de dados via porta serial, é necessário ativar o modo de transferência serial e desativar o bloqueio da transmissão de dados seriais, configurando o modo de leitura no pino D8.

Para executar essas tarefas, duas rotinas foram adicionadas ao esboço:

void s_begin() { Serial.begin(115200); //    TxD   USART.  TxD   "1",  RxD   pinMode(8, INPUT); //    RxD FT232RL  "1",       RxD FT232RL } 

 void s_end() { Serial.flush(); //   pinMode(8, OUTPUT); //  FT232RL  "1"       .   D8_High; //    Serial.end(); //   .      TxD  RxD    D0(RxD)  D1(TxD)  D } 

Um programa de teste completo pode ser realizado aqui .

Source: https://habr.com/ru/post/pt476986/


All Articles