出産前後の痔にはご注意!

INTピンを使ってsleepから割り込み復帰したいのですが、
思ったとおり動いてくれません。

メインをSLEEPにし、割り込みが入ると割り込み側の
プログラムを実行し、終わるとメインのSLEEPに
もどってINTの割り込みに備えるようにしたいのです。

現段階では割り込みをするとSLEEPから割り込み
には行くのですが、そのまま割り込み側のプログラムを
永遠に繰り返してしまいます。

listp=12f629
includep12f629.inc

RELOOP1equ0x20
CT_DELAYNMSequ0x21
PCLATH_TEMPequ0x2a
W_TEMPequ0x2b
STATUS_TEMPequ0x2c
stuequ0x2d

org0x0
gotostart
org0x4
;レジスタの退避
movwfW_TEMP
swapfSTATUS,W
clrfSTATUS
movwfSTATUS_TEMP
movfPCLATH,W
movwfPCLATH_TEMP
clrfPCLATH
;割り込み要因のチェック
btfssINTCON,INTF
gotoINT_NEXT1
;ここから割り込みプログラム

省略

INT_NEXT1
;レジスタの復帰
movfPCLATH_TEMP,w
movwfPCLATH
swapfSTATUS_TEMP,W
movwfSTATUS

swapfW_TEMP,F
swapfW_TEMP,W

retfie

;初期設定
start:
;aLED単独の輝度

bcfSTATUS,RP0

clrfINTCON
clrfGPIO
bsfSTATUS,RP0
clrfOSCCAL
clrfTRISIO
bsfTRISIO,2
movlwB'01000101'
movwfOPTION_REG

bcfSTATUS,RP0


;割り込み許可する
movlwB'11010000'
movwfINTCON

nop
sleep
nop
goto$-3
end

こんな感じのプログラムなのですが、INTピンからの割り込みと
いうことでプリスケーラなどは使っていません。
データシートも読んだのですが今市理解ができていない状況です。
お願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

No.1の者です。


私の勘違いでした。大変申し訳ありません。
http://www.cqpub.co.jp/hanbai/books/37/37391/373 …
を参考としてください。
    • good
    • 0

retfieを実行しても、戻らないということですが、


retfieを実行する直前のスタック・ポインタの内容はどのようになっていますか?
retfieを実行しても、戻らないということはその時点でのスタック・ポインタに戻りアドレスが格納されていないということではないでしょうか?
スタックの初期設定はされていないようです。
割り込みの中でレジスタを戻しているのは何故でしょうか?
通常はレジスタを割り込み中でセーブするために、退避させると思います。スタック・ポインタの内容を調査すべきと思います。

この回答への補足

ありがとうございます。
スタックポインタというのは特に設定しておりませんでした。
データシートのどの辺りをみればわかるのでしょうか?

レジスタの退避は参考書を写したものでほかの
プログラムで使ったときも、
このやり方で問題なく動作しておりますので
問題ないと思うのですが、、

念のため再確認しておきます。

補足日時:2008/03/19 19:04
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qプルアップ抵抗値の決め方について

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調節していって電圧降下が0.9Vとなるように設定するのでしょうか。どうぞご助力お願いします。



以下、理解の補足です。
・理解その1
ふつう、こういう場合は抵抗値を計算するためには、電圧降下と抵抗に流れる電流が決まっていることが前提だと考えていました。V=IRを計算するためには、この変数のうち2つを知っていなければならないからです。
また、例えば5V/2Aの電源を使った場合、マイコン周りは電源ラインからの分岐が多いため、この抵抗に2A全てが流るわけではないことも理解しています。

電源ラインからは「使う電流」だけ引っ張るイメージだと理解しているのですが、その「使う電流」が分からないため抵抗値を決定できません。(ポート入力電流の最大定格はありますが…)


・理解その2
理解その1で書いたように、抵抗値を計算するためには、電圧降下と抵抗に流れる電流が必要だと理解しています。図2を例に説明します。Rの値を決めたいとします。
CD間の電圧降下が5Vであることと、回路全体を流れる電流が2Aであることから、キルヒホッフの法則より簡単にRの値とそれぞれの抵抗に流れる電流が分かります。今回の例もこれと同じように考えられないのでしょうか。

ほとんどこの分野に触れたことがないので大変初歩的な質問になると思います。

