3dのポリゴンの法線ベクトルを算出するプログラムなんですが
以下のプログラムに間違っている部分はあるでしょうか
何度か試してみたのですが何度か0で除算したりしてしまいます
渡す数字が悪いのか、プログラム自体が間違っているのかわかりません
少し助けてください

//法線ベクトル計算開始
x1=1つめの頂点のx座標
y1=1つめの頂点のy座標
z1=1つめの頂点のz座標
x2=2つめの頂点のx座標
y2=2つめの頂点のy座標
z2=2つめの頂点のz座標
x3=3つめの頂点のx座標
y3=3つめの頂点のy座標
z3=3つめの頂点のz座標

x4=x2-x1
y4=y2-y1
z4=z2-z1

x5=x3-x1
y5=y3-y1
z5=z3-z1

x6=y4*z5-y5*z4
y6=x4*z5-x5*z4
z6=x4*y5-x5*y4

//正規化
er=sqrt(x6*x6+y6*y6+z6*z6)
x6=er*x6
y6=er*y6
z6=er*z6

//終わり /法線ベクトル計算

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

A 回答 (2件)

ベクトルの外積の計算


---ここから---
x6=y4*z5-y5*z4
y6=x4*z5-x5*z4
z6=x4*y5-x5*y4
---ここまで---
は、
---ここから---
x6=y4*z5-y5*z4
y6=z4*x5-z5*x4
z6=x4*y5-x5*y4
---ここまで---
にしないとダメですね。y6の符号が逆です。これではベクトルの向きがおかしくなります。

あとは、「正規化」というのが、ベクトルの長さを1にすることだったら、
---ここから---
x6=er*x6
y6=er*y6
z6=er*z6
---ここまで---
これは、
---ここから---
x6=x6/er;
y6=y6/er;
z6=z6/er;
---ここまで---
にしないとダメですね。

ここで、3点が1直線上に並んでる場合は、外積が0になるので、0除算エラーになります。
そういう点の配置の時は「法線が求められるような点の配置になっていない」と言えますので、

erが0の時は、法線は計算不可能であるという例外処理を行う必要があるでしょう。

この回答への補足

すみません、大切なこと言うのわすっれました
実は 法線ベクトルを求めて、光とのベクトルのを求め面の色を出したりして
3Dのモデルを表示したかったのですが、回転行列を座標にかけると描画少しおかしいことになってしまいます。
回転行列の角度を90度にしたりすると光と面の角度を求めるところで0で除算ししたって出ます。
ちなみに描画しているのは、立方体のポリゴンで一辺が200(メタセコイア)で中心が(0,0,0)にあります

//回転行列 あってる?
//y軸
ループ 頂点の数
kaku=ラジアンに変換(0)←90にしたらaa/qqで0で除算する
その頂点のx座標=その頂点のx座標*cos(kaku)+その頂点のz座標*sin(kaku)
その頂点のz座標=その頂点のx座標*(sin(kaku)*-1)+その頂点のz座標*cos(kaku)
終了

//y軸の回転
ループ 頂点の数
kaku=ラジアンに変換(0)←90にしたらaa/qqで0で除算する
その頂点のy座標=その頂点のy座標*cos(kaku)+その頂点のz座標*(sin(kaku)*-1)
その頂点のz座標=その頂点のy座標*sin(kaku)+その頂点のz座標*cos(kaku)
終了

//法線求める
~省略~
//終了

x7=カメラ兼光源x座標
y7=カメラ兼光源y座標
z7=カメラ兼光源z座標

//面と光兼カメラとの角度
aa=1.0*x6*x7+y6*y7+z6*z7
qq=1.0*sqrt(x6*x6+y6*y6+z6*z6)*sqrt(x7*x7+y7*y7+z7*z7)

if aa/qq! > 0 {
  描画
  x座標とy座標だけを使う(奥行きは表現しない)
}

補足日時:2011/04/10 16:02
    • good
    • 0
この回答へのお礼

本当にお礼が遅くなって申し訳ございません
実際のところ、BA選ぶのも忘れてしまいました
本当にありがとうございました

お礼日時:2011/08/19 21:26

 プログラム中には割り算がないのでゼロ割が発生することはないと思います。


 er, x6, y6,z6 の結果を使うどこかで起きているのでは。デバッグシステムの中にはトレースしているポインタの位置とゼロ割を表示させるタイミングにずれがあるものもあります。
    • good
    • 0
