![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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ぐらいになるだろうと思ったのですが、全く変わりません。
点滅はします。
一体何が違うのでしょうか。
ご教授お願いします。
No.3ベストアンサー
- 回答日時:
a++ 時に TOIF=0 が無いのですが?
(メインプログラムに戻らずに割り込みにの多重実行になっているのでは)
参考URL:http://www6.plala.or.jp/hide_kok/nannda/pic/pic0 …
素晴らしい!!!その通りでした!
そうですよね、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の外に出しただけです。
これで無事に点滅が遅くなりました。
回答ありがとうございました!
No.4
- 回答日時:
まず、TOIFとTOIEは違うものなのですよね?
まあ、それはどうでも、ですが。TOIFをどこか他でで制御しないと、この関数は一回だけ10をカウントしてPORTAとPORTBに操作をしてTOIFはゼロになってそれっきりですが、そういう意図でしょうか?
さて、その操作ですが、シンボル名から、PORTAとPORTBはIOポートだと推測しますが、それは、書き込んだ値が読み返せるものなのでしょうか?PORTA ^=0xffは、PORTAから値を読み、それと0xffの排他的論理和を、PORTAに書き込む、という動作をします。前に書き込んだアタがちゃんと読み出せるのでしょうか?
回答ありがとうございます!
T0IE
はタイマー割り込みの許可を設定するものです。
これが0だと割り込みは不許可になり動作せず、1だと許可されて動作します。
T0IF
はタイマークロックが入ってくると加算される箱のようなものです。
これがいっぱいになると割り込みハンドラが呼ばれるようです。
呼んだあとは自動的に0に戻り、また加算されていきます。
その繰り返しで一定周期に割り込みハンドラを呼び、LEDの出力を反転させているのです。
要するに違うものです。
そもそも点滅はしているので、問題なく0xffの排他的論理和をPORTA,Bに書き込んでいます。
つまり読み込んでもいます。
と、思っています(汗)
PICマイコンは今までの経験上、PORTに書き込んだ値は読み出せます。
私が使っていたマイコンが、たまたま読み出せただけかもしれませんが。。。
No.1
- 回答日時:
早速の回答ありがとうございます。
returnを外しても症状は変わりませんでした。
しかし、returnはなくてもいいようですね!
参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/11/09 13:27
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- C言語・C++・C# プログラムの時、フローチャートはどうなりますか?図でお願いします。 int main(void) { 1 2022/10/01 22:45
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# 10人分の生徒の英語の点数{32,34,41,38,40,26,14,46,42,50} と数学の点 2 2022/05/26 21:31
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Amazonfireタブレットにわから...
-
スーパーのレジで並んでいたら...
-
一定時間操作がなかったら、と...
-
マイコン C言語 割り込み処理...
-
電車のドアの前での並び方
-
PICでのプログラムによるチャタ...
-
割り込み中に例外異常
-
システムの割り込みについて シ...
-
PICのPWMの正しい使い方につい...
-
複数の割込み処理からアクセス...
-
電車で待機列の割り込みについ...
-
PICによる7セグLED3桁制御
-
割り込み処理から引数を取得す...
-
【組込み】割り込み中のstatic...
-
VB.net 割り込みの禁止
-
USB機器からのデータ受信による...
-
Chat GPTに、課題として、二と...
-
Macターミナルで実行中のプログ...
-
TCP/IP通信時のサーバーからの受信
-
タスクマネージャーのプロセス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ショッピング
-
スーパーのレジで並んでいたら...
-
pic 複数の割り込み関数 切り分...
-
マイコン C言語 割り込み処理...
-
Amazonfireタブレットにわから...
-
CPUの処理量を減らすコーデ...
-
irqbalance って
-
CPU負荷率の安全な上限と計...
-
一定時間操作がなかったら、と...
-
電車で待機列の割り込みについ...
-
VB6でSendKeyを利用したTab移動...
-
(H8マイコン)タイマ割込で変更...
-
駅のトイレでナイチンに邪魔さ...
-
アセンブラのタイマー割り込み
-
PICのPIN変化割り込みに...
-
USJでの割り込み
-
H8マイコンで割り込みが任意の...
-
PIC16F84AのRBポート変化割り込...
-
AKI-H8/3048Fでのタイマ割り込み
-
H8マイコンでの割り込み(シリ...
おすすめ情報