図1のような回路でプルアップ抵抗の値を決めたいと思っています。
B点での電圧を4.1Vとしたい場合について考えています。その場合、AB間での電圧降下は0.9Vとなります。

抵抗値×電流=0.9Vとなるようにプルアップ抵抗の値を決めるべきだと考えていますが、この抵抗に流れる電流が分からないため、決めるのは不可能ではないでしょうか?

抵抗値を決めてからやっと、V=IRより流れる電流が決まるため、それから再度流れる電流と抵抗を調...続きを読む

Aベストアンサー

NO1です。

スイッチがONした時に抵抗に流れる電流というのは、最大入力電流や最大入力電圧
という仕様から読めば良いのでしょうか。
→おそらくマイコンの入力端子の電流はほとんど0なので気にしなくてよいと思われます。
入力電圧は5Vかけても問題ないかは確認必要です。

マイコンの入力電圧として0Vか5Vを入れたいのであれば、抵抗値は、NO3の方が
言われているとおり、ノイズに強くしたいかどうかで決めれば良いです。
あとは、スイッチがONした時の抵抗の許容電力を気にすれば良いです。
例えば、抵抗を10KΩとした場合、抵抗に流れる電流は5V/10kΩ=0.5mAで
抵抗で消費する電力は5V×0.5mA=0.0025Wです。
1/16Wの抵抗を使っても全く余裕があり問題ありません。
しかし、100Ωとかにしてしまうと、1/2Wなどもっと許容電力の大きい抵抗を
使用しなければいけません。
まあ大抵、NO3の方が書かれている範囲の中間の、10kΩ程度付けておけば
問題にはならないのでは?

QPICシリアル通信での入出力送信方法

現在PIC勉強中の初心者です。
教えて頂きたいのですが、

現在PIC16F877Aを2台使用して相互間をシリアル通信で結び、
一台のPICからの入力12点を二台目のPICの出力12点に出力するプログラムを作成中です。
現在は通信で1点の入力をうけ1点の出力にだすところまでは何とかできました。

そこで調べても合理的で良いやりかたが見つからなかったのでよく御存じの方に教えて頂きたいのですが、
12点の入力をどのようなやり方でまとめ、シリアル通信で送り、どのようなやり方で展開し12点の出力を出すのか良いやり方がありましたら教えて下さい。
(入力はRA,RE,RC,RDを使い、出力はRB,RC,RDを使用してます)
(自分としては2進数でまとめて2つ送ったらわかりやすいのではないかと思っているのですが..)

Aベストアンサー

PICも含めて、いかなる組込みマイコンでシリアル通信を行う場合でも、その内蔵のシリアル通信機能を使えば、比較的簡単に「送信」する事は誰でも可能です。

問題は、シリアルデーターの2バイト以上の受信です。
(1)その内蔵のシリアル通信機能で、いつ来るか判らない「受信データー」を絶えず環視している必要が有る。->つまり割込処理とするか、あるいは絶えず受信のプログラムを優先的に動かしている必要があるという事です。

(2)内蔵機能であろうが、プログラムでのシリアル受信であろうが、1バイト以上連続して何バイトもデーターが送られて来る様な場合には、その間髪入れずに送られてくるバイトデーターを、取りこぼす事無く、次々と記憶する領域(バッファー)が必要となります。

PICの内蔵シリアル受信機能には、バイトバッファを2個持っています。つまり、2個までは連続したバイトデーターを取りこぼしする事無く自動で受信できますが、それ以上連続したバイトを受信すると、取りこぼしを起こすという事です。

今回は、2バイトで済むので、特に問題なく受信が可能と思いますが、あまりにも、通信のノイズに対する防御が無くて、今後のためにも、そのままの受信はお薦めできません。

詳しくは、下記サイトにPICでのシリアル通信で、割込型ソフトウエアFIFOバッファについて、やさしく詳しく教えています。

ご参照ください。これを知らないと、2バイト以上の受信が全てのマイコンで出来ません。
「パレットソフト」
http://www.palettesoft.co.jp/index.htm
HOME > 技術談話 > PIC microcontroller > シリアル通信

頑張って下さいね。

PICも含めて、いかなる組込みマイコンでシリアル通信を行う場合でも、その内蔵のシリアル通信機能を使えば、比較的簡単に「送信」する事は誰でも可能です。

