dポイントプレゼントキャンペーン実施中!

c言語、PICともに素人です。

あるサイトのプログラムで、割り込みを使いLEDを点滅させるというものがありました。
割り込み時毎にLEDへの出力を反転させているだけです。

しかし、これだとLEDの点滅が速いのでもう少し遅くしようと、割り込み10回で出力を反転させるようなプログラムを組みました。

#include "pic.h"
#include "delay.h"

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_ON & CP_OFF);

int a;

void main(void)
{
 GIE = 1;
 T0IE = 0;
 T0CS = 0;
 PSA = 0;
 OPTION_REG |= 0x07;
 TMR0 = 0x00;
 TRISA = 0x00;
 TRISB = 0x00;
 a = 0;
 T0IE = 1;

 while(1);
}

void interrupt peko(void)
{
 if(T0IF)
 {
  if(a==10)
  {
   T0IF = 0;
   PORTA ^= 0xff;
   PORTB ^= 0xff;
   a=0;
  }
  else
  {
   a++;
  }
  return;
 }
}


aという変数をおいて、最初a=0にしておきます。
割り込みが発生するたびにaに+1していき、aが10に達した時処理をし、aを0に戻す。

これで点滅速度が1/10ぐらいになるだろうと思ったのですが、全く変わりません。
点滅はします。

一体何が違うのでしょうか。
ご教授お願いします。

A 回答 (5件)

a++ 時に TOIF=0 が無いのですが?


(メインプログラムに戻らずに割り込みにの多重実行になっているのでは)

参考URL:http://www6.plala.or.jp/hide_kok/nannda/pic/pic0 …
    • good
    • 0
この回答へのお礼

素晴らしい!!!その通りでした!

そうですよね、a++時にもTOIF=0しておかないと戻らないですよね(汗)

一応改善後のプログラム(改善したとこのみ)を書いておきます。

void interrupt peko(void)
{
 if(T0IF)
 {
  T0IF = 0;
  if(a==10)
  {
   PORTA ^= 0xff;
   PORTB ^= 0xff;
   a=0;
  }
  else
  {
   a++;
  }
 }
}

T0IF = 0;をifの外に出しただけです。
これで無事に点滅が遅くなりました。

回答ありがとうございました!

お礼日時:2012/08/15 17:55

アタ(チェック)


値○
    • good
    • 0
この回答へのお礼

No.3の方の通りでした。
回答ありがとうございました!

お礼日時:2012/08/15 17:55

まず、TOIFとTOIEは違うものなのですよね?


まあ、それはどうでも、ですが。TOIFをどこか他でで制御しないと、この関数は一回だけ10をカウントしてPORTAとPORTBに操作をしてTOIFはゼロになってそれっきりですが、そういう意図でしょうか?
さて、その操作ですが、シンボル名から、PORTAとPORTBはIOポートだと推測しますが、それは、書き込んだ値が読み返せるものなのでしょうか?PORTA ^=0xffは、PORTAから値を読み、それと0xffの排他的論理和を、PORTAに書き込む、という動作をします。前に書き込んだアタがちゃんと読み出せるのでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

T0IE
はタイマー割り込みの許可を設定するものです。
これが0だと割り込みは不許可になり動作せず、1だと許可されて動作します。

T0IF
はタイマークロックが入ってくると加算される箱のようなものです。
これがいっぱいになると割り込みハンドラが呼ばれるようです。
呼んだあとは自動的に0に戻り、また加算されていきます。
その繰り返しで一定周期に割り込みハンドラを呼び、LEDの出力を反転させているのです。

要するに違うものです。


そもそも点滅はしているので、問題なく0xffの排他的論理和をPORTA,Bに書き込んでいます。
つまり読み込んでもいます。
と、思っています(汗)

PICマイコンは今までの経験上、PORTに書き込んだ値は読み出せます。
私が使っていたマイコンが、たまたま読み出せただけかもしれませんが。。。

お礼日時:2012/08/15 17:48

このプログラムだけで


「割り込み」があったときに peko という関数を呼び出す
かどうかはわからんのだけど, それは大丈夫?
    • good
    • 0
この回答へのお礼

点滅はしているので、割り込み自体は発生しているようです!

回答ありがとうございました。

お礼日時:2012/08/15 17:34

割り込み処理にreturnが必要ですか?



参考URL:http://homepage3.nifty.com/mitt/pic/picc/picc675 …
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。

returnを外しても症状は変わりませんでした。

しかし、returnはなくてもいいようですね!
参考になりました。

お礼日時:2012/08/14 23:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!