この回答へのお礼

本当にお礼が遅くなって申し訳ございません
実際のところ、BA選ぶのも忘れてしまいました
本当にありがとうございました

お礼日時:2011/08/19 21:26

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

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

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

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

QXファイルの法線情報について

現在、DirectX10を利用して3Dゲームを制作しています。
3Dデータを読み込むためにXファイルを使用しています。
Xファイルの読み込みは自分でXファイルパーサーを作成しています。

そして、
Xファイルには法線ベクトルの情報が入っています。
これは面法線情報であると今まで思っていました。
(理由:法線情報数が面情報数と一致していたので)
しかし、最近になって、頂点法線情報が入っているXファイルの存在を知りました
(理由:法線情報数と面情報数が一致せず、頂点数と一致していたので)

そこで質問があります。
Xファイルに入っている法線情報が面法線なのか、頂点法線なのか
知る方法を教えてください。

よろしくお願い申し上げます。

Aベストアンサー

> 1つのXファイルに1つのMESHの場合は、法線情報数が頂点数とも面数とも一致しないということはないですよね

例えば円盤をかんがえてみてください。

中心に1点頂点を置き、そこから放射状に20枚程度のポリゴンを敷き詰めて円盤を作ったとします。
完全な円盤であれば法線はどこを見ても一緒なはずなので、データとして1個だけ法線を持ち、
全ての面と法線がそれを参照する、といった形でデータを作ることもできます。

上記の場合、ファイル内の要素数は

点数→21
面数→20
法線数→1

となります。

法線数を点数、面数と一致するようにデータを作ることは可能です。
ですが、xファイルの仕様としてはそれは保障されていません。

QBASICで3Dポリゴンの描画

BASICで3Dポリゴンの描画を行おうとしているのですが、
Zソート法で順番に奥からポリゴンを描画しようとすると、
後から描画したポリゴンが他のポリゴンと重なっている場合、
PAINTで塗りつぶしがうまくいきません。

具体的には、上の図のように描画したいのに、
下の図のように描画されてしまうことです。

なにかいい解決法はあるのでしょうか。
回答をお願いします。

Aベストアンサー

BASIC といってもいろんなものがあります。
境界色を指定できるPAINTなら、線の色だけを境界にするように設定すれば、とりあえずは期待通りにはなります。

ただ、PAINTを使った方法は3Dポリゴンには不向きです。
3Dの特徴の「視点や配置を自由に変えられる」のために、とても小さくなるとか、極端に縦長/横長/斜め長になるとか、があるので
・開始座標を求めるのが大変。細長いときなど、線の外に出てしまうことがある。
・線と線の間が狭いと、数ドットの隙間ができて、塗る場所が複数に分断されることもある。
という問題があります。


実際によく使われるのは「ポリゴンの中にある全部のドットを打つ」です。
ベタにやれば
FOR Y=0 TO 全部のY座標
FOR X=0 TO 全部のX座標
iF (X,Y)がポリゴンの中 THEN PSET(X,Y)
NEXT
NEXT

ただ、これだと時間がかかるので、よくあるのは
・あるY座標について、ポリゴンの中になるX座標の範囲(X0~X1)を計算で求める
・(X0,Y)-(X1,Y)に線を引く
・以上をポリゴン全部が入る範囲のY座標で繰り返す
という手法です。

BASIC といってもいろんなものがあります。
境界色を指定できるPAINTなら、線の色だけを境界にするように設定すれば、とりあえずは期待通りにはなります。

ただ、PAINTを使った方法は3Dポリゴンには不向きです。
3Dの特徴の「視点や配置を自由に変えられる」のために、とても小さくなるとか、極端に縦長/横長/斜め長になるとか、があるので
・開始座標を求めるのが大変。細長いときなど、線の外に出てしまうことがある。
・線と線の間が狭いと、数ドットの隙間ができて、塗る場所が複数に分断されることもある。
...続きを読む

Q法線ベクトルと面の通る点が決定している場合の、法線ベクトルの大きさの求め方

法線ベクトルと面の通る点が決定している場合の、法線ベクトルの大きさの求め方を教えて下さい。
法線ベクトルの大きさはまだ適当な値が入っています。
これを、法線ベクトルの成分(a,b,c)がそれぞれ
x軸との交点が1/a、
y軸との交点が1/b、
z軸との交点が1/c、
となるようにしたいです。

Aベストアンサー