問題は、シリアルデーターの2バイト以上の受信です。
(1)その内蔵のシリアル通信機能で、いつ来るか判らない「受信データー」を絶えず環視している必要が有る。->つまり割込処理とするか、あるいは絶えず受信のプログラムを優先的に動かしている必要があるという事です。

(2)内蔵機能であろうが、プログラムでのシリアル受信であろうが、1バイト...続きを読む

QPICを3.3Vで動作させるには?

PIC初心者です。PIC16F873AというPICを3.3Vで動作させたいのですがうまくいきません。同じ回路で電源電圧を5Vにし、動作することを確認しているので回路やプログラムには問題ないと思われます。
データシートでは2.0V~で動作するようになっていると思うのですが、電源電圧5Vで動作させるときとどこか変更しなければならない個所があるのでしょうか?それとも3.3Vでは動作しないのでしょうか?
ちなみにクロックは外部クロック10MHzを使用しています。
PICに詳しい方、よろしくお願いいたします。

Aベストアンサー

BODEN bit は禁止にしていますか?
このビットが許可になっていると電源電圧がおよそ4V以下でリセットが掛かってしまいます。

QPIC のデータEEPROMに書き込みができません

お世話になります。
PICのデータEEPROMへの初歩的な書き込みができずに悩んでいます。
ご経験のある方、私の誤りについてご教示いただければありがたく思います。

PICについてはいくつかの種類でプログラムを書いていますがEEPROMのデータ領域は初めてです。
各種のサイトでは簡単らしいのですが・・・

当方の試験作業は次のとおりです。

対象チップ PIC16F819
パソコン Windows-XP
書き込み装置 PIC-kit3
書き込みソフト MP-LAB IDE V8.83
プログラム言語 HI-TECH C V9.83
電源 Pic-Kit3から5Vで供給
確認方法
・MP-LAB- View- EEPROM- のFillmemoryにより、EEPROMにすべてFFH/00Hのいずれもが書き込めることを確認の上、256バイトすべてにFFH
・下記プログラムを走らせる
(実行後1秒後に1回書き込み(十進15番地に十進20の例)、以降ランプの点滅。ランプの状態でひとまずの動作の正常は確認)
・MP-LAB- View- EEPROM- により確認・・(全部FFHのまま(泣))

そのほか、チップを新品に交換したり、書き込み時間をEEIFで検査するアルゴリズムにしてみたり、いろいろやってみましたが、壁にぶつかっています。
よろしくお願いいたします。

#include<htc.h>
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 4000000
#endif

__CONFIG(CP_OFF & BOREN_OFF & MCLRE_OFF & PWRTE_ON & LVP_OFF & WDTE_OFF & FOSC_INTOSCIO & DEBUG_OFF & CPD_OFF);

void main() {
OPTION_REG = 0b00000000; // output pullup
OSCCON = 0b01100100; // internal OSC 4MHz
TRISA = 0b11111110; // GP-A input RA7=output
ADCON1 = 0b10000111; // No AD all digital
TRISB = 0b00000000; // GP-B output
INTCON = 0b00000000; // no interrupt

RB1 = 0;    //Green Lamp off
RB3 = 0; //Red Lamp off
while (WR = 1) {
__delay_ms(1000);
}

EEADR = 15;
EEDATA = 20;
EEPGD = 0;
GIE = 0;
WREN = 1;
EECON2 = 0x55;
EECON2 = 0xaa;
WR = 1;
     RB1 = 1; // Green Lamp
__delay_ms(100);
     RB1 = 0;
    GIE = 1;
 WREN = 0;

EWWW:; // IDLE Lamp Red
RB3 = 1;
__delay_ms(400);
RB3 = 0;
__delay_ms(500);
goto EWWW;

}

お世話になります。
PICのデータEEPROMへの初歩的な書き込みができずに悩んでいます。
ご経験のある方、私の誤りについてご教示いただければありがたく思います。

PICについてはいくつかの種類でプログラムを書いていますがEEPROMのデータ領域は初めてです。
各種のサイトでは簡単らしいのですが・・・

当方の試験作業は次のとおりです。

対象チップ PIC16F819
パソコン Windows-XP
書き込み装置 PIC-kit3
書き込みソフト MP-LAB IDE V8.83
プログラム言語 HI-TECH C V9.83
電源 Pic-Kit3から5Vで供...続きを読む

Aベストアンサー

