HORDWARE XOR для выходных выводов на микроконтроллерах AVR
Знаете ли вы, что многие чипы 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, там никогда не будет нехватки сюрпризов, ожидающих, чтобы быть найден в таблице данных.