2017-06-26 37 views
-1

PIC用のmikroCでタイマベースの割り込みを実装する際に問題が発生しています。PIC用mikroCを使用したPICマイクロコントローラのタイマベース割り込み

PORTC.F0にキーを押してトグル間に100msの遅延がある場合、ポートピンを8回トグルしたいと思います。

通常、これは、遅延機能

for (i=0;i<=8;i++) 
{ 
    PORTB.F0=~PORTB.F0; 
    Delay_ms(100); 
} 

しかし、期間中を利用して、非常に簡単になり、他のキー入力がシステムによって失われます。だから私は、割り込みを使用してソリューションを実装することを考えました。

#define SW PORTC.F0 

char ttime,i; 
volatile flag; 

void Inittimer() 
{ 
T1CON   = 0x01; 
TMR1IF_bit = 0; 
TMR1H   = 0x06; 
TMR1L   = 0x00; 
TMR1IE_bit = 1; 
INTCON  = 0xC0; 
} 

void Interrupt() 
{ 
if (TMR1IF_bit) 
{ 
    TMR1IF_bit = 0; 
    TMR1H   = 0x06; 
    TMR1L   = 0x00; 
    ttime--; 
    if (ttime==0) 
    { 
    flag=1; 
    } 
} 
} 

void main() 
{ 
Inittimer1(); 
TRISB = 0; 
TRISC.F0 = 1; 
PORTB = 0x00; 
while(1) 
{ 
if (SW==0) 
{ 
    ttime=3; 
} 
    if (flag==1) 
    { 
    for (i=0;i<=8;i++) 
    { 
    PORTB=~PORTB; 
    flag=0; 
    } 
    } 
} 
} 

何も問題ありません。誰かがコードを修正するのを助けてくれますか?

+2

「何も問題ありません」は問題の説明ではありません。 _何がうまくいかないのですか? – Lundin

+0

事実上、Nothingは実際には非常に曖昧なコメントです。私はポート割り込みを使用して正確に8回ごとに100msごとにポートトグルを実装しようとしています。私は多くのオプションを働こうとしたが、どれも私のために働いていなかった。私が一番近かったのは、割り込みを使ってある時間遅れてPORTをトグルさせることでした。しかし、何度も何度もトグルするのを止めることはできません。 – Ace

答えて

0

void Inittimer() 
{ 
T1CON   = 0x01; 
TMR1IF_bit = 0; 
TMR1H   = 0x06; // No prescaler? I doubt your clock speed is 40-some KHz! 
TMR1L   = 0x00; 
TMR1IE_bit = 1; 
INTCON  = 0xC0; 
} 

は、なぜあなたはISRから直接LEDを制御しませんか?

if (ttime) 
     PORTB.F0 = (--ttime & 1); // ttime is not decremented when led is not blinking. 
    else 
     PORTB.F0 = 0;    // ensures the LED is off. 

8回点滅して起動するには:100msのクロックで、なぜ多くのようなこれは... LEDの「点滅」最初は、最大200msのに続くこと、中断していること

if (SW==0) 
{ 
    PORTB.F0 = 1; 
    ttime = 16; 
} 

注意を

を:速いタイマ割り込みで動作する(これは通常、他は同様に使用している)、LEDを制御することが点滅を開始するには、ソフトのポストスケーラ

if (blinking) 
    { 
     if (--blinkTimer == 0) 
     { 
     blinkTimer = BLINK_DELAY;  // whatever number it takes for 100ms. 
     PORTB.F0 = (--blinking & 1); 
     } 
    } 
    else 
    { 
     PORTB.F0 = 0 
    } 

を追加することが必要となります

if (SW==0) 
{ 
    blinking = (2 * BLINKS) - 1; 
    blinkTimer = BLINK_DELAY; 
    PORTB.F0 = 1; 
} 

これは、さらに早く点滅する必要があります。

+0

ヘルプマイケルに感謝します。私は問題を解決しました。アプローチが正しいかどうか確認してください。 'while(i <8){if(flag == 1){i ++; PORTB.F0 =〜PORTB.F0; cnt = 0;フラグ= 0;これは、ポートピンを8回トグルし、cntの値を設定することで、ポートピンがトグルされる遅延を正確に設定することができます。このアプローチは正しいですか? – Ace

+0

正しいですが、メインループをブロックします。あなたがする必要があるかもしれない他のすべての操作は何ですか? –

1

まあこれは右見ていない:

if (flag==1) 
    { 
    for (i=0;i<=8;i++) 
    { 
    PORTB=~PORTB; 
    flag=0; 
    } 
    } 

あなたが最初flagが、あなたはすぐにループを設定されていることを確認し、flagが1に戻ってオンにするのを待つずに出力を8回、を切り替えるとき。そうではありません。それは過度に単純化されています。

あなたは、その後、flag探しの出力を切り替えるとflagをクリアし、それが並列にカウンタを維持し、再設定を取得するのを待つ必要があります。 forループはこれに適した構造ではありません。プログラムの残りの部分を「ロックアウト」し、キーを押さなくてもよいからです。あなたはタイマーを初期化すると

+0

提案したことをやってみた – Ace

+0

あなたが提案したことをやってみました... forループの代わりに、ポートがトグルされてフラグがクリアされた後に別の変数iをインクリメントしました。私は 'if(i> = 8){PORTB = 0x00;}の条件文を書きました。 i = 0;} 'これはうまくいかなかった。基本的には、ある遅延の後に切り替えるためにPORTを開始することはできますが、nサイクル後にトグルを止める方法を理解できません。 – Ace

関連する問題