過去ログ [ 0002 ]
Page: | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
使い勝手 投稿者:mabo 投稿日:2016/01/24(Sun) 21:49 No.647
TRさん、こんばんは。前すれ、満杯になりました。
ロータリースイッチオリジナルに変更ですね。
私は、プログラムも変更してみました。といってもMODEの1と3を交換しただけです。
ロータリースイッチの結線も変えましたが、動作位置は、同じです。
1連続(0b11) 2間欠(0b10) 3OFF(0b00) 4MACH(0b01)
これでも大丈夫だと思いますが、連続運転するのに、間欠を経由するので、一瞬POMPが動作してから、連続です。
動かすつもりでの切り替えでしょうからちょっと動作しても影響ないと思います。
使い勝手から言うと、
1間欠(0b10) 2OFF(0b00) 3MACH(0b01) 4連続(0b11)
かなと思いました。これだと、連続にいくにもMACHがONでなければ、ポンプが動作しないので、
思ったようにON・OFFができるかなとおもいました。
まあ、このへんは、好みだと思いますが・・・・。
Re: 使い勝手maboさん、猛牛ロックさん、おはようございます。
待ち時間関数をやってみました。
無事に動作している様です。
自分的には、関数の変更は初めてです。
やってみてもよく分かりません。むずい!
/*****************************
* 間欠タイマー
* 16F627A
* XC8 V1.35
* RA6←MACHからの入力想定
* RA2ブロワ制御用リレー
* RA3掃除機制御用リレー
* RA7 モニター用発光LED
*****************************/
#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 On 1
#define Off 0
#define MACH_sig RA6
#define POMP RA2=RA7
#define burowa RA3
#define MODE (PORTA&0b11) //00:オフ、01:掃除機のみオン、10:ブロワと掃除機は間欠運転、3:mach制御ブロワと掃除機は間欠運転
/*
ピン毎にRA0~RA3で信号を受けるなら上のMODEの1行を消して、下記の
「MODE==X」を「RAX==1」などに書き換えて下さい。推奨のプルダウンなら、1、プルアップするなら0です。
*/
// プロトタイプ宣言
void WaitTime (int cnt);
// 待ち時間関数}
void Second(int sec){ //1S→0.1Sに変更
while(sec >0){
if(MODE==0||MODE==1||(MODE==3&&MACH_sig==0)) {
WaitTime (2000); //40ms この数値が適当かは??です。
break;
}
sec--;
__delay_ms(100);
}
}
// メイン関数
void main (void){
OSCF=1;//内蔵発振器 4MHz使用に設定
CMCON = 0x07;// 1,2,17,18端子を入出力端子に設定
RA2=0;RA3=0;RA7=0;
// 入出力設定
TRISA = 0b01100011;//RA0、1はセレクタ、RA6はMACH入力、RA2は掃除機出力、RA3はブロワ,RA7は発光LED
TRISB = 0b11111111;//RBは入力。ロータリースイッチ2個 1=入力 0=出力
int DousaTime,KanketuTime;
OPTION_REG=0b00000000;//プリスケラ2 5ビット=0 WDTは使わない ポートBプルアップ
int TIME[]={10,20,30,40,50,60,70,80,90,100,150,200,300,600,1200,1800}; //1秒~3分
//ロータリースイッチの値0,1,2…が1,3,6…に対応。後で上のSecond関数でウェイト(x0.1秒する)
// 永久ループ
while(1){
if(MODE==0||(MODE==3&&MACH_sig==0)){POMP=Off;burowa=Off;}
if(MODE==1) {burowa=On;}
if(MODE==2||(MODE==3&&MACH_sig==1)){
DousaTime=TIME[PORTB&0b1111]; //動作時間はTIME[ツマミの数字(RA0~RA3)]
KanketuTime=TIME[PORTB>>4]; //間欠時間はTIME[ツマミの数字(RA4~RA7)]
POMP=On;burowa=On;
Second(DousaTime);
POMP=Off;burowa=Off;
Second(KanketuTime);
}
}
}
// 待ち時間関数
void WaitTime(int cnt)
{
while(cnt > 0)
cnt--;
}TR 2016/01/25(Mon) 07:49 !email! No.648 !ico_edit!Re: 使い勝手>TRさん
御免なさい。問題点を捉え違えていました。先日書いた対処法では対処できないとは思っていたのですが、
そのままにしていました。
「ちらつき」のソフト上の対処をしてみました。
変更点は
・セレクタスイッチのリアルタイムでの比較→保存比較
・ループに0.05sの遅延を入れる
・0.05sの間にセレクタスイッチの変化が無ければ処理へ
・Second関数のdelayを0.01sにしてより早く終了させる
等です。
あえて、スイッチの変更時には出力は変更せずに次のループに任せています。
この2つの0.05sを適当な値にすることで「ちらつき」は無くなるものと思っています。
実際は不明ですけど。
ロータリースイッチの種類の違いや、回す速さ、チャンネルを1つ回すか3つ回すかで全然違いますから、
どの値が適当なのかはわかりません。適当に変えてみて下さい。
出力が従来のものとTRさんに合わせたものを作っておきました。
けれどもやはり、実機(マイコン)が無いので試してはいません。猛牛ロック 2016/01/25(Mon) 09:21 !email! No.649 !ico_edit!Re: 使い勝手TRさん、猛牛ロックさ、おはようございます。
TRさん,ウエイト関数の変更ですね。小さな変更かもしれませんけど、大きな前進?のような気がします。
プログラム作り始めのころは、そうやって、動く物を少しずつ改変して、幅を広げていきました。
猛牛ロックさん、おはようございます。多分、大丈夫のような気がしてます。
猛牛ロックさんのオリジナルのロータリースイッチでは、めだたないと思いますが、
ロータリースイッチの状態の変更の保持に余裕を持たせれば、より完全かなと思いました。
ちょっと間をとって、変化を2度確認ですね。
TRさんには失礼な言い方になってしまいますが、while()を使うよりもif()の2重構造の方が理解しやすいかも・・・。mabo 2016/01/25(Mon) 10:53 !email! No.650 !ico_edit!Re: 使い勝手> ちょっと間をとって、変化を2度確認ですね。
> TRさんには失礼な言い方になってしまいますが、while()を使うよりもif()の2重構造の方が理解しやすいかも・・・。
if()の2重構造とは少し意味合いが異なります。whileを使うのは「変化がある内は(何度でも)ループしろ」という事です。
0.2Sとかにして、数チャンネル変更の時間をもたすか、あるいは1チャンネル分にするか使い方はそれぞれですが、
想定した変更時間はそこで費やす為のループです。
実際に、適当にいじらなければ合わないように思います。
今回の場合はチャタリング(のみ)ではなく、ショートのタイミングと表裏のスイッチのずれが絡み合っています。
また、隣に1CHだけ回すか、2,3CH連続で回すか、また、回す速度等、タイミングをちょっと想定し辛いです。
タイマー割り込みや外部割り込みを使って1CH毎の動作を監視することも可能ですけど、ちょっと複雑になってしまいます。
この辺りが落としどころだと思うのですが、どうでしょうか?
TRさんに「動作しない」と言わそうで心配です。猛牛ロック 2016/01/25(Mon) 12:33 !email! No.651 !ico_edit!Re: 使い勝手TRさん、猛牛ロックさん、こんばんは。
猛牛ロックさん、
>if()の2重構造とは少し意味合いが異なります。whileを使うのは「変化がある内は(何度でも)ループしろ」という事です。
おっしゃる通りで、早とちりでした。
この辺も、猛牛ロックさんと、私の好みというか、視点の違いというか、目の付け所が分かれてしまいますね。
猛牛ロックさんは、変化に着目で、私は、変化がない状態に着目、でしょうか。
結果は同じようになるでしょうけど。if()文だけで、設定した待ち時間は、必ずまたなければならいので、無駄が増えてしまいますね。
後で、実機で動かしてみます。
ところで、猛牛ロックさんが、LEDでマトリックス作られたの思い出しました。
ネットで、あさってると、8×16個のLEDで、サインボード作った方のHPが目にとまりました。
http://www.piclist.com/images/www/hobby_elec/pic6_2.htm
あいにくプログラムは、アセンブラーなので、解読する気にもなれませんが(というかできない?)、暇にまかせて、
8×32個ぐらいのサインボードでも作れないかな、なんて、悪い虫が起きてきました。
○月の(赤色ドットマトリクスLED 8x8ドット OSL641501−ARA)×4個、74HC154×2個、40ピンPICあたりで、できるかななんて。mabo 2016/01/25(Mon) 20:38 !email! No.652 !ico_edit!Re: 使い勝手うーん?どうですかね。可能ではあると思いますけど、ちょっと32のダイナミック点灯だと
明るさ(ちらつき)でるかも知れません。
でも、良く考えれば32じゃなくて16(x2ポート)ですね。プログラム的にはちょっと難しくなりますけど
いけるんじゃないですか。
でも、8x8でも配線は結構大変でした。あと、書体も今一つでしたね。ぎりぎりカナ表示が可能なところです。
74HC154は初めて知りました。珍しいですね。入手も大変そうですね。
私は、片側は直接LED(+抵抗)に入れたのですけど、ダイナミック点灯なのでいつもよりも低い抵抗を付けたら
消費電流の関係だと思うのですが、途中でPICが再起動を繰り返しました。500Ω(x8)位で何とか動きました。
チャレンジとしては、74HC595を8個使って、8ピンの(高性能な)PICで制御する、なんていうのはどうでしょうか?
一応、74HC595は3ピンで幾つも繋げられるらしいですよ。http://www.geocities.jp/zattouka/GarageHouse/micon/circuit/HC595.htm
転送速度が間に合うのかは??ですけど。猛牛ロック 2016/01/25(Mon) 22:10 !email! No.654 !ico_edit!Re: 使い勝手maboさんへ
テキストを見ながらです。
これで精一杯です。
でも、動作した時は嬉しかったです。
猛牛ロックさんへ
こちらの方が滑らかです。
return 1;の意味?
return 0;の意味?
if(change==0){ //セレクタが変わった際、ポンプオフはしない
burowa=Off;
vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト
この意味は?
さらに下に目を移すと
//セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける
sec--;
__delay_ms(10); //この部分を1000→10に書き換えたので1s→0.01s
}
return 0;
このreturnの意味 ??
永久ループが2つに分かれています。
一見すると同じように見えます。
これはどういう意味ですか?
私事ですが、
掃除機は、AC100Vなので、SSRを保護するために、バリスタを付けました。TR 2016/01/25(Mon) 22:18 !email! No.655 !ico_edit!Re: 使い勝手TRさん、こんばんは。猛牛ロックさん、こんばんは。
猛牛ロックさん、74HC154はすでに製造中止でした。
代替考えると、配線面倒でしょうね。
それから、
>タイマー割り込みや外部割り込みを使って1CH毎の動作を監視することも可能ですけど、ちょっと複雑になってしまいます。
>この辺りが落としどころだと思うのですが、どうでしょうか?
私だったら、チャンネルごとの監視はしないかなと思います。多分、適当なウエイト置いておわりかなあ。
このへんでしょうね。
TRさん、新しい、言葉でてきましたね。私は、あまり使いませんが、戻り値とかリターン値とかいいます。
簡単に言うと、関数に計算させて、その結果を呼び出した側に返す、の意味です。
実は、知らず知らずにお使いのvoidの名称も、このことに関係あります。
voidがついた関数は、この戻り値がない関数という意味です。多分、main()には、voidがついていると思います。
最初のsecond()関数には、voidがついてたと思いますが、今回のプログラムには、char second()ということで、voidがついていません。
char型の戻り値がありますよという意味になります。
どんな使い方をするかというと、
main(){
int A;
A=tasu(10,20);
}
int tasu(int a,int b){
return(a+b);
}
という感じで、tasu()関数に10と20を入れて呼び出すと、戻り値に30が入って、Aには、計算結果の30が入ることになります。
戻り値は、一つの場合も猛牛ロックさんのプログラムのように場合に分けて二つの時もあります。
戻り値については、教科書には、多分、なかったかなと思います。mabo 2016/01/25(Mon) 22:51 !email! No.656 !ico_edit!Re: 使い勝手return文は「その関数を終了しろ」という意味です。以前のbreak文はループを終了です。
Second関数を呼び出すときに
> change=Second(DousaTime);
と変数changeに代入する「=」を付けて呼び出しました。
途中終了の「return 1;」だとchangeに1が入り、ウェイト完了(正常終了)時の「return 0;」だとchangeに0が入ります。
0と1は特に意味はありません。識別する為のものです。
これは途中終了した場合、次にくるPOMP=Off;をしないでそのままループの先頭に行くために変更しました。
無駄にポンプを一度切るよりもループ先頭の条件判断に任せた方がちらつきを抑える効果があると思ったからです。
その意味では次の行はif(change==0)よりもif(change!=1)の方が意味が近いのかも知れません。
> 永久ループが2つに分かれています。
while(MODE!=(PORTA&0b11)){
MODE=PORTA&0b11;
__delay_ms(50);
}
の事でしょうか?これは唯のループです。永久ではありませんし、大半はスルーします。
意味は
while(保存していたセレクタスイッチの値が現在のセレクタスイッチと違っている間は){
現在のセレクタスイッチの値を保存しなさい;
0.05sウェイトしなさい;
}
です。0.05sの間に変化がある場合はここに居続けます。
基本的にはセレクタスイッチの動作が終わるまでとどまっている為のものですから、セレクタスイッチの特性に合わせて
この50の数値と真上の50の数値を調整してください。
1000とかにすればちらつきは完全になくなる?でしょうけど、反応は鈍くなります。
250程度にして使うのも良いかと思っています。(ただ、実機が無いので試してもらうしかないです)猛牛ロック 2016/01/25(Mon) 23:36 !email! No.657 !ico_edit!Re: 使い勝手TRさん、猛牛ロックさん、こんにちは。
猛牛ロックさん、649、動作OKです。そのままで、もたつきもありませんでした。
40ピンのPICマニュアル見てみましたが、400ページオーバーです。
これ、使うには、ちょっと、ですねえ。mabo 2016/01/26(Tue) 11:54 !email! No.658 !ico_edit!Re: 使い勝手> 猛牛ロックさん、649、動作OKです。そのままで、もたつきもありませんでした。
おー!それは良かったです(^^)/
> 40ピンのPICマニュアル見てみましたが、400ページオーバーです。
> これ、使うには、ちょっと、ですねえ。
私はピンの多さは実装以外にはあまり気にならないですね。付けるとデカいです。幅があります
と言っても、経験はAVRなのでI/Oピンの違いは全く無いですけど。
MABOさんが以前使われていた16F1783は(多分それより多い)434ページもありますよ。
これなんかどうでしょうか?醍醐味には欠けるでしょうけど、配線面では手軽に32X16を始められそうです。
http://eleshop.jp/shop/g/gDBB411/猛牛ロック 2016/01/26(Tue) 14:01 !email! No.659 !ico_edit!Re: 使い勝手TRさん、猛牛ロックさんこんばんは。
猛牛ロックさん、ご紹介ありがとうござます。
資料見てみましたけど、
>16bitシリアル−パラレルを3個実装したシリアル制御
なんですね。
これちょっと、ハードル高いです。PDFの資料みても、CLOCKでてくるので、CLOCKの信号とのからみで、データの送受信でしょうから、
ちょっと、難しいかもです。
プログラムの勉強がてら、自作してみようと思います。
それにしても、8×8LEDの配線は、番号が、
ばらばらです。
上と下に8本ずつ端子がありますが、
←9
C8 C7 R2 C1 R4 C6 C4 R1
R5 R7 C2 C3 R8 C5 R6 R3
→1
順番に並べてみると・・・・。意味があるのでしょうけど。ちょっとですね。mabo 2016/01/28(Thu) 00:00 !email! No.660 !ico_edit!Re: 使い勝手配線、総電流、ピン数の面でドットマトリクスは扱い難いですね。
それにダイナミック点灯。
8*32なら全部トランジスタやICを通した方が良いです。
直接(ピン-抵抗-LED)だと電流不足になると思います。
慣れればシリアル-パラレルもデコードタイプ?もそれほど変わらないですよ。
タイミング(順番)はちょっと気を使いますけど、単に1ビットずつセットしてクロックを上げるだけですら。
下のfor文の部分です。
(縦横ICを組み合わせれば実際はもう少し長く点灯させることが可能です)
for(t=0;t<16;t++){ //16bit送る
clock=0;
s_in=(data>>t)&1; //下位bitからの場合
clock=1; //1で送信
}
ENABLE=1; //列表示を消す
LATCH=1; //データ更新
LATCH=0; //ラッチする
hyoujiretu=(hyoujireru+1)%16; //***次の列へ移る***
//ここでもう一つのIC操作して次の列へ
ENABLE=0; //列を表示猛牛ロック 2016/01/28(Thu) 12:07 !email! No.661 !ico_edit!Re: 使い勝手猛牛ロックさん、こんにちは。
プログラム並びに、アドバイスありがとうございます。
やはり「ラッチ」というような、考え方使うんですね。
ネットでたぐると、前にアドバイスいただいた74HC574等を使った例がでてますね。
きっと、この「ラッチ」という動作が必須なんでしょうね。
興味にまかせて、回路組み始めていますが、二日かかって、やっとIC・PIC周りの配線終わりました。
2SA1015×32個、手強かったです。残り64×2の半田付け残ってます。mabo 2016/01/28(Thu) 14:07 !email! No.662 !ico_edit!Re: 使い勝手ラッチ機能が無くても可能ですけど、その場合はデータ転送前に切らなくてはなりません(ENABLE操作)
ラッチがあれば、本来、ENABLEのままで裏でデータを操作してラッチで更新します。
動画?なんかはそんな感じだと思います。
今回は縦横の2つのICの合わせ技なのでそのあたりを考慮した操作になると思います。
> 2SA1015×32個、手強かったです。残り64×2の半田付け残ってます。
トランジスタアレイは使わなかったのですか?
って、32+64だってー???!!! ずいぶん多いじゃないですかー。
16X32が2つかな?それとも8X8を横並びに6枚かな?
どちらにしても、すごいのが出来そうですね(^^)/猛牛ロック 2016/01/28(Thu) 15:24 !email! No.663 !ico_edit!Re: 使い勝手猛牛ロックさん、maboさん、レスが遅くなって済みませんです。
今、大変忙しい状況となっていまして、難しいプログラムの理解がなかなか進まない状況です。
でも、大凡は分かってきました。
今回は、関数の使い方を学びました。
これも、良いきっかけとなりました。
動作の方ですが、以前より大分滑らかになりましたので、
使わせて頂きます。
プログラムで、return 0と1とありますね、
戻り値が0とか1とかでは、プログラムの中で、どういった関係が出てくるのでしょうか?
それからお聞きしたい点があります。
手パですが、基板をアルミのボックスに入れています。
今日、調子が悪くなったので、修理後、テストをしたら、びっくりです。
誤動作するのです。
アルミのケースに入れたら、治りました。
どうも、電磁ノイズを拾って誤動作している様です。
過日教わった、セラミックコンデンサーを買ってみましたので、
後日、付けてみます。
やはり、付けた方が、高周波ノイズにも強くなりますか?
ACサーボモーターは、とにかく、凄いノイズを発生します。
追記
// 待ち時間関数
char Second(unsigned int sec){ //1S→0.1Sに変更。int secに1を入れると0.01秒ウェイト
while(sec >0){
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
//セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける
sec--;
__delay_ms(10); //この部分を1000→10に書き換えたので1s→0.01s
}
bv
最後のbvってなんですか??TR 2016/01/28(Thu) 20:47 !email! No.664 !ico_edit!Re: 使い勝手> プログラムで、return 0と1とありますね、
> 戻り値が0とか1とかでは、プログラムの中で、どういった関係が出てくるのでしょうか?
> change=Second(DousaTime); //動作時間分ウェイト
> if(change==0){ //セレクタが変わった際、ポンプオフはしない
> burowa=Off;
> vacuum=Off;
> change=Second(KanketuTime); //間欠時間分ウェイト
> }
戻り値はchangeに入れています。つまり、途中終了のばあいはchangeが1で正常終了の場合は0です
正常終了の場合のみブロワと掃除機を切って、間欠時間のウェイトをします。
(実際はウェイト関数は直ぐに終わるので、時間は問題ないのですが、このブロワと掃除機をオフにする作業を
取りやめる為に戻り値を付けました)
異常終了した場合は、changeが1になっているので上記の事はせずにループの先頭に戻ります。
> やはり、付けた方が、高周波ノイズにも強くなりますか?
どの程度の効果になるかは解りませんけど、強くなることは間違いないです。
実際にはノイズの周波数とコンデンサの種類・容量を合わせて利用する必要があります。
でも、そのあたりは詳しく知りません。
付ける場所でも大きく変わるようです。通常はICの一番近くに1つずつ付けるものだと言われています。
> 最後のbvってなんですか??
それはTRさんが書いたのだと推測します。No.649の中の両ファイルには発見されません。猛牛ロック 2016/01/28(Thu) 21:50 !email! No.665 !ico_edit!Re: 使い勝手TRさん、猛牛ロックさん、こんばんは。
TRさん、お忙しいようですね。まあ、趣味の世界なので、遅い早いは、無用のことでしょうか・・(笑)。
セラミックコンデンサーは、バスコンのことでしょうか。0.01μF程度のものですよね。詳しいことはわかりませんが、私も、必ず入れてます。
ノイズのことは、ちょっと、不明です。ノイズ拾ってるようなら、電源周りに対策が必要なのでしょうか。
このへんは、猛牛ロックさんから、レス、いただけると思いま
す。
それから、戻り値の0と1ですが、プログラムの中では、呼び出されたScond( )関数が、呼び出された数値分数えたか、数えるのを途中で止めたかの判定に使ってると思います。
最後の「bv」は、私のでは、見当たりませんが、多分ゴミかもしれません。
猛牛ロックさん、それほど大がかりではありません。8×8が4枚です。
それぞれに端子が8ありますので、8×2×4が、端子の数で64あります。
両方、半田付けするので、64×2のハンダ付けです。、mabo 2016/01/28(Thu) 21:50 !email! No.666 !ico_edit!Re: 使い勝手猛牛ロックさん、maboさん、こんばんは。
やっと、週末となってホッとしています。
同様な質問をしていると思います。
ご容赦願います。
if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;
この意味は、
もし、モードが、PORTA&0b11又は、MODE=3、且つ信号がない時、又は、記憶したPORTBとPORTBが異なる時、戻り値を1とする
ということですか?
そして、そうじゃない場合は、戻り値は0とするという意味ですか?
宜しくお願いします。TR 2016/01/29(Fri) 21:10 !email! No.667 !ico_edit!Re: 使い勝手TRさん、こんばんは。
> もし、モードが、PORTA&0b11又は、MODE=3、且つ信号がない時、又は、記憶したPORTBとPORTBが異なる時、戻り値を1とする
> ということですか?
そうです。付け加えると、「戻り値を1にして関数(Second関数)を終了する」と言う事です。
「return;」と戻り値無しで終了するときもあります。
> そして、そうじゃない場合は、戻り値は0とするという意味ですか?
この文自体にはその意味はありません。単に「return 1;」で上記の意味だけです。
戻り値の0の部分はSECOND関数の最後にある「return 0;」です猛牛ロック 2016/01/29(Fri) 21:32 !email! No.668 !ico_edit!
- JoyfulNote v6.02 -
++ Edited by Hamel ++