HORDWARE XOR для выходных выводов на микроконтроллерах AVR

August 13, 2022 0 By vhjz

Знаете ли вы, что многие чипы AVR имеют тип оборудования Exclusive или (XOR), когда оно касается логических уровней выходных пинов? Если вы посмотрите в таблице данных (изображение выше, представляет собой скриншот из таблиц Nattiny13), вы найдете раздел на переключение штифта. Оказывается, если вы устанавливаете порт в качестве вывода, написание логики One на соответствующий PIN-регистра, переключит логические уровни этого. Это действительно легко пренебрегать, если вы пишете в C, но я работаю над изучением языка ассемблера и обнаружил, что это очень полезно. Продолжайте читать после перерыва, и я скажу вам, как я случился по этой информации и что это хорошо.

Итак, во-первых, давайте поговорим о том, почему это не имеет значения, если вы пишете в C-коде. Как правило, если вы хотите переключить некоторые выводы, вы просто напишите одноклассницу, что XOR с растровой помощью:

1.
PORTB ^ = 0xFF;

Это немного C SWINDHAND (узнайте гораздо больше об этом из моего учебного пособия), который выполняет XOR на текущих уровнях выходных и пишет результат обратно в порт. Но то же самое можно сделать в аппаратном обеспечении, написав битовую маску на PINB-реестр:

1.
Pinb = 0xff;

Вы на самом деле не заботитесь, потому что это только одна строка кода. На самом деле, вероятно, проще к Xor Portb, потому что это делает гораздо больше смысла концептуально. Но компилятор может в конечном итоге использовать гораздо больше циклов, чем если бы вы записали в RIN-реестр.

Я произошел по этой функции, потому что я мигал несколько светодиодов как способ изучать ассемблер. У меня был этот толчок кода в процедуре услуг прерывания:

1.
2.
3.
4.
LDI myreg, 0xff
в Intrec, PORTB
EOR intrec, myreg
Out Portb, Intrec

Он загружает Bitmask в один регистр, загружается в текущую логику из PORTB в другой регистр, выполняет XOR из двух и записывает результат назад к PORTB. Это занимает четыре цикла и требует двух регистров. Переключение битов – такая элементарная операция, которую я был поражен, не было никакой команды к XOR-битам напрямую, поэтому я начал искать вокруг. Я наткнулся на эту короткую статью на уродах AVR, которые сняли меня в битовую тумблевую функцию. Теперь я смог уменьшить свой код ассемблера следующим образом:

1.
2.
ldi intrec2, 0xff; временное использование intreg2 в качестве битовой маски
out pinb, intrec2; запись на pinb effectivley делает эксклюзивный или на портб

Это приводит к тому же эффекту переключения, но требует всего два цикла и требует использования только одного реестра.

То, что я нашел многих интересных, – это то, что независимо от того, насколько я использую чипы AVR, там никогда не будет нехватки сюрпризов, ожидающих, чтобы быть найден в таблице данных.