正規化された法線ベクトルを n,
方程式の係数になっている法線ベクトルを e = (a, b, c)、
通る点を p、面上の点を r とすると

e = |e|n

ax+by+cz = e・r = |e|n・r = 1 →n・r=1/|e|

この式は面上のすべての点で成り立つので、r = p のとき

n・r =n・p=1/|e| → |e| = 1/(n・p)
これで、既知の法線の方向 n と通る点pから法線ベクトルの大きさ |e| が求まります。

nは既知なので

e = |e|n

で a, b, c を計算できます。

以上。

Qゲーム・3Dプログラムの用語、基礎を説明しているサイト、書籍ありますか?

Web系からゲームプログラマになった者です。
プログラマ歴自体は長い&C言語もそれなりにやってきたのですが、アクセスした時のことだけ考えればいいWeb系とは違い、ゲームは常に常駐するプログラムなので、同じ言語でも全く仕様が違い、未だその感覚が掴めません。
音楽や画像を直接扱うところも、Webとは違います。

業界独特の、3Dソフトなどとの連携もありますが、基礎知識がないため業界の書籍を読んでも一足飛びで解りにくいところが多々あります。

特に3Dのプログラム&ゲームプログラムの基礎の考えについて書かれたサイトや書籍はありますか?
「猫でもわかるプログラミング」的な、実際のソースやプログラム言語の解説ではなくて、
このサイト
http://www.game-create.com/contents/game_programming
のように、原理や考え方を説明している場所だとありがたく思います。
3Dプログラム用語に至ってはそういったサイトが全く見付からないため、詳しい方、ご教授お願い致します。

Aベストアンサー

3Dの用語と言うか実装テクニックであれば、こちらがよろしいかと。
http://game.watch.impress.co.jp/docs/backno/rensai/3dg.htm
どうやってプログラムするかは書かれていませんが、どんな概念で実装されているかは分りやすいかと思います。

マイクロソフトによる講座です。「DirectX によるゲームプログラミング入門」をお読みください。なんか英語のページが表示されますが、ちゃんと日本語のページにリンクしています。
http://msdn.microsoft.com/ja-jp/academic/cc998598.aspx

以下はプログラム中心ですが、ゲームで必要なことの概念を拾っていくために見ておいて損はないと思います。
http://marupeke296.com/GameMain.html
http://rina.jpn.ph/~rance/directx8/index.html
http://www13.plala.or.jp/kymats/study/game_other.html
http://www.plustarnet.com/aspil/Programming/
http://dixq.net/g/
http://dixq.net/rp/

あとゲームでよく使われるタスクシステム(OSのタスクとは別物です)について。
http://www5f.biglobe.ne.jp/~kenmo/program/task/task.html
http://codezine.jp/article/detail/297?p=1

3Dの用語と言うか実装テクニックであれば、こちらがよろしいかと。
http://game.watch.impress.co.jp/docs/backno/rensai/3dg.htm
どうやってプログラムするかは書かれていませんが、どんな概念で実装されているかは分りやすいかと思います。

マイクロソフトによる講座です。「DirectX によるゲームプログラミング入門」をお読みください。なんか英語のページが表示されますが、ちゃんと日本語のページにリンクしています。
http://msdn.microsoft.com/ja-jp/academic/cc998598.aspx

以下はプログラム...続きを読む

Q法線を使って、ある地表の一点の高さを調べるには

法線を使って、ある地表の一点の高さを調べるには

(X,Y,Z)座標の中のある一点(X,Z)の地表の高さ(Y)
を知るのに、その一点のまわりの三点(A、B、C)の座標値(X,Y,Z)
がわかっていれば、法線を使って知りたい点の高さがわかると聞いたのですが

(A,B,C)でできる平面の法線を求めて
点(A)と調べたい点(T)を結んだ線(AT)を作ると、
線(AT)と法線は直行してるので
線(AT)と法線の内積=0
という所までは、わかったのですが、

その内積を表す式と
法線の各成分、点(A)の各成分、調べたい点T(X,Z)成分
はすでにわかっているので、調べたい点T(Y)成分を
内積の式から抽出でき、
式を展開できるということの、

その式がどうしてもわかりません。
その式がわかれば、ある地点(X,Z)の(Y)成分がわかるらしいのですが、

どなたかご存知の方がおりましたら
よろしくお願い致します。

Aベストアンサー