<Read EEPROM> コマンドを実行していますか? pic_eeprom -> MPLAB
また出力されたアセンブルリストを確認してみては

http://sdr-de-bcl.blog.so-net.ne.jp/2010-03-27
http://sfukuda.at.webry.info/201112/article_10.html

参考URL:http://www.robotsfx.com/robot/robohow/RoboHow106/RoboHow106.html

QPIC16F84AのRBポート変化割り込みの使い方

PIC16F84AのRBポート変化割り込みを使いたいのですが、三つ質問があります。

1.割り込み処理に入ったときに、「BCF INTCON,RBIF」としてもRBIFフラグが立ったままで、「RETFIE」で割り込みから戻った直後にすぐにまた割り込み処理に入ってしまいます。(MPLABのシミュレーション上でStimulusControlerでPINを変化させて実験)これの原因は何なのでしょうか?RBIFフラグはどのようにして解除したらよいのでしょうか?

2.RBポートは内部でプルアップせずに、外に抵抗をつけてプルアップしようと考えているのですが、その場合でも正しくシミュレーションできるのでしょうか?

3.RBポート変化割り込みは、LからHになった場合と、HからLになった場合の両方に反応するのでしょうか?

以上三つの質問に回答お願いします。

Aベストアンサー

ソースが無いので実装が分かりませんが。
1 と 3 は下記のサイトで解決するように思います。
http://www.picfun.com/pic08.html

2 はすいませんが分かりません。

参考URL:http://www.picfun.com/

QPICのI2C通信のプログラムについて

I2Cの同報機能を使いたいのですが、プログラムの書き方がよく分かりません。
後閑さんの電子工作の実験室も見たんですが、そこに書いてあったのは多分アセンブラのプログラムで、CCSを使っている自分には理解できませんでした。
CCSで同報機能は使えるのでしょうか?もし使えるのなら、プログラム例などをいただけると助かります。
ちなみに、使っているPICはマスターが16F873でスレーブが16F819です。
よろしくお願いいたします。

Aベストアンサー

後閑さんの電子工作の実験室にC言語のもあります。
http://www.picfun.com/c15.html
I2Cの同報機能は、送信する「スレーブのアドレス指定」を0にするだけで実現できますので、Cでも問題なく使えますよ。

同報では無いですが、I2C通信の参考に。
PICでI2C通信(PIC16F873)
http://homepage1.nifty.com/rikiya/software/316PICI2C.htm

QPICマイコンで変数値の保持

PICマイコンで変数値の保持

PICマイコンでリセット時にリセット前の変数の値を1,2個保持して
リセット後に用いたいのですが、なにかいい方法はありませんか?
EEPROMは搭載してません。
また外部接続のパーツを増やさないのが望ましいです。
データ領域をうまく使う方法がありますかね?

PIC24FJ32GA002です。
開発環境はMPLAB v8.35
C30コンパイラー
です。

よろしくお願いします。

Aベストアンサー

リセット時に電源を落とさないのであれば、RAMはクリアされないのでRAMのデータがそのまま使えます。
だだし、起動した時にリセットされたのか、電源を切断したのか判別する必要があります。多分IOのレジスタを調べれば判るはずです。

電源を切断するならばやはり外部にシリアルのEEPROMが必要です。

Qint型(2バイト)データの分割

int型(2バイト)データの分割

マイコンのフラッシュ領域にint型のデータ(2バイト)を
1バイトづつ書き込むのに以下のコードを考えています。

unsigned int data;
unsigned char dat1,dat2;

data = 555;
dat1 = 0;
dat2 = 0;

dat1 = (char)data;
dat2 = (char)data >> 8;

以下、dat1とdat2をフラッシュに書き込む。

未熟者でプログラムとして合っているのか解りません。
やり方として問題ないでしょうか?
またもっと良い方法があればご教授願います。

Aベストアンサー

まず考えるべきは、フラッシュメモリの書き込んだデータは誰が使うのか? です。

自分(というか、そのシステム)だけでしか使わないのであれば、余り気にすることはありません。

この場合だと、

data = 555; に対して、

dat1 = data % 0x100;
dat2 = data / 0x100;

が一番安全でしょう。
右辺はいずれも int のサイズで計算されて、代入の際に、(数値として)下の桁から、char 分が代入されます。
※代入の直前までは、int で計算されることに注意。

読み出しの場合は、

