2016-12-12 3 views
1

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の代替機能とは何かを持っているかもしれないと思いますが、私はこれを無効にする方法がわかりません機能性。

誰かが間違っているアイデアはありますか?

+0

代替機能の詳細を示すデータシートにはリンクしていません。 PD4の場合、代替出力機能はありません。ADC入力またはタイマ・トリガ入力のいずれかです。したがって、PORTDがトライステートになるとリレーをオフにするチップがリセットされている可能性があります。 main()が終了した後はどうなりますか?あなたはしばらく置いてみましたか(1); PORTDの設定後にループするので、main()は終了せず、出力が安定しているかどうかを確認します。別のポートのピンからリレーを駆動しようとしましたか?トランジスタのベースをドライブする直列抵抗、リレーコイルの両端のダイオードがありますか? – barny

+0

@barny、私はwhile(1)ループを試して、同じ結果を得ました。あなたが言及しているように、リレーは抵抗とダイオードで駆動されます。私は印刷されたPCB上にあるので、別のポートを試していませんが、何も動作しなければ何か一緒にハックすることができます。そのポートのトライステート機能を無効にすることができるかどうか知っていますか? – Sean

+0

CPUがリセットされると、設計上のポートはデフォルトで入力、すなわちハイインピーダンスになり、リレーがオフになります。あなたはその行動を変更することはできませんし、変更したくありません。オシロスコープなど、ポート上の信号を見る方法はありますか? CPUをリセットする回路にハードウェアウォッチドッグタイマのようなものはありませんか? – barny

答えて

1

問題はウォッチドッグタイマでした。 WDTON(ウォッチドッグ・タイマは常にオン)のヒューズをFalseに設定しても、発振の問題は解決しませんでした。この設定をfalseにすると、は常ににはなりませんが、確かにがオフになります。main()に次の行をなかっ置く:

MCUSR &= ~(1 << WDRF); 

あなたはまた、あなたのスクリプトの先頭にウォッチドッグタイマヘッダavr/wdt.hをインポートする必要がある、またはヘッダファイルに:

#include <avr/wdt.h> 

だから今のコードを読み取り:

#include <avr/io.h> 
#include <avr/wdt.h> 

int main(void) 
{ 
    // turn off watchdog 
    MCUSR &= ~(1 << WDRF); 

    // toggle PD4 as an output 
    DDRD |= _BV(4); 

    // set output high 
    PORTD |= _BV(4); 

    // wait 
    while(1) 
    { 
     // do nothing 
    } 
} 
+1

@BenceKaulics、私は(20時間待たなければならない)許可されたら、私はやります! – Sean

関連する問題