>三、四角形(傾きは任意)のすべての頂点位置はわかっている状態で、面の中のある一点(面に含まれる)の3次元座標のY位置を調べる

それでしたら、そのある1点の座標を ( Xp, Yp, Zp ) として、Xp と Zp を与えたときに、Yp はいくつになるかということを知りたいわけですね。
平面の方程式は
   nx*x + ny*y + nz*z = d --- (1)
ですので、これが3点 A( Xa, Ya, Za )、B( Xb, Yb, Zb )、C( Xc, Yc, Zc ) を通るなら
   nx = d*( Za*Yc - Yc*Zb - Ya*Zc + Zc*Yb + Ya*Zb - Za*Yb )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb ) --- (2)
   ny = d*( Xb*Za - Xb*Zc + Xa*Zc - Xa*Zb - Xc*Za + Zb*Xc )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb ) --- (3)
   nz = d*( - Xa*Yc - Ya*Xb + Xc*Ya + Xa*Yb + Xb*Yc - Yb*Xc )/( - Xa*Yc*Zb - Ya*Xb*Zc + Xc*Ya*Zb + Xa*Zc*Yb + Za*Xb*Yc - Za*Xc*Yb) --- (4)
となります( d の値は分からなくても nx:ny:nz が分かれば平面は決まります )。

点 ( Xp, Yp, Zp ) が平面 (1) 上にあるのなら
   nx*Xp + ny*Yp + nz*Zp = d --- (5)
が成り立つので、式 (2) ~ (5) から
   Yp = - ( - Yc*Za + Yc*Zb + Zc*Ya - Zc*Yb - Zb*Ya + Yb*Za )/( - Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc )*Xp - ( Xa*Yc + Ya*Xb - Xc*Ya - Xa*Yb - Xb*Yc + Yb*Xc )/( -Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc )*Zp - ( -Yc*Zb*Xa + Zc*Yb*Xa - Xb*Zc*Ya + Xc*Zb*Ya + Xb*Yc*Za - Xc*Yb*Za )/( - Xb*Za + Xb*Zc - Xa*Zc + Xa*Zb + Xc*Za - Zb*Xc )
となって、Yp を Xp と Zp を使って表わすことができます。このような計算は手計算ではとてもできないので、数式処理ソフトを使いました。

>三、四角形(傾きは任意)のすべての頂点位置はわかっている状態で、面の中のある一点(面に含まれる)の3次元座標のY位置を調べる

それでしたら、そのある1点の座標を ( Xp, Yp, Zp ) として、Xp と Zp を与えたときに、Yp はいくつになるかということを知りたいわけですね。
平面の方程式は
   nx*x + ny*y + nz*z = d --- (1)
