Archive: June 1, 2022

Hardware xor para pinos de saída no AVR microcontroladores

Você sabia que muitos chips AVR têm um tipo de opção de hardware exclusivo ou (xor) quando se refere aos níveis lógicos dos pinos de saída? Se você olhar na folha de dados (a imagem acima é uma captura de tela de um datasheet atiny13), você encontrará uma seção na alteração do PIN. Acontece que, se você definir uma porta como saída, escrevendo a lógica para o registro de pinos correspondente alternará os níveis lógicos daquilo. Isso é muito fácil de negligenciar se você está escrevendo em C, mas eu tenho trabalhado em aprender um pouco de linguagem montadora e achei que isso seja muito útil. Continue lendo após o intervalo e eu lhe direi como aconteceu sobre esta informação e o que é bom para.

Então, primeiro desligado, vamos falar sobre por que isso não importa muito se você estiver escrevendo no código C. Normalmente, se você quiser alternar alguns pinos de saída, poderá escrever um um-liner que o XOR é com um Bitmask:

1.
Portal ^ = 0xff;

Este é um pouco de tantilha (aprenda muito mais sobre isso da minha série tutorial) que executa o XOR nos níveis de saída atuais e grava o resultado de volta para a porta. Mas a mesma coisa pode ser feita em hardware, escrevendo o bitmask para o registro PINB:

1.
PINB = 0xFF;

Você realmente não se importa, porque é apenas uma linha de código. Na verdade, é provavelmente mais simples de Xor o Portal porque faz muito mais sentido conceitualmente. Mas o compilador pode acabar usando muito mais ciclos do que se você tivesse gravado no registro do PIN.

Aconteceu por esse recurso porque estava piscando alguns LEDs como uma maneira de aprender montador. Eu tive essa confusão de código em uma rotina de serviço de interrupção:

1.
2.
3.
4.
ldi myreg, 0xff
em intregar, portal
eor intreg, myreg
porta fora, intrég

Ele carrega um bitmask em um registro, carrega na lógica atual da Portal para outro registro, executa um XOR dos dois e grava o resultado de volta à Portal. Isso leva quatro ciclos e requer dois registros. Alternar bits é uma operação tão rudimentar Fui espantado Não havia um comando para XOR bits diretamente, então comecei a procurar. Eu me deparei com este pequeno artigo em AVR Freaks que me cegou no recurso de alternância. Agora consegui diminuir meu código do montador da seguinte maneira:

1.
2.
ldi intrég2, 0xff; uso temporário intreg2 como uma máscara de bits
Pinb, intreg2; escrita para o Pinb Effectivley faz um exclusivo ou no portal

Isso resulta no mesmo efeito alternar, mas requer apenas dois ciclos e requer o uso de apenas um registro.

O que eu encontrei muitos interessantes é que não importa o quanto eu use chips AVR, nunca há escassez de surpresas esperando para ser encontrado na folha de dados.