トピック関連記事
48時間以内の記事は New Mark で表示されます
interrupt関数
みなさんこんばんは。

F1827で、以下のプログラム(もとは、猛牛ロックさん作成)ですが、大変重宝しています。
F1827でコンパイルするとエラーが出ます。
IDXは、interrupt関数に!が出ています。
原因を分かったらご教授願います。


/*間欠*/

// PIC16F1827 Configuration Bit Settings

// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define KanketuTime 2
#define DousaTime 1
#define On 0
#define Off 1
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 4000000
int Start;

// プロトタイプ宣言
void InitInterTimer0 (void);
void WaitTime (int cnt);

// メイン関数
void main (void){
OSCCON = 0b01101010;//内蔵発振器 4MHz使用に設定
PORTA = 0x00;// 電圧レベルの初期設定
PORTB = 0xFF;
// 入出力設定
TRISA = 0b01010000;//RA5は入力専用・RA6は入力他は出力
TRISB = 0b00000000;//RB0は入力
//初期設定
RA2=Off;//MACH
RA6=Off;
Start=0;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
int Buzer=0;//

// 永久ループ
while(1){
if(Start==1){//スタートフラグが1なら動作開始
RA2=On;
Buzer=On;
Second(DousaTime);
//RA2=Off;
//Second(KanketuTime);
}
if(Start==0){
if(Buzer==On){
Second(KanketuTime);
RA2=Off;
Buzer=Off;
}

}
}
}

static void interrupt isr()
{//TMR0の割り込み処理(割り込みサブルーチン)
if(INTCONbits.TMR0IF==1){//割り込みがあったら
TMR0 =0 ; // タイマー0の初期化
if(RA6==0){//MACHからの信号をしらべて0(Low)だったらスタートのフラグを1にする
if(Start==0){
Start=1;
}
}
if(RA6==1){//MACHからの信号をしらべて1(High)だったらスタートのフラグを0にして
if(Start==1){
Start=0;
//RA2=Off;//機器の動作を強制的に止める。
}
}
INTCONbits.TMR0IF=0;
TMR0=0;
}
}

// タイマ0割込み設定関数
void InitInterTimer0 (void)
{//割り込み設定
OPTION_REG=0b000000000;//プリスケラ? 2 5ビット=0 WDTは使わない
TMR0=0; //TMR0カウンターを0に
INTCONbits.TMR0IF=0; //TMR0フラグクリアー
INTCONbits.TMR0IE=1;//TMR0割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
}

// 待ち時間関数}
void Second(int sec){
while(sec >0){
sec--;
__delay_ms(10);
}
}
TR 2018/11/26(Mon) 20:33 No.1249
Re: interrupt関数
> !が出ています。

元のプログラムと見比べてみてください。
何が変わっているのか。
場所は「!」が付いているので判っているんですよね?
更にコンパイルすればエラーメッセージが出ると思います。
猛牛ロック   2018/11/27(Tue) 12:42 No.1250
Re: interrupt関数
猛牛ロックさんありがとうございます。
自分なりに、データシートを見たりして、プログラむ見直しをしたりして、
現在は以下の通りですが、
エラーの表示は、
interrupt関数に「!」の表示はそのままです。
でも何度見ても、エラーには思えないプログラム内容です。
エラー原因をわかりましたら、教えてください。
宜しくお願いします。

エラー表示も添えておきます。
なお、グーグル翻訳では、翻訳しきれませんでした。


エラー表示内容

