出力ピンのロジックレベルに関する場合、多くのAVRチップにはハードウェア排他的または(XOR)オプションがあることがわかりましたか。データシートを見ると(上の画像はAttiny13データシートのスクリーンショットです)。ピンのトグルのセクションがあります。ポートを出力として設定すると、対応するピンレジスタに論理1を書き込むと、そのアウトの論理レベルを切り替えます。あなたがCに書いているのであれば、これは怠慢ですが、私は少しアセンブラ言語を学ぶことに取り組んできました。これが非常に役に立ちます。休憩の後に読み続けてください、そして私がこの情報をどのように起こったのか、そしてそれが良いことを教えてくれます。
だから最初にオフにして、Cコードに書いているのであれば、それほど問題ない理由について話しましょう。通常、一部の出力ピンを切り替えたい場合は、XORがビットマスクで1つのライナーを作成します。
1
ポートB ^ = 0xFF;
現在の出力レベルでXORを実行し、結果をポートに書き戻します。しかし、ビットマスクをPINBレジスタに書き込むことで、ハードウェアで同じことができます。
1
PINB = 0xFF;
それは単なるコードであるため、あなたは本当に気にしません。実際、それは概念的にはるかに理にかなっているので、それはおそらくポートBをXORよりも簡単です。しかし、コンパイラは、ピンレジスタに書き込んだ場合よりもはるかに長いサイクルを使用して終わる可能性があります。
私はアセンブラを学ぶ方法としていくつかのLEDを点滅させていたので、私はこの機能を越えて起こりました。私はこのコードの中断サービスルーチンにこのジャンブルを持っていました:
1
2.
3.
4.
LDI MyReg、0xFF
intreg、portb
Eor Intreg、MyReg
ポートB、侵入者
ビットマスクを1つのレジスタにロードし、PortBから別のレジスタに現在のロジックにロードされ、2つのXORを実行し、その結果をPORTBに書き戻します。これには4サイクルかかり、2つのレジスタが必要です。切り替えビットはそのような初歩的な操作です私は驚くべきことを驚かせたので、私は検索を始めました。私はビット切り替え機能に私を完成させたAVRフリークでこの短い記事に出会いました。今、私は次のようにアセンブラコードを減らすことができました。
1
2.
LDI INTREG2、0XFF;ビットマスクとしてのinterg2を使用する
PINB、INTREG2; PINB EFFESTIVELYへの書き込みは排他的論理和またはPORTB
これにより、同じトグル効果が得られますが、2サイクルだけが必要で、1つのレジスタのみを使用する必要があります。
私が多くの興味深いことを見つけたのは、AVRチップを使用していても、データシートに見つかるのを待っている驚きの不足は決してないということです。