ですので、これが3点 A( Xa, Ya, Za )、B( Xb, Yb, Zb )、C( Xc, Yc, Zc ) を通るなら
   nx = d*( Za*Yc - Yc*Zb - Ya*Zc + Zc*Yb + Ya*Zb - Za*Yb )/( - Xa*Yc*Zb...続きを読む

Q以下のプログラムを作るとすると・・・・・・?

プログラム作成の勉強をしているのですが、よく分かりません。お分かりの方、ぜひ教えてください。

log(1+x)=Σ_[M,n=1]{(-1)^(n+1)/n}・x^n
M=∞

上の式から有限なMの値とxの値を入力し、Do loopで第M項までの総和によりlog(1+x)の近似値を求め、組み込み関数logYの値と総和による近似解を求めた値の順でディスプレイ上に書き出すプログラムを作成するにはどうしたらよいでしょうか?
どうかよろしくお願いします。(使っているツールはxemacsです。)

Aベストアンサー

xemacs だと, 例えば print って関数で値を表示したり do ってスペシャルフォームで繰り返しができるので, 例えば
(defun foo (M x)
(print (log (1+ x)))
(do ((n 1) (sum 0))
((> n M) nil)
(setq sum (+ sum (* (/ (expt -1.0 (1+ n)) n) (expt x n))))
(print sum)
(incf n 1)
)
)
というプログラムでいいはずです. これを *scratch* という名前のバッファ (xemacs を起動すると最初に現れます) に入力すると (最後の閉括弧のあとで C-j) , foo という関数が定義されます. そこで
(foo 4 0.3) C-j
を入力すると目的のものができるはず.... というのは, きっと答えにならないんだろ~な~.

Q法線ベクトルの基礎中の基礎

度々お世話になります。

直線のベクトル方程式とその法線ベクトルの関係で、
「直線ax+by+c=0において、n↑=(a,b)はその法線ベクトルである」との事ですが、このn↑=(a,b)というのは、成分表示ですから、n↑の始点を原点Oに取って、その終点の座標が(a,b)である、という捉えで良いのでしょうか。
例えば、次の基本的な問題

問 「二直線x+√(3)y-1=0…(1)、x-√(3)y+4=0…(2)について、
a,直線(1)(2)の法線ベクトルm↑、n↑のなす角θ。
b,二直線(1)(2)のなす鋭角α。
をそれぞれ求めよ」

を内積を使って計算だけで求めるのは教科書通りにやれば簡単に求まりますが、特に問題のbについて、自分で座標平面に作図してみたら、先の当方の捉え方ですと…
まず、n↑=(1,√(3))、m↑=(1,-√(3))ですから、これをそれぞれ始点を原点に取って、それぞれの座標通りに終点を取りますと、n↑が二直線(1)(2)の内部のm↑と交わらずII象限で交わってしまうのです。
解説を見たところ、bの問題は、円に内接する四角形の定理からαを求めているように見えるので、法線ベクトルn↑は四角形を作るように、m↑と交わらないと定理が成り立たない気がするのです。

という事は、n↑に限らず、法線ベクトルは、普通のベクトル同様に、位置は問題にせず、任意に平行移動しても良いということになるのでしょうか。
 計算間違いがあるかもしれないし、漠然とした内容の質問で申し訳ありませんが、アドバイス下さると有り難いです。
宜しくお願いします。

度々お世話になります。

直線のベクトル方程式とその法線ベクトルの関係で、
「直線ax+by+c=0において、n↑=(a,b)はその法線ベクトルである」との事ですが、このn↑=(a,b)というのは、成分表示ですから、n↑の始点を原点Oに取って、その終点の座標が(a,b)である、という捉えで良いのでしょうか。
例えば、次の基本的な問題

問 「二直線x+√(3)y-1=0…(1)、x-√(3)y+4=0…(2)について、
a,直線(1)(2)の法線ベクトルm↑、n↑のなす角θ。
b,二直線(1)(2)のなす鋭角α。
をそれぞれ求めよ」

を内積を使って計算だ...続きを読む

Aベストアンサー

こんばんわ。

方向ベクトルにしても、法線ベクトルにしても、
書かれているようなイメージでいいと思います。

方向ベクトルは考えている直線が進んでいく方向を表し、
法線ベクトルは考えている直線に対する垂線が進んでいく方向を表しており、
いずれも直線の方向を与えているだけです。

たとえば、直線の方程式が 2x+ 4y- 3= 0であれば、
法線ベクトルは n→= (2, 4)と表すことになりますが、
n→= (1, 2)としても「その進んでいく方向」は同じであり、これも法線ベクトルと言えます。
さらに、-1を乗じた n→= (-1, -2)も法線ベクトルと言えます。
値というよりも「比」がポイントなのです。


「なす角」を考える問題では、質問に書かれているとおり「平行移動」させて構いません。
2直線の交点となる点を原点まで平行移動させているイメージになります。


最後に「方向ベクトル」に関する過去の質問を参考URLとしてつけておきます。

参考URL:http://oshiete.goo.ne.jp/qa/6229779.html

Q以下ようなツールはどのプログラム言語で作るのが向いていますか?

以下ようなツールはどのプログラム言語で作るのが向いていますか?
仕事中にファイル名に日付をつけてファイルを残すことがあり、
ふとプログラミングの勉強を兼ねて、
以下のようなWindowsで使用するツールを作ってみようと考えました。


目的
一時的なバックアップ用にファイル名を変更orファイルをコピーする。

使い方
・ファイルを右クリック
・右クリック後「新規作成->フォルダ」と同じイメージで、
 「アプリ名->ファイル名を変更」 か
 「アプリ名->ファイルをコピー」
 を選択できる。

○アプリ名->ファイル名を変更 を選択した場合、
 選択したファイルの名前に_yymmddを追加した形に変更
ex.
sample.txt
  ↓
sample_100603.txt

○アプリ名->ファイルをコピー を選択した場合
 選択したファイルをコピーし、
 ファイル名を元のファイル名に_yymmddを追加した形に変更
ex.
sampleCopy.txt
  ↓
sampleCopy.txt
sampleCopy_100603.txt

---

今まで、業務でC, C++, Javaでコーディング経験はあるのですが、
Windows関数の呼び出し経験はほとんどありません。
(MFCでは少し実装したのですが・・・)

ちょっと調べた感じだと
ファイル右クリックで表示させるためのレジストリの書き換えと、
ファイル名の変更&コピー程度なので、実装はそれほどむずかしくないかなと考えています。。
皆さんであれば上記のようなツールはどの言語で実装しますか?


今回のツールとは別にスクリプト系の言語を勉強してみようかと考えて
PythonかRubyを勉強してみようか迷っていたところなので、
できれば今までやったことのない言語で作ってみたいのですが、
やはりWindowsアプリはC(++)が作りやすいのでしょうか???

以下ようなツールはどのプログラム言語で作るのが向いていますか?
仕事中にファイル名に日付をつけてファイルを残すことがあり、
ふとプログラミングの勉強を兼ねて、
以下のようなWindowsで使用するツールを作ってみようと考えました。


目的
一時的なバックアップ用にファイル名を変更orファイルをコピーする。

使い方
・ファイルを右クリック
・右クリック後「新規作成->フォルダ」と同じイメージで、
 「アプリ名->ファイル名を変更」 か
 「アプリ名->ファイルをコピー」
 を選択できる。

○アプリ名-...続きを読む

Aベストアンサー

「ファイル名を変更してコピー」のようなことをWindowsで行うのでしたらWSH(Windows Script Host)スクリプトもよいのではないでしょうか。

新たなインストールは不要で、コピースクリプトをエディタで作成し、ショートカットをSendToフォルダに置けば準備完了です。ファイルを右クリックで「送り」ます。

SendToを使わずに右クリックメニューを実現するにはコピースクリプトとは別の実装が必要ですが、WSHはレジストリ操作もできますから、それも不可能ではないように思います(すみませんが私はSendToで済ませているので実装した経験はありません)。

Q点(a,b)における傾きkの時の法線の式の求め方?

以下の問題で、※の箇所が分かりません。どういう公式を使うとこのような変形が出来るのでしょうか?教えてください

問:xy平面上の放物線C:y=x^2について、
C上の点P(t,t^2)における法線の方程式を求めよ。

解:(t,t^2)における傾きは2tであり(微分)、法線はこれと直交するから、
法線の式は、1(x-t)+2t(y-t^2)=0…※
⇔x+2ty-2t^3-t=0

法線の傾き(-1/2t)を出してy=(-1/2t)x+bに(t,t^2)を代入してもよいのですが、この場合(0,0)についても成り立つ式が欲しいので、この回答だそうです。
よろしくお願いします

Aベストアンサー

直行するベクトルの内積=0って習ってますか?
傾き2tのベクトル(1,2t)と求める法線の傾きのベクトル(x-t,y-t^2)の内積=0ということだと思います。

QPIC初心者です。 PIC16F88のLED制御で以下のプログラムを実

PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。
意図としては1度だけ光って消えてほしいのですが…
CONFIG部分がおかしいのでしょうか?
環境として、PCはVista、MPLABとPICkit2を使用しています

お分かりになる方、お願いいたします。
以下ソースです
LISTP=PIC16F88
INCLUDE"P16F88.INC"

__CONFIG _CONFIG1, _INTRC_IO & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_ON

BSFSTATUS,RP0
CLRFTRISB
BCFSTATUS,RP0
BCFSTATUS,0
CLRFPORTB

MAIN
BSFPORTB,0
NOP
NOP
NOP
(以下、NOPが100個ほど)
NOP
BCFPORTB,0

END

PIC初心者です。 PIC16F88のLED制御で以下のプログラムを実行すると点滅を繰り返します。
意図としては1度だけ光って消えてほしいのですが…
CONFIG部分がおかしいのでしょうか?
環境として、PCはVista、MPLABとPICkit2を使用しています

お分かりになる方、お願いいたします。
以下ソースです
LISTP=PIC16F88
INCLUDE"P16F88.INC"

__CONFIG _CONFIG1, _INTRC_IO & _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF
_...続きを読む

Aベストアンサー

END命令は議事命令といわれており、CPUに実行停止を命令するのではなく、コンパイラに対してコードの終端を明示しているだけです。

下記URLのコードを参考にしてみては如何でしょうか?
http://homepage1.nifty.com/rikiya/software/310picpio1.htm
プログラムの最後でループしているだけですが。


人気Q&Aランキング

おすすめ情報