Atmel ATMega32U4をリレーで設定します(NPNトランジスタを使用してリレーへの5V電源を制御し、マイクロコントローラで直接駆動しないでください)。 PD4をデジタル出力として使用して、リレーの状態を制御したい。後でUSB通信を使用するので、私は外付けの水晶発振器を接続しているので、適切なヒューズを設定し、他のものをデフォルトにしておきます。AVR ATmega32U4のデジタル出力の発振信号
以下のような非常に簡単なプログラムを実行すると、リレーを一度オンに切り替えるだけで、リレーは約10Hzで素早くオン/オフを切り替えるようになります。
#include <avr/io.h>
int main(void)
{
// toggle PD4 as an output
DDRD |= _BV(4);
// set output high
PORTD |= _BV(4);
}
私はPORTD |= _BV(4);
行をコメントアウトすると発振を停止していることに気づいたが、私の問題を解決していませんもちろん。とにかく問題を引き起こしているのはそのラインのようです。
Atmel-ICEプログラマを介してJTAGでプログラミングしているAtmel Studio 6.2を使用しています。
暗闇の中で野生の刺しを取って、私はdatasheet(セクション10.3.3、P78)に示すように、それはICP1/ADC8
としてPD4の代替機能とは何かを持っているかもしれないと思いますが、私はこれを無効にする方法がわかりません機能性。
誰かが間違っているアイデアはありますか?
代替機能の詳細を示すデータシートにはリンクしていません。 PD4の場合、代替出力機能はありません。ADC入力またはタイマ・トリガ入力のいずれかです。したがって、PORTDがトライステートになるとリレーをオフにするチップがリセットされている可能性があります。 main()が終了した後はどうなりますか?あなたはしばらく置いてみましたか(1); PORTDの設定後にループするので、main()は終了せず、出力が安定しているかどうかを確認します。別のポートのピンからリレーを駆動しようとしましたか?トランジスタのベースをドライブする直列抵抗、リレーコイルの両端のダイオードがありますか? – barny
@barny、私はwhile(1)ループを試して、同じ結果を得ました。あなたが言及しているように、リレーは抵抗とダイオードで駆動されます。私は印刷されたPCB上にあるので、別のポートを試していませんが、何も動作しなければ何か一緒にハックすることができます。そのポートのトライステート機能を無効にすることができるかどうか知っていますか? – Sean
CPUがリセットされると、設計上のポートはデフォルトで入力、すなわちハイインピーダンスになり、リレーがオフになります。あなたはその行動を変更することはできませんし、変更したくありません。オシロスコープなど、ポート上の信号を見る方法はありますか? CPUをリセットする回路にハードウェアウォッチドッグタイマのようなものはありませんか? – barny