プロが教える店舗&オフィスのセキュリティ対策術

質問は初めてです。
GIEビットが1にセット出来ません。
デバッグでは、
GIE = 1;
の文が無視され飛び越えます。
デバッグのwatchで監視してもセットされないのが確認出来ます。
マイコンに書き込んで実行させても割り込みが発生してないのが分かります。

環境はMAPLAB IED v8.46 と HI-TECH PICC の無料版?です。

↓プログラム全てを書くとやたら長いのでIOなどの設定している関数だけ表示します↓
void Ioport(){
PORTA = 0x00;//ポートA初期化
PORTB = 0x00;//ポートB初期化
PORTC = 0x00; //ポートC初期化
TMR0 = 0x00;//タイマ0初期化

OSCCON = 0x60;//外部クロック20MHz使用
OSCTUNE = 0x00;//動作クロックのチューン無し
CM1CON0 = 0x00;//コンパレータ無効でデジタルIOモード可能
CM2CON0 = 0x00;
ANSEL= 0x00;//デジタルIOモード
ANSELH = 0x00;
OPTION = 0x08;//RBプルアップ有効、TMR0を命令クロック、
//プリスケーラをTMR0に使わない
T0IF = 0;//フラグ タイマ0初期化
T0IE = 1;//割り込みタイマ0可能
GIE = 1;//割り込み全体可能(ココが飛ばされます)

TRISA = 0b11000000;//出力:0~4LED7セグメントのブロック用5つ
WPUB = 0b11100111;//0~2プルアップ設定 3赤外線受信4赤外線送信
TRISB = 0b11101111;//0~2ボタン3つ 出力:4赤外線送信
TRISC = 0b00000000; //0~7LED7セグメントのパーツ用8つ

//GIE = 1;ココに書くとコンパイラがエラーを起こします。
}
void main(void){
Ioport();
    //GIE = 1; ココに書くとセットしてくれて正常に動作します。
}

他に
GIE = 1;
を書く場所によっては、
Ioport()関数の最後に書くと、
67.23 ";" expected
71.1 undefined identifier "portBRead"
77.9 void function can't return a value
81.9 void function can't return a value
85.9 void function can't return a value
88.9 void function can't return a value
91.9 void function can't return a value
と、的外れ的なコンパイルエラーが出ます。
そして、
main()関数のIoport()関数の後に書くと、
何故か正常動作し実際に書き込んでも正常に動作します。

書く順番によっては
T0IF = 0;
GIE = 1;
T0IE = 1;
と書くとGIEビットは1にセットされるが、T0IEビットは無視され飛び越えます。
新規projectで再度試しましたが同じでした。

これは、コンパイラのバグなのでしょうか?

解決策の回答をお願いします。

A 回答 (2件)

>はHI-TECH PICCの#include <pic.h>の中でしょうか?


たぶんそれにあたると思います。

>ダミー関数を挟む方法はまだ試していませんが、
>回答を見る前に、改行して空白を開けるだけで回避出来てしまいました。
>後、CM2CON0 = 0x00;の文も飛ばされ無視されてました。ここも空白で
>回避しました。
>そして、その無視された行に「SDFKJSDSPDFKLPOK」見たいなでたらめな
>文字を書いてもコンパイル成功してしまいます。。

相当問題があるみたいですね。そんなだからサポートをやめたんだと
思います。

>もし、コンパイラを変えるとしたら
>サポートのあるC言語コンパイラは何がありますでしょうか?
>CCSは無料版が出て良いと聞きました。
>コンパイラを変えると定義方法は変わってしまいますか?

CCSは、使ったことがあります。マニュアルもしっかりしているし、
CCS-Cでの解説本もあったと思います。
定義方法というか、ライブラリとか大きく違うように思います。
IO関係もライブラリになっていたように思います。
    • good
    • 0
この回答へのお礼

なるほど、CCSのサイトを見てきました日本語での説明がしっかりしていて
色々機能が豊富な感じがしました。
今、作っているプログラムが完成したら検討したいと思います。
これで、質問締め切りますね。ありがとうございましたー

お礼日時:2010/04/13 16:00

私の調べ方が足らないのかもしれませんが、HI-TECH PICCが入手できないので


よくわかりませんが、
T0IF GIE T0IE は同じバイトのビット位置違いで、ご指摘のようにコンパイラの
(最適化の)バグ臭いとは思います。 T0IF GIE T0IEの定義を見てみたいのですが、
見られないのでなんとも言えないです。
確認方法としては、間に別ファイルのダミー関数を挟んでみたら回避はできると
思いますが、根本的には、サポートのあるコンパイラを使う必要があるように思います。


extern void dammy(void);

dammy();
T0IF = 0;
dammy();
GIE = 1;
dammy();
T0IE = 1;

別ファイル
void dammy() {}
    • good
    • 0
この回答へのお礼

ありがとうございます。
>>T0IF GIE T0IE は同じバイトのビット位置違い
と言うのは、
INTCONレジスタがバイト(8Bit)でその中のT0IF GIE T0IEはビット0~7Bitのビット違いって事ですよね?
>>T0IF GIE T0IEの定義
はHI-TECH PICCの#include <pic.h>の中でしょうか?
ダミー関数を挟む方法はまだ試していませんが、
回答を見る前に、改行して空白を開けるだけで回避出来てしまいました。
後、CM2CON0 = 0x00;の文も飛ばされ無視されてました。ここも空白で回避しました。
そして、その無視された行に「SDFKJSDSPDFKLPOK」見たいなでたらめな文字を書いてもコンパイル成功してしまいます。。

どうやら、コンパイラからその文は見えていない様でした。。

もし、コンパイラを変えるとしたら
サポートのあるC言語コンパイラは何がありますでしょうか?
CCSは無料版が出て良いと聞きました。
コンパイラを変えると定義方法は変わってしまいますか?
↑別の質問にしたほうがいいかな?

お礼日時:2010/04/12 13:57

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