data = dat2 * 0x100 + dat1;

で安全に元に戻せます。
(これも、0x100 が int 幅なので、 dat2 * 0x100 は int に拡張され、それに対して、int に拡張された dat1 が加算されます)

すべて符号無しなので、char -> int への拡張も問題なく行われます。

あと、かけ算や割り算は効率が悪いのではないか? という心配も無用です。
0x100 のような、(2進数で)きりの良い数のかけ算や割り算は、普通のコンパイラは、内部でシフトに置き換えますので。

まず考えるべきは、フラッシュメモリの書き込んだデータは誰が使うのか? です。

自分(というか、そのシステム)だけでしか使わないのであれば、余り気にすることはありません。

この場合だと、

data = 555; に対して、

dat1 = data % 0x100;
dat2 = data / 0x100;

が一番安全でしょう。
右辺はいずれも int のサイズで計算されて、代入の際に、(数値として)下の桁から、char 分が代入されます。
※代入の直前までは、int で計算されることに注意。

読み出しの場合は、

data = dat2 * 0x100 + dat1;

で...続きを読む

QCOMポート通信をモニターしたい

現在、PCと組み込み系の端末との間でRS-232C通信をさせています。このRS-232C通信のTXとRXのデータのタイミングなどをモニターできるソフトはありませんでしょうか?

現在RS-232C通信をさせているのですが、組み込み系の端末側にはTCP-RS232C通信変換のモジュールを取り付けていて、PC側もTCP-RS232C変換させるソフトを使用しています。


TCP-RS232C通信変換のモジュールはWIZNET社製のWIZ110SRというのを使用しています。

PC側ではTCP-RS232C通信変換ソフトでWIZNET社製のWIZ VSPというソフトを使用して、TCPで受けたデータをRS-232Cに変換して受信プログラムソフトに転送しています。


このPC側の受信ソフトとTCPへ変換する間のCOMポートの通信をモニターできるようなソフトというものはありませんでしょうか?

どうぞ、ご教授頂きますようお願い致します。

Aベストアンサー

PC自体のCOMポート(USB-Serial変換でも)なら、ソフトでどうにかできる場合もあるでしょうが……

ご使用の機器の場合、PCからはネットワーク端末に見える…のではないでしょうか?
ドライバでCOMポートとして見えるのですか?
# 後者ならソフトで何とかできる…かも知れません。

こちらの組み込み系開発ではラインアイ社の機器を使用しています。
http://www.lineeye.co.jp/html/product_le2500.html
http://www.lineeye.co.jp/html/product_le3500.html
などですね。
http://www.lineeye.co.jp/html/product_LE-200PS.html
http://www.lineeye.co.jp/html/product_LE-150PS.html
でも用途によっては十分かも知れません。
# 組み込み開発に使うのであれば1台あった方が何かと便利です。
# それなりに高機能なので…値段も結構しますけどね。

QRS232C 調歩同期のビットレート誤差について

RS232C 調歩同期のビットレート誤差は何%程度まで許容できるのでしょうか?
また、目安とその理由について教えて下さい。

SH4のプログラムを組んでいます。
例えば、パソコンとRS232C(調歩同期)通信を行う際のビットレートの設定で、SH4側のビットレート誤差は何%以内にするべきでしょうか?
クロック同期の場合は、「なるべく1%以内になるように」とマニュアルに記載があるのですが。。。

Aベストアンサー

まずは
データ長8ビット
パリティなし
ストップビット1

だとすると、シリアルデータは全部で10ビットです。

スタートビットから同期し、各ビットの中央でデータをサンプリングするなら、10番目のビットが50%以上ずれるとアウトです。つまり5%誤差ですね。

しかし世の中そううまくいきません。コントロールICによって違いますが、ビットレートの8倍や16倍で各データをサンプリングします。1ビットを8回や16回チェックしてるんですね。

ビットがHかLかを判断するのもいろいろですが、中央部数回分(8回サンプルなら3~4回程度)を多数決原理で判断するのが多いようです。とすると、せいぜい2.5%となります。

これに、クロック源の誤差も加味すると2%くらいが限度です。



CPUクロックからビットレートを生成する場合、ビットレートにあわせた変な周波数のクロック源でなければ0%なんて無理ですよね。実際は1%以内なら気にしませんし、大丈夫ですよ。


人気Q&Aランキング