2012-01-07 26 views
0

ATmega 64 microcontrollerの両方の8ビットタイマを使用したいと思います。2つの8ビットタイマを使用するAVR ATmega64

私は彼らの比較割り込みを宣言するために、次のコードを使用:

.org 0x0012 ; Timer2 8 bit counter 
    rjmp TIM2 
.org 0x001E ; Timer0 8 bit counter 
    rjmp TIM1 

私はその割り込みが生成されることはありません...私は最初の割り込み(0x0012)を入力する場合は、2番目のタイマーが動作しないことに気づきました。 なぜこれが起こり、どうすれば解決できますか?

私はまた何か変わったことに気付きます。私がその命令を逆にすると、私はエラーを受け取ります:

Error 3 Overlap in .cseg: addr=0x1e conflicts with 0x1e:0x1f

答えて

4

ATmegaでは、割り込みベクタの実行中に他の割り込みがブロックされます。

これはさまざまな理由で便利な機能です。これにより、割り込みが自身を中断させないようにし、再帰によるスタックオーバーフローの可能性を防ぎ、低レイテンシ割り込みで使用するため特別なレジスタを特別に設定しておく必要がありません。 。

しかし、特に割り込み優先レベルがないATmegaでは、リエントラント割り込みを明示的に使用すると便利なことがあります。これを行うには、SEI命令を追加して割り込み許可フラグを設定するだけです。

これを行う際には、上記の問題を避けるために十分な注意が必要です。一般に、これは使用されるレジスタはスタック上に保存されなければならず、リエントラント部分が開始する前に割り込み自体を無効にする必要があることを意味します。

あなたのアドレス重複の問題は、アセンブラがプログラムアドレスをバイト単位でカウントしているのに対し、データシートの割り込みベクタアドレスはワード単位で指定されていると考えられます。たとえば、タイマ2の比較割り込みは0x24 0x12の代わりに)。ベクトルの定義を終えた後、メインコードセグメントに戻るように注意する必要があります。後続のコードは、単に他のベクトルに実行されます。

+0

これは非常に良い答えです!どうもありがとうございました! –

関連する問題