[Homepage][BBS][YouTube][Blog]

エアーバリアブルBBS
エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
PIC12F1822
PIC12F1822 で PORTA3 にて状態変化割り込みを考えています。LVP=1にして MCLR=0にする。更にINTCON=0x88; にしてPORTA3に入れたスイッチを押すことで点滅パターンを変化させようと考えています。下記のプログラムを入れるとINTERRUPTにはとぶようですが、L4(); と K4();を繰り返してi=2の状態にとびません。何故でしょうか。MikroCで同じような物を作っても同じ状態です。お答え下さい。インターネットに出ていました貴殿のプログラムを拝借しています。
/*******************************************
 12F1822 LED Pikapika
 author air_variable 1.0 20110214
 MPLAB 8.50 / Hitech PICC Pro Lite mode v9.70
*******************************************/
#include htc.h;
#include delay.h;
#pragma jis
#define MHz 000000
#define _XTAL_FREQ 4MHz
__CONFIG(
FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CP_OFF
& CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF
);

__CONFIG(
WRT_OFF & PLLEN_OFF & STVREN_ON & LVP_OFF
);
char i;
char b;

void L1(){RA0=1;}
void L2(){RA1=1;}
void L3(){RA2=1;}
void L4(){RA5=1;}
void L5(){RA4=1;}
void K0(){PORTA=0B00000000;}
void K1(){RA0=0;}
void K2(){RA1=0;}
void K3(){RA2=0;}
void K4(){RA5=0;}
void K5(){RA4=0;}
void D100(){DelayMs(100);}
void D50(){DelayMs(50);}
void D20(){DelayMs(20);}
//------------------main
void main(){
OPTION_REG = 0B00000000;
WPUA = 0B00001000;
PORTA = 0B00001000;
TRISA = 0B00001000;
CM1CON0 = 0;
ANSELA = 0;
OSCCON = 0B01101010;
IOCAN = 0x08;
INTCON= 0x88;
i=1;
while(1){
switch(i){
case 1:
while(1){
L1();L2();L3();L4();L5();D100();
K0();D100();
if(i!=1)break;
}
// (中略)
default:
INTCON= 0x00;
D50();
i=0;K0();
INTCON= 0x88;
asm (sleep);

}
}

interrupt func(){
IOCIE = 0;
i++;
D50();
L4();D100();
K4();D100();
IOCIE = 1;
//INTCON= 0x88;
  • T2
  • 2011/03/27 (Sun) 08:23:47
Re: PIC12F1822
func()内で

//INTCON= 0x88;
のコメントアウトを外せば動くかも...
  • natu
  • 2011/03/27 (Sun) 10:59:07
Re: PIC12F1822
natu さん ありがとうございます。早速やってみましたが動きませんでした。
mikroCで同じような動作をするプログラムを作ったのですが、デバッグすると画像のようなエラーが出てプログラム自体が止まってしまいます。どなたかPORTA3で状態変化割り込みをして成功された方は連絡いただけたら嬉しく思います。
  • T2
  • 2011/03/27 (Sun) 11:31:39
Re: PIC12F1822
まず基本的なところから
1.割り込み内で使用する変数にはvolatile
2.割り込み終了時にIOCAFをクリア
あと、記憶があやふやですが割り込み内でDelayXX使っても大丈夫だったかな?私は気持ち悪いので使えたとしても割り込み内では基本的に使わないようにしています。
また、基本的に割り込み内でmsオーダーの待ち処理をさせるのもどうかな?割り込みの意味がなくなっちゃうと思うんだけど。
どうでしょう?
  • ききょうや
  • URL
  • 2011/03/27 (Sun) 13:48:01
Re: PIC12F1822
ききょうやさんありがとうございました。
割り込みの中のL4();D100();とK4();D100();は確かに割り込みができているか確認のために入れた部分です。必要ない部分です。12F629は状態変化割り込みが簡単にできたのですが、1822はそれがうまくいかなくて困っています。INT(RB2)を使う割り込みはできたのですが、IOCの割り込みを行うと割り込みルーチンまでは行くのですが、その後メインルーチンに戻ってこない状態になります。 ありがとうございました。
  • T2
  • 2011/03/27 (Sun) 14:38:20
Re: PIC12F1822
IOCIFってROなのね。orz

ききょうやさんが書かれているように、割込み内で

IOCAF = 0;

を入れると動くはずなんですけれどね
  • natu
  • 2011/03/30 (Wed) 18:56:51
Re: PIC12F1822
natuさんありがとうございます。
どうもうまくいかなく困っております。PIC12F1822でだめなのでPIC16F1823と16F1937でもmikroCで作ってしまいましたが、3/27に書いたようなエラーが出てしまいます。
回路図を示しますので皆さんも作ってみてください。MCLRの結線が少し怪しいかもしれません。
  • T2
  • 2011/03/31 (Thu) 06:41:01
Re: PIC12F1822
>PIC12F1822 で PORTA3 にて状態変化割り込みを考えて
>います。LVP=1にして MCLR=0にする。更に
>INTCON=0x88; にしてPORTA3に入れたスイッチを押すこと
>で点滅パターンを変化させようと考えています。

データシートによれば、
PIC12F1822は、LVP=1に設定すると、MCLRビットは
無視する仕組みになっています。つまり、RA3/MCLRの
機能はMCLRのままです。

したがって、MCLR=0に設定してRA3/MCLRをRA3として
使うためには、LVPビットを‘0’にしてLVP機能を
無効にする必要があります。
  • FENG3
  • 2011/04/02 (Sat) 14:17:03
Re: PIC12F1822
FENG3 さん ありがとうございます。データシートを見て確かにそのことが書かれていました。実際に行うと動作ができました。RA3がきっちりとINPUTになっていないことで動作しなかったと言うことですね。
  • T2
  • 2011/04/02 (Sat) 20:24:30
Re: PIC12F1822
動いてよかったですね。

PIC12F1822だけでなく、PIC16F18XX/19XX シリーズは
すべてそのような仕様になっています。

旧PIC16FシリーズでLVPビットをもつ機種は、LVP=1 にした
場合は、PGMピンとMCLRピンによってLVPモード=低電圧
(単電源)プログラミングモードに入る仕組みになってい
ましたが、新シリーズではPGMピンは不要になり、
AVRのRESETピンのようにMCLRピンだけでLVPモードに入る仕組みになりました。

通常はHVP(高電圧プログラミング)モードが使用されます。

LVPモードが使えるプログラマはいまのところPICkit2だけ
で、他のプログラマはすべてHVPモード専用だと思います。

また、リビジョンA6にはバグがあって、LVPモードでは
バルク消去が機能しません(デバイスを消去できません)。
新しいロット(リビジョンA8以降)では解決されている
ようです。

つまるところ、現状ではLVP=1 に設定しても何のメリット
もない、ということです。

なお、LVP=1に設定してあってもHVPモードによる
プログラミングは実行可能です。


  • FENG3
  • 2011/04/02 (Sat) 22:16:08
Re: PIC12F1822
FENG3さんありがとうございました。PIC16F57で電子ルーレットを製作していた頃、貴殿のRCDライタを使わせていただきました。重ねてお礼を言いたいと思います。
 PIC12F629とPIC12F1822のMCLRピンの扱い方の違いがよく分かりました。説明に出ていますリビジョンA6とかA8はDIP_ICのどこかに記載されているのでしょうか。それを教えていただきたく思います。
 お陰様で、IOC入力は可能になりましたが時々スイッチでパターンを順番に切り替える部分が飛んでしまうことがあります。case3→case5といったことが起こります。具体的にプログラムを提示しますので、またお願いします。
 このメッセージの中にプログラムを書き込むと非常に多くのスペースをいただくことになり申し訳なく思います。小さく表示するにはどうしたらよいのでしょうか。
 MCLRピン(入力専用ピン)からの入力が成功したので、残ったIOピン(5本)にLEDをつなぎポケットライトを製作したいと思っています。
 最終的にはポケットライトをM-Touchを用いてスイッチ入力ができるようにしたいと思いますので、そちらの実践をされている方に書き込みもお願いしたいと思います。
 皆様のおかげで悩み事が一つずつ消えて嬉しく思っています。
  • T2
  • 2011/04/03 (Sun) 04:34:11
Re: PIC12F1822
>説明に出ていますリビジョンA6とかA8はDIP_ICのどこかに
>記載されているのでしょうか。それを教えていただきたく
>思います。
MPLAB-IDEで表示されますが、ご使用のプログラマが
PICkit2の場合は新しいPIC12F/16FシリーズではMPLAB-
IDEは現時点では未対応です。

>時々スイッチでパターンを順番に切り替える部分が飛んで
>しまうことがあります。
おそらく、バウンス(あるいはチャタリングとも)の
処理が必要なのでしょう。

具体的には、タクトスイッチのバウンスは10ms~20msで
収まりますから、スイッチが押されて20ms後にRA3が
まだLowであったらスイッチが1回押されたものと判断します。

すみません。PICCやmicroCなど、C言語はさっぱりわかり
ませんので、具体的なコードの提示はできません。

アセンブラなら、割り込みがかかってから20ms待って、
PORTAの状態を読んで、カウンタを加算、分岐処理へ、かな。

>貴殿のRCDライタを使わせていただきました。
ありがとうございます。
なお、RCDライタではサポートする予定はありませんが、
JDMプログラマではPICProg4Uで新PIC12F/16Fシリーズを
サポートする予定です(リビジョン番号も表示予定)。

  • FENG3
  • 2011/04/03 (Sun) 12:28:31
Re: PIC12F1822
目から鱗の発見で感謝です。>FENG3さん

自身が同じ症状に遭遇した時には「ハマリ」そうな内容ですし。
ありがとうございます。

natu
  • natu
  • 2011/04/03 (Sun) 15:59:10
Re: PIC12F1822
 FENG3さんありがとうございます。割り込みの中で20mS遅延を入れたりしてみましたが、Button関数がありましたのでそちらを使ってみました。この関数ならば割り込みを使う必要がない気がします。二重にしてしまっている感じがします。
 これでやると動作はきちんとしてくれて、飛び越えることもなくなりました。分岐のswitch(i)とwhile(1)の間にButtonを入れても良いのかとも思います。
  • T2
  • 2011/04/03 (Sun) 16:08:59

返信フォーム






プレビュー (投稿前に内容を確認)