Wussten Sie, dass viele AVR-Chips eine Art von Hardware-Exklusiv- oder (XOR-) -Option haben, wenn sie die Logikstufen der Ausgabe-PINs betrifft? Wenn Sie in das Datenblatt suchen (das Bild oben ist ein Screenshot aus einem Attiny13-Datenblatt), finden Sie einen Abschnitt zum Umschalten der PIN. Es stellt sich heraus, dass, wenn Sie einen Port als Ausgabe einstellen, die Logik mit dem Schreiblogik mit dem entsprechenden PIN-Register die logischen Ebenen desjenigen schaltet. Dies ist wirklich einfach, wenn Sie in c schreiben, aber ich arbeite daran, ein bisschen von Assembler-Sprache zu lernen und fand, dass dies sehr nützlich ist. Lesen Sie weiter nach der Pause und ich sage Ihnen, wie ich mit dieser Info passiert bin und was es gut ist.
Also zuerst, lass uns darüber reden, warum das nicht wichtig ist, wenn du in C-Code schreibst. Wenn Sie normalerweise einige Ausgabestifte umschalten möchten, schreiben Sie einfach einen One-Liner, den XOR mit einem Bitmask:
1.
Portb ^ = 0xff;
Dies ist ein bisschen C-Kurzhändler (viel mehr darüber aus meiner Tutorial-Serie), die den XOR auf den aktuellen Ausgangspegel ausführt und das Ergebnis zurück in den Anschluss schreibt. Das Gleiche kann jedoch in Hardware erfolgen, indem Sie die Bitmaske auf das Pinb-Register schreiben:
1.
Pinb = 0xff;
Sie interessieren sich nicht wirklich, weil es nur eine Codezeile ist. In der Tat ist es wahrscheinlich einfacher, den Portb zu xordieren, da er auf konzeptionell viel mehr Sinn macht. Der Compiler könnte jedoch mit viel mehr Zyklen mitnehmen, als wenn Sie in das PIN-Register geschrieben hätten.
Ich bin auf dieser Funktion passiert, weil ich einige LEDs blinzelte, um den Assembler zu lernen. Ich hatte dieses Durchmesser von Code in einer Interrupt-Service-Routine:
1.
2.
3
4.
LDI MYREG, 0XFF
in Intreg, Portb
Eor Intreg, Myreg
Out Portb, Intreg
Es lädt eine Bitmask in ein Register, lädt in der aktuellen Logik von Portb in ein anderes Register, führt einen XOR der beiden aus, und schreibt das Ergebnis zurück in den Portb. Dies dauert vier Zyklen und erfordert zwei Register. Umschmelzende Bits ist ein solcher rudimentärer Vorgang, den ich erstaunt war Ich stieß auf diesen kurzen Artikel bei AVR-Freaks, die mich in das Bit-Kippmerkmal gehalten haben. Jetzt konnte ich meinen Assembler-Code wie folgt verringern:
1.
2.
LDI INTREG2, 0XFF; Zeitraum verwenden Intreg2 als Bitmaske
OUT PINB, INTREG2; Schreiben in Pinb Effectivley macht ein exklusives oder auf Portb
Dies führt zu einem derselben umgeschalteten Effekt, dauert jedoch nur zwei Zyklen und erfordert nur ein Register.
Was ich viele interessant fand, ist, dass Egal wie sehr ich AVR-Chips verwende, es ist nie ein Mangel an Überraschungen, die darauf warten, im Datenblatt zu finden war.