make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'C:/Users/TOSHI/MPLABXProjects/LESSON_C.X'
make -f nbproject/Makefile-default.mk dist/default/production/LESSON_C.X.production.hex
make[2]: Entering directory 'C:/Users/TOSHI/MPLABXProjects/LESSON_C.X'
"C:\Program Files (x86)\Microchip\xc8\v2.00\bin\xc8-cc.exe" -mcpu=16F1827 -c -fno-short-double -fno-short-float -O0 -fasmfile -maddrqual=ignore -xassembler-with-cpp -Wa,-a -DXPRJ_default=default -msummary=-psect,-class,+mem,-hex,-file -ginhx032 -Wl,--data-init -mno-keep-startup -mno-osccal -mno-resetbits -mno-save-resetbits -mno-download -mno-stackcall -std=c99 -gdwarf-3 -mstack=compiled:auto:auto -o build/default/production/main.p1 main.c
main.c:71:6: error: variable has incomplete type 'void'
void interrupt isr(){//TMR0<82><U+030A><84><82><U+835E><82><U+074F><88><97><9D>
^
main.c:71:15: error: expected ';' after top level declarator
void interrupt isr(){//TMR0<82><U+030A><84><82><U+835E><82><U+074F><88><97><9D>
^
;
2 errors generated.
make[2]: *** [build/default/production/main.p1] Error 1
(908) exit status = 1
nbproject/Makefile-default.mk:106: recipe for target 'build/default/production/main.p1' failed
make[2]: Leaving directory 'C:/Users/TOSHI/MPLABXProjects/LESSON_C.X'
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[1]: Leaving directory 'C:/Users/TOSHI/MPLABXProjects/LESSON_C.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

BUILD FAILED (exit value 2, total time: 1s)










//*****************************
//* 間欠タイマー
//* 16F627A
//* XC8 V1.35
//* No481
//* RA6←MACHからの入力想定
//* RA2←制御機器へ
//*****************************
#include <xc.h>
#define _XTAL_FREQ 4000000 //delay用宣言
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: I/O function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
#pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Data memory code protection off)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#define KanketuTime 2
#define DousaTime 1
#define On 0
#define Off 1
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 4000000
int Start;

//関数宣言
void Second(int sec);
// プロトタイプ宣言
void InitInterTimer0 (void);
// メイン関数
void main (void){
OSCCON = 0b01101010;//内蔵発振器 4MHz使用に設定
PORTA = 0x00;// 電圧レベルの初期設定
PORTB = 0xFF;
// 入出力設定
TRISA = 0b01010000;//RA5は入力専用・RA6は入力他は出力
TRISB = 0b00000000;//RB0は入力
//初期設定
RA2=Off;//MACH
RA6=Off;
Start=0;
int Buzer=0;//

void InitInterTimer0 (void);
GIE=1;//全体割り込み許可
// 永久ループ
while(1){
if(Start==1){//スタートフラグが1なら動作開始
RA2=On;
Buzer=On;
Second(DousaTime);
//RA2=Off;
//Second(KanketuTime);
}
if(Start==0){
if(Buzer==On){
Second(KanketuTime);
RA2=Off;
Buzer=Off;
}
}
TMR0=0;
TMR0IF=0;
}
}

void interrupt isr(){//TMR0の割り込み処理
if(TMR0IF==1){//割り込みがあったら
if(RA6==0){//MACHからの信号をしらべて0(Low)だったらスタートのフラグを1にする
if(Start==0){
Start=1;
}
}
if(RA6==1){//MACHからの信号をしらべて1(High)だったらスタートのフラグを0にして
if(Start==1){
Start=0;
//RA2=Off;//機器の動作を強制的に止める。
}
}
TMR0=0;
TMR0IF=0;
}
}

// タイマ0割込み設定関数
void InitInterTimer0 (void)
{
//割り込み設定
OPTION_REG=0b000000000;//プリスケラ? 2 5ビット=0 WDTは使わない

INTCONbits.TMR0IF=0; //TMR0フラグクリアー
INTCONbits.TMR0IE=1;//TMR0割り込み許可
INTCONbits.GIE=1;//全体割り込み許可
}

// 待ち時間関数}
void Second(int sec){
while(sec >0){
sec--;
__delay_ms(10);
}
}
TR   2018/11/27(Tue) 20:18 No.1251
Re: interrupt関数
TRさん,猛牛ロックさん,こんばんは。

ちょっとご無沙汰してました。

TRさん,自分で試してないので,?ですが,

多分,プロトタイプの宣言ををしてないからかなと推測します。

static void interrupt isr()

の関数がプロトタイプの宣言をしてなくて,

main関数より後にでてくるからだと思います。

多分コンパイラーは,プログラムの先頭から解釈していきますが,

main関数のなかで,プロトタイプの宣言をしてない関数に出会う,

あるいは,main関数より前に書いてない関数に出会うと,

関数の参照ができなくて,エラーがでます。

プロトタイプの宣言,面倒なので,サブ関数をメインの前に,

記述するといいかもです。

確か,私の流儀では,そうしてました。
mabo   2018/11/28(Wed) 00:15 No.1252
Re: interrupt関数
No.1249は私の環境ではその部分にはエラーは出ません。

No.1251はMABOさんの言う通り、関数宣言でしょう。
但し、チラッと見ただけですけど、1827用のプログラムになっていないようですし、
内容的にも劣化しているように思います。
猛牛ロック   2018/11/28(Wed) 04:22 No.1253
Re: interrupt関数
みなさんこんにちは。

maboさんへ

>プロトタイプの宣言,面倒なので,サブ関数をメインの前に,

記述するといいかもです。


やってみましたが、同じエラーが出ました。




猛牛ロックさんへ

>No.1249は私の環境ではその部分にはエラーは出ません。



そうでしたか〜。


と思って、
IDXにおいて、PICをF627Aに選択して、ビルトしましたが
同じエラーが出ました。

もう、自分レベルにはどうしようもありません。



AM11:51 追記
猛牛ロックさんの 環境 という話から、やむを得ず、
MPLAB のバージョンを変更したら、コンパイルできました。

IDXが3.36
コンパイラが1.42です。

自分には、こんな方法しか思いつきませんでした(泣く

でも、皆さんのおかげで、猛牛ロックさんが考えたプログラムを
自分風にアレンジして、しかも、1827、、違うか1823?の日本語バージョンで
書き込みに成功できて、うれしいです。
感謝申し上げます。

Config、AD、PWM、割り込み、タイマー0 そのほかにも
制御文、等々 学習を深められましたm(__)m

TR   2018/11/28(Wed) 08:35 No.1254
Re: interrupt関数
> IDXが
何度か書いていますけど、これってMPLAB X IDEですよね?せめてXIDEにして欲しいです。

> コンパイラが1.42です。
一度バージョンを2.?に上げましたよね?書式がちょっと変わったのかもしれません。
その辺りはコンパイラのマニュアルを見る必要があります。
基本的に、コンパイラの仕様に従うしかありません。
それは初心者でもベテランでも同様です。

で、学習ですけど、私の思うには人のコードを書き換えても上達しません。
まずはデジタル入出力を使った、簡単なものから始めた方が良いです。
※本文にあたる部分が10行以下のもの。

取り敢えず重要な事は
・C言語の書式を覚える。(宣言、初期化、関数、引数、戻り値、変数の型)
・GPIOを操作出来るようになる。(入出力を正しく操作)
・if文、while文(for文)を覚える。
・変数を使えるようになる(フラグ、カウント)
といった事です。

レジスタを詳しく覚える事は、時間の無駄が大きいです。
レジスタを操作すること自体は重要な事ですけど、逆に言えば、適切に設定するだけの事です。
最低限の事だけにしておいた方が良いです。
猛牛ロック   2018/11/28(Wed) 18:18 No.1255
Re: interrupt関数
猛牛ロックさんの言われる通りです。
早く書き込めるようになりたいものです。
TR   2018/11/28(Wed) 21:04 No.1256
Re: interrupt関数
TRさん,猛牛ロックさん,こんばんは。

TRさん,私の環境でコンパイルしてみました。

   X IDE 5.03→5.05の最新でした。
   X C8  2.00

の最新の環境です。

TRさんのアップした最初のプログラムです。

若干変更しました。まず,プロトタイプの宣言で,

  // プロトタイプ宣言
  void InitInterTimer0 (void);
  void WaitTime (int);
  void Second(int);

のようにvoid Second(int);を付け加えました。

それから,ブログの方に掲載しますが,若干の変更をしたら,

コンパイル通りました。

新しい,コンパイラーは,文法にシビアなようです。

それと,xc.h の読み取りのバグがあるようです。

http://mabo52.sakura.ne.jp/files/newmain.c
mabo   2018/11/28(Wed) 21:41 No.1257
Re: interrupt関数
maboさんこんばんは。

自分のは、バージョンを5.2から3.65にした関係で、表の掲示板の画面は開けなかったです。

金曜にXIDE5.2に戻してやってみます。

それから、
PIC3のボードですが、完成しました。といっても、PICの電源に
つけるセラミックコンデンサがありませんが、、、
でも、差し込みピンや電源を分配しやすくするためのピンも
併せてつけたので、これで十分です。
どうせ、バラックでのテストは、やはりブレットボードに頼るようになるのでしょうから、
自作ボードはこれくらいにします。

TR   2018/11/28(Wed) 22:37 No.1258
Re: interrupt関数
TRさん,猛牛ロックさん,こんにちは。

今回のプログラム16F1827だったんですね。

以前,猛牛ロックさんにご紹介いただいて,私も使いました。

ただ,クロックが早くなる分,いままで動いていたプログラムが動かなくなったり,

88〜1827への移植に苦労したりました。

LATレジスタ使ったり,間にNOPのアセンブラーいれたり,見よう見まねでやりました。

http://kuri6005.sakura.ne.jp/pic/index.php?%C8%AF%B8%F7%A5%C0%A5%A4%A5%AA%A1%BC%A5%C9%28LED%29%A4%CE%C5%C0%CC%C7%2816F1827%20XC8%29

http://mitt.la.coocan.jp/pic/pic1320_06.html

http://www.microtechnica.tv/faq/faq.cgi?kate=mikroC&faq=16


あたりにその記事があります。私のブログでも,

http://mabo52.sakura.ne.jp/index.php?e=970#cmt257

に関連の記事書いてます。

なんかもういろいろ忘れています。
mabo   2018/11/29(Thu) 11:32 No.1259

処理 記事No 暗証キー

- JoyfulNote v6.02 -
++ Edited by Hamel ++