過去ログ [ 0002 ]
過去ログ:
ワード検索: 条件: 表示:
Page: | 1 | 2 | 3 | 4 | 5 | 6 |
ハンドル作りました 投稿者:TR 投稿日:2016/02/11(Thu) 18:03 No.759

猛牛ロックさん、改良プログラム有難うございます。
複雑になりましたね!
自分的には、大変だったと思います。

早速、キットで遊ぼうの基板でテストしました。
この基板でも確認はできます。
RA3が点滅しませんでした。

自分の方ですが、早速、幼稚な改良プログラムで、
ハンドルを作ってみました。
ブロワより先にONし、ブロワがOFF後、バキュームがOFFします。
きっちりと、切子を吸い込めました。
十分でした。
とりあえず、これで、行こうかと思います。

しかし、こんな複雑な形状でも、きっちりと仕事をしてくれます!


PS
ウエイトを付けなかった理由を教えて頂けませんか?

Re: ハンドル作りました
> ウエイトを付けなかった理由を教えて頂けませんか?

一般的な事で言うと、ウェイトのDELAY関数や、自前のものも基本的に「何もしない」という命令です。
その命令を何万回?も繰り返すことで時間を作っています。
なので基本的に1つのものを制御するなら簡単で便利かと思います。
でも、パソコンでも、同じ「ある画面」でも「フリーズして動かない画面」と「アイドル状態の画面」とでは状況が
異なります。
表面的には同じでも、出来るだけ自由な空間(PCでいえば、system idle process)を確保しておきたいからです。

今回の場合は、もともと、割り込み無しのプログラムですし、delay関数を付けるだけの方が見通しがいいですし、
それが充分な動作をするなら、そちらの方が良いように思います。

けれども、+αであらたなものを付け加える際にはそれ(delay)が足かせになりがちです。
delayは全ての制御に関わってくるからです。
一方、タイマーで管理すると、好きなだけ、制御用のストップウォッチをつくって、その時間ごとに動作させることが出来ます。
つまり、2つ以上の時間軸を持つ制御では必ず?タイマーの活用が必要になります。
なので、私自身、ほとんどdelayは使いません。LCDの初期化の時とか、通信のタイミングなんかで必要なら使いますけど、
人が感じるようなdelayは実践では無いです。
(後はパーツの動作確認とかですかね)

でも、使うのが悪いと言う事ではありません。私も最初は使っていました。でも、どうしても、それでは前に進めなくて、
タイマーを使うのを覚えたのです。LEDを使った単純?なメッセージ(サイン)でもdelayでは難しいです。

動作の順番はvacuumオン→burowaオン、burowaオフ→vacuumオフの順なのですね。
まぁ、今の所原因不明なので手も出ません。どこが悪いのかさっぱりです(/ω\)
原因が解ったら書き換えてみますけど、、、どうなるやら。
猛牛ロック   2016/02/11(Thu) 21:28 !email! No.760 !ico_edit!
Re: ハンドル作りました
猛牛ロックさん、レス有難うございます。
きっと、猛牛ロックさんの言われるとおりと思います。
今後も何かあったら、PICを活用します。

maboさんへ、本ですが、ご紹介くださった品にしました。
何冊も買うかもしれないです(笑
TR   2016/02/11(Thu) 21:44 !email! No.761 !ico_edit!
Re: ハンドル作りました
TRさん、猛牛ロックさん、こんばんは。

TRさん、本は、すみません。なかなかご紹介できる本は、思いつきません。
どちらになさったのでしょうか。活用ガイドブックでしょうか。
この本は、分厚くて、内容豊富ですが、だいたいのプログラムがそのままコンパイルできると思います。
新しい表記の書き方も参考になると思います。

後閑さんの本は、私は、好きです。

猛牛ロックさん、書き込みありがとうございます。いつもながら、勉強になります。
mabo   2016/02/11(Thu) 22:27 !email! No.762 !ico_edit!
Re: ハンドル作りました
全く関係ない話題ですがヤフーニュースのトップで
「<攻殻機動隊>1/2サイズ「タチコマ」を開発 実装も視野」
http://headlines.yahoo.co.jp/hl?a=20160211-00000013-mantan-ent
が上がっていました。
「タチコマの人」と言えば、私のAVRの師匠の剣菱P氏です。
既に作っているじゃないですか。(まだ製作中)
私は攻殻機動隊はしらないし、タチコマも同様です。
でも師匠の「タチコマ1/2をつくってみる」シリーズはちらちら見ます。
勿論、私が勉強した「零からの電子工作」マイコン編もお薦めです。
(でも正確にはマイコン編というよりAVR編です)
ほかにもPIC亜種の「PICAXEをつかってみる」編もあります。
猛牛ロック   2016/02/12(Fri) 01:09 !email! No.763 !ico_edit!
Re: ハンドル作りました
maboさん、猛牛ロックさん、こんばんは。

データーシートの件
16F88を買いました。
http://akizukidenshi.com/catalog/g/gI-00567/

自分もデータシートを見ようと思って、開くと、、、
やはり、英語ばかりでした。
グーグルで翻訳したら、読み易そうに翻訳されました。
⇓
1.0デバイスの概要.......................................................................................................................................................................... 5
2.0メモリ構成................................................................................................................................................................. 11
3.0データEEPROMとフラッシュプログラムMemory.............................................................................................................................. 27
4.0発振器の構成............................................................................................................................................................ 35
5.0 I / Oポート..................................................................................................................................................................................... 51
6.0タイマ0モジュール........................................................................................................................................................................... 67
7.0タイマ1モジュール........................................................................................................................................................................... 71
8.0タイマ2モジュール........................................................................................................................................................................... 79
9.0キャプチャ/コンペア/ PWM(CCP)モジュール..................................................................................................................................... 81
10.0同期シリアルポート(SSP)モジュール..................................................................................................................................... 87
11.0アドレス可能ユニバーサル同期非同期レシーバトランスミッタ(AUSART)........................................ ..................... 97
12.0アナログ - デジタル変換器(A / D) Module................................................................................................................................ 113
13.0コンパレータModule.................................................................................................................................................................. 121
14.0コンパレータ電圧リファレンスModule................................................................................................................................... 127
の15.0特集CPU.................................................................................................................................................... 129
16.0命令セットの概要.......................................................................................................................................................... 149
17.0開発Support............................................................................................................................................................... 157
18.0電気的特性.......................................................................................................................................................... 163
19.0 DCおよびAC特性のグラフとTables....................................................................................................................... 193
20.0パッケージングInformation.............................................................................................................................................................. 207
付録A:改訂History............................................................................................................................................................. 213
付録B:デバイスDifferences......................................................................................................................................................... 213
インデックス.................................................................................................................................................................................................. 215
マイクロチップ社のウェブサイト..................................................................................................................................................................... 223
顧客変更通知サービス.............................................................................................................................................. 223
顧客サポート.............................................................................................................................................................................. 223
リーダーの応答.............................................................................................................................................................................. 224
PIC16F87 / 88製品識別システム

翻訳機能を使うしかない感じなのですが、
他に良い方法をご存知でしょうか?

例えば、個人等のサイト
できたら、16F88がベストですが。
TR   2016/02/12(Fri) 21:23 !email! No.764 !ico_edit!
Re: ハンドル作りました
TRさん、猛牛ロックさん、こんばんは。

16F88は、キットで遊ぼうの基板で使えるので便利だと思います。
石的には、きっと、最新のものには、劣るのかもしれませんが、AD変換等も入ってるので、627Aより多少高機能だと思います。
私が、参考にしたHPは、

http://physics.cocolog-nifty.com/weblog/

で、ここに比較的多くのサンプル等も載ってます。LCDの表示の方法や、AD変換等、ここの記事参考にして、勉強しました。

16F88でたぐると、多分、結構沢山のHP引っかかると思います。
mabo   2016/02/12(Fri) 22:06 !email! No.765 !ico_edit!
Re: ハンドル作りました
間違いと思われる箇所を見つけました。けれども

> vacuum=On;__delay_ms(300);burowa=On;
> Second(DousaTime);
> burowa=Off;__delay_ms(500);vacuum=Off;
> Second(KanketuTime);

TRさんのをみると、こちらの方が全然良いプログラムですね。
なので、書き換えてUPはしません。今回の原因は↓に書いておきます。

> TIMEの数値が小さい範囲は、ブロワとバキュームが同期します。

単に設定値が小さすぎただけで気が付きにくかっただけでしょう。
設定値がこの程度の小さな値ならこのままでいいのですが、大きくするようなら
Second関数を利用した方が良いかもしれません。
つまり、__delay_ms(300);→→→Second(30);です。(切り替え時の反応が早くなる筈です)


> 16F88を買いました。
PICを代表するスタンダードなマイコンです。まぁ、旬はすぎていますけど。
627Aからだと、重要な順?に、ADCが付いた、フラッシュメモリが増えた、クロックが速くなった、SPI、I2Cが付いた、
といったところです。かなり標準的なマイコンになっています。
(あとは外部割り込みをもう少しつけてほしいのと、内部プルアップを個別に設定出来れば良いのですけど)

*****************************************

間違えと思われるところはタイマー割り込みで
> if(v_on_time>=(DousaTime+KanketuTime)) v_on_time=(DousaTime+KanketuTime)-1;
> if(v_off_time>=(DousaTime+KanketuTime)) v_off_time=(DousaTime+KanketuTime)-1;
をしたのですが、これが元凶です。もう一つにはDousaTime、KanketuTimeの初期設定していない事です。
つまり、DousaTime、KanketuTimeが0の状態(数字を入れる前)でタイマー割り込みに入ってしまった為に
v_on_timeとv_off_timeが0XFF=65535になってしまい、その後・・・と言う事だと思います。
それでも、else v_on_time=set_time;(これは必須でした)を付けておけば、ほぼ、正常動作になったのかとは思いますけど。
あと、想定動作の違い、些細なミスも一か所ありました。
猛牛ロック   2016/02/13(Sat) 10:51 !email! No.766 !ico_edit!
Re: ハンドル作りました
maboさん、こんばんは。

後閑哲也さんの本が来ました。
http://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE-PIC16F1%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E6%B4%BB%E7%94%A8%E3%82%AC%E3%82%A4%E3%83%89%E3%83%96%E3%83%83%E3%82%AF-%E5%BE%8C%E9%96%91-%E5%93%B2%E4%B9%9F/dp/4774156469/ref=sr_1_1?ie=UTF8&qid=1455014619&sr=8-1&keywords=%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%80%80PIC%EF%BC%91%EF%BC%96F%EF%BC%91%E3%83%95%E3%82%A1%E3%83%9F%E3%83%AA%E3%80%80

興味があったので、さっそく読み始めました。
自分のレベルにあっているの感じで、分かりやすいです。
有難うございました。


猛牛ロックさんへ、
プログラムの見直しご苦労様でした。
>つまり、__delay_ms(300);→→→Second(30);です。

いや〜、流石です。
本で探してみます。
しかし、色々とご存知ですね!
自分も、なんとかプログラムを組めるようになりたいです。
TR   2016/02/13(Sat) 18:19 !email! No.767 !ico_edit!
Re: ハンドル作りました
>TRさんへ

> 本で探してみます。
> しかし、色々とご存知ですね!
> 自分も、なんとかプログラムを組めるようになりたいです。

本で探しても、自分で作った関数は載っていません。
Second関数は、「__delay_ms関数を○○回行う」と「その間に入力(変更)があったら、終わる」を組み合わせたものです。
なので、ほとんど__delay_ms(300)と変わりませんけど、後半部の「変更に伴う終了」がある分、つまみをいじった時に、
反応が良くなると思います。

プログラムは経験するしかないですね。勿論、本を読むことも重要ですけど。
学習キット(の基板)は今の段階では、良い教材です。スイッチ4つとLED8つが繋がっているんですよね?
例えば、
1.二進数で1秒おきにインクリメントさせる
2.1秒おきに一つずつ点灯を増やしていき、次の8秒で左右どちらかから、消していく。
3.1秒おきに片側から点灯させたものをずらしていく。(常に1つだけ点灯)
4.3の逆で1つだけ消灯でそれをスクロール。
5.両側から1つずつ付けていき、交差したら消していく。
6.4つの入力ボタンを利用して、上記の機能を割り当てる
7.4つのボタンを時、分、秒、0.01秒として、時計を作る
8.8つのLEDの点滅具合で時、分、秒を表現する
9.ラーメンタイマー(ストップウォッチ)を作って、ブザーで知らせる。

など、テキストに既にある例題かも知れませんけど、自習は幾らでも出来ます。
小さなプログラムでもひとつずつ、身につける(作れるようになる)ことが重要です。
テキストを読んでも「書いて、間違いを探して、修正して」、を繰り返さないと上達しません。
「書いて、間違いを探して、修正して」をするために、テキストを読んでください。

私は本も買わないし、全然「色々とご存知」でもないと思います。
何か作る時でも、大抵、「なんとか動くようになったな」という感じで、なんというか、そんな余裕は無いです。
特にPICはまだ理解が不十分です。割り込みのタイミングやフラグ操作、2重割り込みなど、判らないままやっています。
多分、トラブルが起きた際、本格的に調べるのだと思います。
猛牛ロック   2016/02/13(Sat) 22:31 !email! No.768 !ico_edit!
Re: ハンドル作りました
猛牛ロックさん、レス有難う。
766にある以下の点のついて教えて下さい。

>Second関数を利用した方が良いかもしれません。
つまり、__delay_ms(300);→→→Second(30);です。(切り替え時の反応が早くなる筈です)


Second関数を利用ですか?
難しそうです。
Dousatime とKanketutaimeで、一度つかっていますよね、
それを、単に、__delay_ms(300);→→→Second(30);と置き換えてもよいのですか?
TR   2016/02/14(Sun) 08:35 !email! No.769 !ico_edit!
Re: ハンドル作りました
Second関数は単に
「つまみ等の変化があれば終了」
「10msウェイト」
を指定回数(引数)繰り返す命令です。それ以外の事はしていません
returnは気にしなくても良いです。

「t=Second(30);」の様な戻り値を受ける形にしなくても、「Second(30);」だけでも大丈夫です。
なので、__delay_ms(300)を単にSecond(30)にするだけです。

因みに、__delay_msや__delay_usの引数は定数じゃなければ駄目だったと思います。
 なので__delay_ms(t);のような変数の表現は駄目です。
猛牛ロック   2016/02/14(Sun) 17:50 !email! No.770 !ico_edit!
Re: ハンドル作りました
猛牛ロックさん、レス有難う。

改良後のプログラムです。
else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
vacuum=On;Second(70);burowa=On;
change=Second(DousaTime); //動作時間分ウェイト
if(change==0){
burowa=Off;Second(50);vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト

ここの中にある、Secand関数を呼び出しての使い方!!
DousaTimeとKanketuTimeでも使っているので、ビクビクでした。
自分では、
プログラムは並んでいる順にした方向へ実施するの減速があることから、
burowa=Off;Second(50);vacuum=Off;を処理した後、
続けて
change=Second(DousaTime); //動作時間分ウェイト
の処理をするのでしょうか?
TR   2016/02/14(Sun) 19:48 !email! No.771 !ico_edit!
Re: ハンドル作りました
ただのコピペ間違いかも知れませんけど

> burowa=Off;Second(50);vacuum=Off;を処理した後、
は下から2行目ですから、次の命令は
> change=Second(DousaTime); //動作時間分ウェイト
ではなく、
> change=Second(KanketuTime); //間欠時間分ウェイト
と、最後の行に行きます

因みに、「burowa=Off;Second(50);vacuum=Off;」と1行でかいても
順番に実行されるだけで同時に実行されるわけではありません。
ソース上は行替えして、見やすくする方が良いです。
猛牛ロック   2016/02/15(Mon) 09:15 !email! No.772 !ico_edit!
Re: ハンドル作りました
TRさん、猛牛ロックさん、こんにちは。

遅くなりましたが、TRさん作製のハンドル、なかなかですね。
これも、CNCの威力ですね。

猛牛ロックさん、タチコマっていうのは、アンドロイドの部分?ですか。
写真みても、ちょっと、?でした。
mabo   2016/02/15(Mon) 14:09 !email! No.773 !ico_edit!
Re: ハンドル作りました
蜘蛛のような形の思考型戦車らしいです。実際、どのような動きをするかは判りません。
剣菱氏は勿論AVR習得の過程で知ったのですが、電気回路のみならず、3Dプリンタなどを駆使して
どんどん作っているようです。多分今年中には完成するものと思われます。
現在、タチコマのしたをくぐりながら部屋の出入りをしているようです。
多分、造形だけでなく、ある程度、動くようにすると思います。(電気が専門でしょうから)
本物(アニメ)は2足歩行もするようですね。完成が待ち遠しいです。
猛牛ロック   2016/02/15(Mon) 15:56 !email! No.774 !ico_edit!
Re: ハンドル作りました
タイマー割り込みを使ったプログラムですが、先日書いたように、そのまま適用しても見通しが悪く、
全然、良くないプログラムになりました。
原因の多くは、それまでタイマー割り込み無しのプログラムを作ろうとしていた所にタイマー割り込みを
組み入れたからだと思います。
何となく、気になっていたので、いつも作るように(今までとは逆に)タイマー割り込みのみの
プログラムで書き換えてみました。
差し替える必要は全くありません。見通しも悪くないプログラムだと思います。

間欠時の動作はTRさんの書き込みに倣って、
「vacuumオン」遅延時間0.7s「burowaオン」動作時間「burowaオフ」遅延時間0.5s「vacuumオフ」
の繰り返しです。
猛牛ロック   2016/02/18(Thu) 12:07 !email! No.775 !ico_edit!
Re: ハンドル作りました
> MABOさん
blogの回路についてですけど、「追加」という事を考慮しないで、普通に作るなら添付図のような感じです。
・私の知っているSSRは全て、入力でLEDを光らせています。なのでフォトカプラは使う必要はありません。(2重になります)
・独自の制御をしない場合は(同時に切るだけなら)SSRは一つで出来ます。(アダプタと並列にとるだけ)
追記 そういえば、切るスイッチがありませんでしたね。ヒューズ-ボタンスイッチ間にB接点のスイッチを入れてください。

最近入手した2.4インチのLCDで、ちょっと遊んでいます。
http://www.aitendo.com/product/10342と同種の製品です。
何が良いって、配線をしないで差し込むだけなのが素晴らしいですね。
「arduinoに液晶を挿す」、「USBに挿す」、とこれだけで液晶、タッチパネル、SDカードを使う準備が出来る上に
マイコンを書き込む準備まで出来てしまいます。革命的です。
arduino unoも「変な形」だと思っていたのですが、考えが変わりました。
これをやると、他の20ピン以上ある液晶に手をだす気が失せますね。
猛牛ロック   2016/02/18(Thu) 12:21 !email! No.776 !ico_edit!
Re: ハンドル作りました
猛牛ロックさん、こんにちは。また、また、アドバイスありがとうございます。

カプラーは2重になるんですよね。手持ちのカプラーがごろごろしているので、
消費もかねて、入れることにしようと思います。

猛牛ロックさんの教えてくださった回路の方がシンプルでいいですね。
ただ、今回は、過去に作ったタイマーの回路の改造ということで、手落ちのSSRを付け加えます。

それから、元々の設計で、タイマーが切れると自分自身の電源も落とす予定でしたので、
切断のスイッチは、いれていませんでしたが、はやりあった方がいいみたいですね。

ある方のHPにこの回路の記載がありました。
この方は、リモートでコントロールするために自己保持させるようで、
SSRの制御側で、5Vかける,グランドに落とす、ということをやってます。

私は、AC側を短絡させて、起動させてますが、どちらがいいのか、ちょっと、?です。
付部品が少ないのが、AC側でしょうか。それと、リモートで制御するとなると、AC引っ張るよりも5Vでしょうかね。

このボックスの中には、使ってないリレー(自己保持に失敗)もそのままになってます。
後で、全面的に見直そうと思います。


LCD、これ、便利そうですね。タッチパネルもついているんですね。
ただ、
>接続が行われていないので使用できません。
とありますので、そのままでは、使用できないでしょうか。改造は、面倒なんでしょうかね。
それと、使用できたとしても、ソフトが面倒なんでしょうかね。
mabo   2016/02/18(Thu) 13:23 !email! No.777 !ico_edit!
Re: ハンドル作りました
> 私は、AC側を短絡させて、起動させてますが、どちらがいいのか、ちょっと、?です。
> 付部品が少ないのが、AC側でしょうか。それと、リモートで制御するとなると、AC引っ張るよりも5Vでしょうかね

自己保持はリレーの結果を利用して保持させます。通常は物理リレーの空いている2次側の接点です。
それをA接点の起動用スイッチと並列にすることにより、自己保持させます。
5V側(SSRの1次側)だけでは自己保持されないように思います。(別に自己保持の専門リレーが必要なのでは?)
わたしは、SSRで自己保持させたことはありません。今まで(物理)リレーやマグネットスイッチだけです。
よく考えらえた回路だと思いました。

>接続が行われていないので使用できません。
それはリンク先の商品の事で、私の買ったのはaliの更に安い商品です(送込500円弱)。
まだタッチパネルやSDは試していませんけど、配線自体はしてあると思います
ただ、「DOT MATRIX LCD」として動画でもUPしたい所なんですけど液晶のドットが長方形なんですよね。その点で
今一つやる気が削がれています。
動作確認程度は、ライブラリ(テストプログラム)があるので簡単に出来そうです。
猛牛ロック   2016/02/18(Thu) 17:19 !email! No.778 !ico_edit!
バラックでのテスト 投稿者:TR 投稿日:2016/02/07(Sun) 14:49 No.736

猛牛ロックさん、レス有難うございます。
実機で動作確認ができました。
早速、基板を作ります。

いや〜、またまた、
SEC基板とPICの入出力端子の兼ね合いで、
ごちゃごちゃになっていました。

サクッとできてしまう、猛牛ロックさんは、流石です!

実のところ、何度もプログラムを弄っていました。
助かりました。
本当に有難うございます。
今回の、遅延させる動作は、良い勉強になりました
激汗でした。

Re: バラックでのテスト
TRさん、猛牛ロックさん、こんにちは。

実機につないで、うまくいかなかったのですしょうか。猛牛ロックさんが回路アップしてっくださってますので、そちらがいいかもです。

猛牛ロックさん、引き続きありがとうございます。いままで、メモリーのことは、それほど考えないで使ってました。
猛牛ロックさんのおっしゃるようにCONSTの修飾子で、プログラム領域に定数の設定できました。

最初、X18コンパイラーの、

  rom const

という記述をしてみましたが、XC8では、エラーになりました。このへんは、おっしゃるようにコンパイラーの方言?みたいなもんなんでしょうね。

PC用にCでプログラムを組んでいたときは、メモリーのことは、それほど意識しないでも大丈夫でしたが、PICでは、てきめんですね。

今回も、又一つ、PICの理解が深まりました。

24LS256はおっしゃる通りEEPROMです。データーロガーの記録用に使われてたようです。
読み書きの速度も遅いんでしょうね。まあ、これも。勉強?なので、後日、使ってみようと思ってます。
mabo   2016/02/07(Sun) 15:10 !email! No.737 !ico_edit!
Re: バラックでのテスト
簡単なテストをしてみました
#include <xc.h>

void main(void) {
const char data1[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data2[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data3[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data4[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data5[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data6[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data7[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
const char data8[]={"1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"};
//面倒なので繰り返しました。63*8で504バイト程度です。
char c=*data1;
return;
}
*******************************

Memory Summary:
Program space used 207h ( 519) of 2000h words ( 6.3%)
Data space used 4h ( 4) of 200h bytes ( 0.8%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Data stack space used 0h ( 0) of 1F0h bytes ( 0.0%)
Configuration bits used 0h ( 0) of 2h words ( 0.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)


単純にconstを付けるだけでokな様です。まだまだ全然余裕の数字です。まぁ、本文が書いて無いですからね。
因みに const char data8[]={"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンァィゥェォャュョッー、。"};
にすると「知らないキャラクターだ」とwarningがでますけど問題は無いと思います。

また、上記のconstを3つまで消してもエラーは出ません。4つ以上消すとエラーです。
3つ消した時のが下記です。RAMが74.6%ですね。

Memory Summary:
Program space used 25Ah ( 602) of 2000h words ( 7.3%)
Data space used 17Eh ( 382) of 200h bytes ( 74.6%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
Data stack space used 0h ( 0) of 21h bytes ( 0.0%)
Configuration bits used 0h ( 0) of 2h words ( 0.0%)
ID Location space used 0h ( 0) of 4h bytes ( 0.0%)

チップは16F1937を選択しています

> 猛牛ロックさんのおっしゃるようにCONSTの修飾子で、プログラム領域に定数の設定できました。

あぁ、もう出来ていたのですね(^^)/
猛牛ロック   2016/02/07(Sun) 16:11 !email! No.738 !ico_edit!
Re: バラックでのテスト
maboさん、猛牛ロックさん、こんばんは。
皆様方のご指導で我ML4は、大変使い勝手がよくなりました。
そこで、初めてですが、ユーチューブに2本投稿しました。
お暇でしたら、見てやって下さい。
有難うございました。
今後も、拙いので、ご指導の程宜しくお願いします。
TR   2016/02/07(Sun) 20:43 !email! No.739 !ico_edit!
Re: バラックでのテスト
良い感じに動いているようで私もうれしくなりました。
また、マシンの切削音も聞こえないようで、剛性の強い、良いマシンですね。
羨ましいです。
猛牛ロック   2016/02/07(Sun) 21:08 !email! No.740 !ico_edit!
Re: バラックでのテスト
まぼさん、猛牛ロックさん おはようございます。

今回、時間を操作するプログラムを教えて頂きましたが、
更に理解を深めたいので、
初心者向けの良い本を教えて頂けませんか?
宜しくお願いします。
TR   2016/02/08(Mon) 06:55 !email! No.741 !ico_edit!
Re: バラックでのテスト
TRさん、猛牛ロックさん、こんばんは。

TRさん、YouTube見ました。猛牛ロックさんと同様、うらやましい環境だと思います。
この掲示板にもYouTubeアップできますので、試してみてください。
YouTubeの共有→埋め込みコードとたどって、四角のなかのコードをコピペすると、アップできます。

私の手元には、何冊かありますが、C関係の入門書等1冊読まれるといいかもしれません。
ただ、入門書は、PICでは、あまりでてこない、print( )の
オンパレードです。
基本的なCの流れや文法等の理解深められるといいかと思います。
私が最近参考にしているのは、

 電子工作のための PIC16F1ファミリ 活用ガイドブック
  (後閑哲也)
 Cで開発する PICモジュール・プログラム・サンプル集

あたりです。前者は、XIDEでのプログラムの例が載ってますので、打ち込めば、それほど苦労しなくても、確認できます。
後者は、使ってるコンパイラーが、microC PROなので、XIDEのXC8でコンパイルするには、多少の変更が必要です。

大きな本屋さんで、プログラムの例が沢山載っているもの見つけても、いいかなと思います。
mabo   2016/02/08(Mon) 21:11 !email! No.742 !ico_edit!
Re: バラックでのテスト
猛牛ロックさんへ、おはようございます。
間欠タイマーを改造したいので、教えて欲しいことがあります。

間欠タイマーでは
burowaとvacuumが同期しています。
これを、ブザーのように、遅延時間を設定し、
burowaが、OFF→、1秒後、vacuumをOFFにしたいのです。
理由
吸い込みの動作が、ブロワより少し遅れるからです。


// プロトタイプ宣言
void WaitTime (int cnt);//遅延設定時間 を入れる。



間欠タイマの   burowa=On;
vacuum=On;

vacuum=On;

// 待ち時間関数の呼び出し(約1m秒)
WaitTime(50);

burowa=On;






間欠タイマの// 永久ループの次に、以下を入れる

while(1){
if(IN==0){
OUT=1;
timer=0;
}else if(timer>set_time)OUT=0;
TR   2016/02/09(Tue) 07:26 !email! No.745 !ico_edit!
Re: バラックでのテスト
私なら、面倒ですけどタイマー割り込みを作ってそれを利用します。
ウェイトを使うと後で面倒なことが起きがちな気がします。
前の時の様に、0.01sごとのタイマーを作って、

#define 設定値 100 //9999まで単位0.01s
int v_timer=30000;

<タイマー割り込み>
if(v_timer<20000)timer++;
if(v_timer==設定値) { //ON用初期値0
vacuum=On;
v_timer=30000;
}
if(timer==10000+設定値){ //OFF用初期値10000
vacuum=Off;
}

で、メインの所のburowa=On;をburowa=On;v_timer=0;
burowa=Off;をburowa=Off; v_timer=10000;
という風にタイマーをスタート点にもっていけばいいと思います。

おおよそ、こんな感じで作ると思います。
プログラム的には改変に伴う見直し部分もあるかもしれません。
猛牛ロック   2016/02/09(Tue) 09:18 !email! No.746 !ico_edit!
Re: バラックでのテスト
猛牛ロックさん、レス有難うございます。

以下にて、ビルトできました。
如何でしょうか?

/*****************************
* 間欠タイマー
* 16F627A
* XC8 V1.35

* RA6←MACHからの入力想定
* RA2ブロワ制御用リレー burowa
* RA3掃除機制御用リレー vacuum
* RA7 モニター用発光LED 
*****************************/
#include <xc.h>
// 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 _XTAL_FREQ 4000000 //delay用宣言。下記__delay_msを使うとコンパイラがマイコンの周波数に応じてループ回数を計算します
#define On 1
#define Off 0
#define MACH_sig RA6 //machからの信号入力プルダウン
#define burowa RA2=RA7 //RA2:ブロワ出力 RA7:LED出力
#define vacuum RA3 //掃除機出力
#define set_time 100 //9999まで単位0.01s
unsigned char PORTB_save; //ポートBの保存用。(変更に対応するため)
unsigned char MODE; //セレクタ保存用

int timer;
// 待ち時間関数
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
}
return 0;
}
//<タイマー割り込み>
void interrupt InterSyori( void ){
if(timer<20000){timer++;}
if(timer==set_time) { //ON用初期値0
vacuum=On;
timer=30000;
}
if(timer==10000+set_time){ //OFF用初期値10000
vacuum=Off;
}
}
// メイン関数
void main (void){
OSCF=1;//内蔵発振器 4MHz使用に設定
CMCON = 0x07;// 1,2,17,18端子を入出力端子に設定 ??
unsigned int DousaTime,KanketuTime; //宣言。#defineからこちらに変更
char change;
PORTA=0;//出力のピンを初期設定。
// 入出力設定
TRISA = 0b01000011;
TRISB = 0b11111111;//負論理ロータリースイッチ2個。RB0-3が動作時間、RB4-7が間欠時間
OPTION_REG=0b00000000;//ポートBプルアップ
unsigned int TIME[]={10,30,60,100,150,200,300,500,700,1000,1500,2000,3000,6000,9000,18000}; //unsigned intで65000まで
// 永久ループ
while(1){
MODE=PORTA&0b11;
__delay_ms(50);
while(MODE!=(PORTA&0b11)){ //変化があればウェイト、無ければ確定
MODE=PORTA&0b11;
__delay_ms(50);
}
if(MODE==0||(MODE==3&&MACH_sig==0)){//OFF
burowa=Off;
vacuum=Off;
}
else if(MODE==1){//掃除機のみオン
burowa=On;
burowa=Off;

}
else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
burowa=On;timer=0;
vacuum=On;
change=Second(DousaTime); //動作時間分ウェイト
if(change==0){ //セレクタが変わった際、ポンプオフはしない
burowa=Off; timer=10000;
vacuum=Off;
change=Second(KanketuTime); //間欠時間分ウェイト
}
}
}
}
TR   2016/02/09(Tue) 21:01 !email! No.747 !ico_edit!
Re: バラックでのテスト
タッチプローブのプログラムをよく見ると

void interrupt InterSyori( void ){
if(TMR0IF==1){
TMR0=99; //0.01msごとに割り込み
TMR0IF=0;

上記を書き足して、

更に、
void main(void){   以降に 以下を書き足しました。

OPTION_REG=0b00000101; //プリスケラを64
TMR0=99; //TMR0カウンターを99にする→0.01msごとに割り込み
TMR0IF=0;
TMR0IE=1; //TMR0割り込み許可
GIE=1; //全体割り込み許可

しかし、今度は、間欠時間の行がエラーとなりました。

これは、どうしたらよいものか分かりませんでしょうか?
TR   2016/02/10(Wed) 07:28 !email! No.748 !ico_edit!
Re: バラックでのテスト
TRさん、猛牛ロックさんおはようございます。

TRさん、747+748で、私の環境では、エラーはでませんでした。
同左については、確かめていません。

OPTION_REGがダブるのでそれだけ、コメントアウトしました。
ファイルは、エラーがでてないものです。
mabo   2016/02/10(Wed) 10:04 !email! No.749 !ico_edit!
Re: バラックでのテスト
> int timer;
初期化の時に30000に指定しておいてください。int timer=30000;

> しかし、今度は、間欠時間の行がエラーとなりました。
上の処理と書いてあるように貼り付けてこちらではエラーになりません。
割り込み終了の「}」の処理が抜けているのかもしれません。あとは「 」(全角スペース)が入っているとか。

***********************************************

私は書籍は買っていません。20数年前にC言語の本は買いました。
当時、完全にマスターした訳でもないし、うろ覚えですが、読み返したいとも思わないですね。
実戦で、コンパイラが通ることでやり方を確認している感じです。
でも、TRさんは1冊はC言語の本を買っておくといいと思います。
マイコンの本は買ったことはありません。なので紹介できるものはありません。
AVRなら、AVR-WIKIさえみれば使い方はマスターできると思うのですが、PICにはそれに相当するサイトは
ありませんね。種類やコンパイラの多様性が原因でしょうね。

私はテキストはありませんから、思ったものを実践していくだけです。
新しいことをする度に新たな事を覚えます。
TRさんには、いい機会なのでタイマー割り込みの使い方(の基本)を覚えてもらいたいと
思います。
※マイコンは必ずデータシートを入手して、見てください。
 データシートはメーカーの取説ですから、一番重要です。
http://ww1.microchip.com/downloads/en/devicedoc/40044f.pdf


<タイマー割り込み>
8ビット(0-255)や16ビット(0-65535)のカウンタ(タイマー)がある。
設定した周波数でカウントしていき、桁あふれや、設定値になると割り込みがかかる。
この機能は外部装置なのでマイコンが処理されている間も別処理としてカウントされていく。
つまり、タイマー割り込みとは一定時間ごとにその関数を行う、と言う事です。。
割り込みがかかると、通常の処理は中断され、割り込み関数に飛び、処理される。
割り込み関数が終了すると、中断された元の場所に戻り、通常の処理が継続される。


<タイマー0割り込み系レジスタ>(一部略しています)
              bit7 < ------------------------------ > bit0
 OPTION_REG=  RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
(データシートP25)デフォルト1

  ・割り込み(カウント)元の設定
   T0CS 1:外部入力ピン  0:内部クロック(サイクル)

  ・プリスケーラレートの設定 ※PICは4クロックで1サイクル(動作、カウント)
   PS2-0
   000  1 : 2
   001  1 : 4
   010  1 : 8
   011  1 : 16
   100  1 : 32
   101  1 : 64
   110  1 : 128
   111  1 : 256


          bit7 < ---------------------------------- > bit0
 INTCON= GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
 (データシートP26)デフォルト0

  ・全体の割り込み許可(これ+タイマー割り込み許可でタイマー割り込みが有効)
   GIE 1:割り込み有効  0:全ての割り込み無効

  ・Timer0 (桁あふれ)割り込み許可 ※タイマー0は桁あふれしかありません。
   TMR0IE 1:有効  0:無効

  ・Timer0 (桁あふれ)割り込みフラグ ※割り込みをかけて桁あふれすると自動で1になる
   TMR0IF 1:桁あふれした 2:桁あふれしていない


 TMR0
  タイマー0本体の8ビット変数。自動でカウントアップしていき、255→0のタイミング(オーバーフロー、桁あふれ)で割り込みを起こす

<プログラムでの利用法>
1.メイン関数で初期設定をする
 TOCS=0;
 PS2=1;   ※プリスケーラー64の場合(101)
 PS1=0;
 PS0=1;
 TMR=0;   ※初期値0の場合。計算値の場合も多い。
 TMR0IF=0; //TMR0フラグクリアー
 TMR0IE=1;//TMR0割り込み許可
 GIE=1;//全体割り込み許可

※クロック4Mhz(1MHzサイクル)、64分周で0.01秒をつくるなら
 1000000*0.01/64=156.25
 この場合、TMR=-156で良いと思います(未検証)
 オーソドックスに計算すれば256-156.25=99.75でTMR=100にします


2.割り込み関数を作る
void interrupt XXX( void ){ //何かの割り込みがあればここに入る
if(TMR0IF==1){//TIMER0割り込みがあったら
TMR0=0; //※カウント初期値 0なら書かない方が良い?
TMR0IF=0 //フラグクリア

//以下にタイマー0割り込み本文

}
}

※計算した初期値を入れる。0の場合は書く必要は無いと思います。
 カウントが始まると狂ってしまうのでので一番最初に入れておく方が良い。
 また、プリスケーラが2とかの場合は既にカウントが始まっている可能性があります。時間を優先するなら
 低い分周でカウントを操作するのは避けた方が良いかも。
猛牛ロック   2016/02/10(Wed) 10:06 !email! No.750 !ico_edit!
Re: バラックでのテスト
皆様方 レス有難うございます。

manoさんへ、
エラーは出ませんでしたが、点滅しません。



猛牛ロックさんへ

>int timer=30000;

というのは、//<タイマー割り込み>
ここでのことですか?
void interrupt InterSyori( void ){
if(timer<20000){timer++;}
if(timer==set_time) { //ON用初期値0
vacuum=On;
timer=30000; →int timer=30000;

このようにしても点滅しません。
TR   2016/02/10(Wed) 21:04 !email! No.751 !ico_edit!
Re: バラックでのテスト
プログラムを見直しました。
正確に言うと
burowa=On; → burowa=On;v_timer=0;
burowa=Off; → burowa=Off; v_timer=10000;
ではなく
vacuum=On; → timer=0;
vacuum=Off; → timer=10000;
だったみたいです。
取りあえず、書き直したのをUPします。内容はあまり確認していません。機械的に書き換えました
予定動作はburowa-RA2の動作のset_time=1.00秒後にvacuum-RA3が続く、というものです。

追記
MABOさんのサインボードの左にあるICが気になってきました。
2つあるようなのですが使っているのは1つなのですか?
ICは何でしょうか?
猛牛ロック   2016/02/10(Wed) 21:44 !email! No.752 !ico_edit!
Re: バラックでのテスト
TRさん、猛牛ロックさん、こんばんは。

TRさん、すみません、かなり付属品が多くなってきてるので、実機での確認ができません。

猛牛ロックさん、こんばんは、左のICはトランジスタアレイの62003でです。
7+1しか使ってません。本当は、62083一個でもよかったのですが。手持ちがなかったので。
このトランジスタアレイは,なくてもよかったのかな、なんて思ってます。

それから、猛牛ロックさんのおっしゃるように、電流供給している、2SA1015の前の抵抗、大きいのかもですね。

それと、LEDの点灯時間長くできないかと、エクセルで馬鹿な計算してました。
1/32秒以上に、点灯時間長くできないのに、お馬鹿さんでした。
ラッチのICでも入れると、長くできて、明るくできるのでしょうか。
プログラムは、面倒になりますね。私には、難しいかも。
mabo   2016/02/10(Wed) 22:42 !email! No.753 !ico_edit!
Re: バラックでのテスト
皆さんおはようございます。
今日は休みで、最高!

実機で試しました。
結果、動作がめちゃくちゃでした。
vacuum=Off;とかなくなったせいだと思いました。

maboさんへ、
PICの本ですが、簡単そうな本にしました。
何冊も買って、自分にあった本を見つける覚悟です。(笑
http://www.amazon.co.jp/dp/4839929432/ref=pe_492632_159100282_TE_item_image
TR   2016/02/11(Thu) 08:18 !email! No.754 !ico_edit!
Re: バラックでのテスト
続けて失礼します。

今回は、切子を吸い込む時間幅が、ブロワーより長くしたかったのですが、なかなか上手くいきませんでした

そこで、
maboさんの言葉をヒントに
main関数内を以下のようにしました。

ウエイトを付けるというのですかね〜?
;__delay_ms(300);をブロワとバキュームの間に入れました。

イメージに近くなりました。

ただ、
TIMEの数値が小さい範囲は、ブロワとバキュームが同期します。
else if(MODE==2||(MODE==3&&MACH_sig==1)){ //間欠
PORTB_save=PORTB;
DousaTime=TIME[PORTB_save&0b1111];
KanketuTime=TIME[PORTB_save>>4];
vacuum=On;__delay_ms(300);burowa=On;

change=Second(DousaTime); //動作時間分ウェイト
if(change==0){
burowa=Off;__delay_ms(500);vacuum=Off;

change=Second(KanketuTime); //間欠時間分ウェイト


良い感じになったのは、猛牛さんが作った
基本プログラム優秀だったからだと思います。
猛牛ロックさん、このようなプログラムで、
如何でしょうか?
TR   2016/02/11(Thu) 10:16 !email! No.755 !ico_edit!
Re: バラックでのテスト
TRさん、猛牛ロックさん、おはようございます。

TRさん、「PICマイコンの基礎」は私も持ってます。
後閑哲也さんの本ですね。
この方は、沢山書いています。

多くはありませんが、プログラムも載ってます。
コンパイラーがHITECHーCでの記述ですので、
XC8で使うには、多少記述の変更が必要になるかと思います。
mabo   2016/02/11(Thu) 10:32 !email! No.756 !ico_edit!
Re: バラックでのテスト
maboさん、早速有難うございます。
今キャンセルしました。

最初にご紹介してくださったほんのレベルより、簡単さそうで且つ自分の環境にあった本をご存知でしょうか?
宜しくお願いします。
TR   2016/02/11(Thu) 11:24 !email! No.757 !ico_edit!
Re: バラックでのテスト
一通り見直して、作り替えましたけど、自身は無いです。
バグも見つけ辛そうなので、私も回路を作らないと発見できないかも。
ちょっと嫌な条件もあるのでオンとオフは別タイマーにしました。
設定値も別々にできますけど、取りあえず一緒(1秒)にしています。
TRさんの改変で上手くいっているようなら、わたしのに差し替える必要は無いです。
それを思うままに変えていってください。

追記
しまったぁ!
続けて画像も送ろうとしていたらレス終了になってしまいました。
アーカイブに変更します。

間欠時間の間隔を短くした場合、下の細かい設定(case 1)にしてあります。
(case 2)の方が良い場合は書き換えてください。
それ以前に、どちらもちゃんと動かない可能性も高いですけど。
猛牛ロック   2016/02/11(Thu) 15:30 !email! No.758 !ico_edit!
続いています 投稿者:TR 投稿日:2016/02/06(Sat) 09:21 No.714

>毎回、使うピンや方法に合わせて書き換えます。
場合によってはCONFIG部も書き換えます。

下記以外にも、なにかあるということなんですね。
一応、ブレットボードでやってみたらなりませんでした。

   記
TRISA =0;
TRISB = ~0;
PORTA=0;

Re: 続いています
それで鳴らないなら、理由がわかりません。
回路の問題じゃないですか?
出力端子RA0からの電圧はどうなっていますか?

圧電スピーカーじゃないですよね?
+-逆だとかは無いですか?

見直したところ、コメントの間違いがありました(動作とは関係ありません)
0.01msごとに割り込み→0.01Sごとに割り込みです。100で1秒です

※追記
ミックス(No.709)で使う場合は宣言で
unsigned int timer=50000;
と初期値を入れてください
猛牛ロック   2016/02/06(Sat) 10:40 !email! No.715 !ico_edit!
Re: 続いています
猛牛ロックさんレス有難う。

RA0に5vがありません。
PICを交換したけど、変化なし。
スピーカーは秋月です。
http://akizukidenshi.com/catalog/g/gP-04497/
TR   2016/02/06(Sat) 11:27 !email! No.716 !ico_edit!
Re: 続いています
それはおかしいですね。
割り込みがおかしい場合でも接触していれば鳴るはずなのですが。
RB0ピン-接触-GNDになっていますか?
最低でも
if(RB0==0)RA=1;
はすると思うのですが

************
画像で確認しました。入力ピンRB0です。
内部プルアップさせた上で5vに繋げています。
接触=GNDに繋げるです。

あと、付いている抵抗は全て要らないので外してください。
ポートAは出力なのでRA0以外全て絶縁(何も繋がない)
ポートBは入力で内部プルアップなのでやはり使うRB0以外は
何も繋がなくて良いです。
入力をBポートに移動したのは余計なもの(プルアップ抵抗)を付けなくて済む
ようにしたかったからです。
PB0からの黄色線の上部の5vラインから抜いてGNDラインに手動で抜き差しして
動作確認してください。
猛牛ロック   2016/02/06(Sat) 11:56 !email! No.717 !ico_edit!
Re: 続いています
猛牛ロックさん レス有難う。

音が鳴りました!

入力ピン(RB0)ですが、テキストでは、写真の様になっていました。
なので、DC5V〜PIC端子と思って繋ぎました。

RB0から、GNDに繋ぐとなると、出力ピンの使い方と思いたくなるのですが、
考え方が、違うのでしょうか?

それと、
時間調整するにはどうしたら良いでしょうか?
TR   2016/02/06(Sat) 12:52 !email! No.718 !ico_edit!
Re: 続いています
鳴りましたか。良かったです。

> #define set_time 200 //遅延設定時間

この200→2秒が設定時間です
接触開始から音が鳴りだしてNo711なら接触が終わった瞬間からカウントして設定時間後に止まります。
No.709なら接触開始から設定時間音が鳴ります。音が鳴りやんだ後に一度離れたらリセットされます

注、割り込み、プリスケーラなどの間違いがあれば、数分の一や数倍になる可能性もあります。
 正しいかちょっと確認してみて下さい。
猛牛ロック   2016/02/06(Sat) 13:19 !email! No.719 !ico_edit!
Re: 続いています
猛牛ロックさん レス有難う。

参考の為にお聞きしました。
有難うございます。


プログラムで、入出力端子の設定が、
TRISA =0;→//出力端子
TRISB = ~0; → 「~」反転でしょうから、1と思います。
ということで、入力端子 

で、RB
#define IN RB0
if(IN==0){
OUT=1;

となっているので、
RB0がローなら、つまり、GNDと繋がった時
#define OUT RA0となっているから、
RA0がOUT=1;により、
RA0に繋がっているスピーカーが鳴るということでしょうか?


プリスケラーTMR0=99ですが、
最高でいくつですか?
TR   2016/02/06(Sat) 13:51 !email! No.720 !ico_edit!
Re: 続いています
0は2進法(8ビット)で0b00000000です。
~0は2進法(8ビット)で0b11111111です。

途中の説明はその通りです。

> プリスケラーTMR0=99ですが、
> 最高でいくつですか?

> OPTION_REG=0b00000101; //プリスケラを64
です。この下位3ビットの「101」がプリスケーラの64に相当します。
プリスケーラは分周の事です。違う尺度でタイマーを動かします。
また、最上位ビットの0(bの右)が内部プルアップを有効にするスイッチです。(1で無効)
ただ、これは飛行機(操縦席)に付いているスイッチと同じで機種が変われば変わる可能性が
あります。
単にマイコンの様々な機能の切り替えをレジスタ名をつけて割り当てているだけです。
同じ設定のものもありますけど異なる場合もあります。

マイコンのクロックが4Mだとサイクルだと1Mhzになります。
(PIC16Fは4クロックで1命令=1カウントします)
64分周だと1カウントで64/1M=0.000064秒です。
0.01Sを作りたいので0.01S/0.000064=156.25カウントで0.01Sになります
タイマー0は桁あふれで割り込みをかける設定にしているので256-156.25=99.75
から数え始めると0.01Sごとに割り込みになる計算です。

プリスケーラは1:1から256:1まで設定可能です。
set_timeは49997までだと思ってください。単位が0.01Sですから500秒弱です。
勿論、必要なら何時間でも何日、何年でも書き換えることは可能です。
猛牛ロック   2016/02/06(Sat) 14:31 !email! No.721 !ico_edit!
Re: 続いています
下記はどういった意味になるのですか?

   記
if(timer<50000)timer++;


それから、先程、秋月のSSRが来たので、
実装にて10分間ほど、掃除機を回しましたところ、
大した熱もなく、問題なさそうでした。
使ってみての感想ですが、改造の余地ありですが、
でも、気に入りましたよ(^^♪

maboさん、猛牛ロックさん
色々とご指導を賜り深く感謝申し上げます。
自力だったら、とっくにギブしていました。


追記
RBが全て内部プルアップなら、外付けのプルアップ抵抗はなくてもOK?
RAは、全て、出力端子の設定なので、外付け抵抗無しでOK?
でも、RA5は入力専用なので、外付け抵抗でプルダウンでは?
TR   2016/02/06(Sat) 16:51 !email! No.722 !ico_edit!
Re: 続いています
> if(timer<50000)timer++;

割り込みの度、つまり0.01Sごとにこの処理をします
書いてある通り、「timerが50000より少なければtimerの値を1増やす」と言う事です。
リセットさせなければどんどん増えていき、50000で止まります。

本来はtimerは16ビット(unsigned int)にしているので65535までカウント可能なのですが
何となく充分そうな50000にしました。

普通は単にtimer++;だけにするかもしれませんけど、ループして0からカウントするのを防ぐために
一定値(50000)に止めてあります。
No.709ではフラグの代用として、また、チャタリング対策としても再利用しています。

タイマー割り込みで行っているのはこの1行だけです。

> 自力だったら、とっくにギブしていました。

今回のなんて、プログラムの本来的なところでは10行程度のものです。
マイコン独自の使い方や回路などの問題も絡んできて厄介なのですが、それでも
それほど難しいものではありません。
やはり、「自分で考えて書いてみる」というのは重要だと思います。
(やっているテキストにはこのような手法は書かれていないかも知れませんけど、別のテキストでは最初の方に
書いてあるような内容だと思います)


> RBが全て内部プルアップなら、外付けのプルアップ抵抗はなくてもOK?
> RAは、全て、出力端子の設定なので、外付け抵抗無しでOK?

そうです。出力は繋げるものに応じて制限抵抗を付ける場合もありますけど(トランジスタなど)、特に
抵抗ありき、ではありません。イメージでは乾電池の様に端子があるだけですね。
プルアップ、プルダウンはダブルでつけると合成抵抗になりちょっと強くなります。基本的にどちらか一つで良いです。
私は大抵、内部プルアップ抵抗があるマイコンを使うのでほとんど外部抵抗は付けません。
ただし、I2Cなど通信規格上、抵抗値が定められている時がありますからその時はその数値に従ったりもします。
PICの内部プルアップはデータシートに書いてありますけど「弱プルアップ」です。「弱」は引っ張る力が弱い=抵抗値が高い
と言う事です。これはその名の通り、ノイズにも弱いです。その場合、数キロΩで外部プルアップすると「中」もしくは
「強プルアップ」になります。

> でも、RA5は入力専用なので、外付け抵抗でプルダウンでは?
そうですね。それが正しいです。RA5(リセットピン)だけは内部プルアップも付いています。
有効になっているような気がするのですが確かめていません。
正しい処置としては入力に設定してどちらかに固定させるべきですね。
猛牛ロック   2016/02/06(Sat) 18:04 !email! No.723 !ico_edit!
Re: 続いています
>MABOさんへ

blogの方に書こうと思ったのですが、長いと右側が切れたように思ったのでこちらに書きます。

左端の不具合は治っていますね。
左右どちらに流すのも自由ですけど、基本は読む方向の←かと思います。
特に字数が増えれば必然とそうなります。

データ量としては1文字で8バイトなのでキャラクタ液晶レベルの文字(数、英大小、カナ)は大したことないですよ。
256文字入れても2kバイトです。1937は8kワードなのでこの辺りの文字数までは大丈夫かと思います。
ただ、RAMは容量が少ない(512バイト)ので注意が必要です。

PICはまだわからないのですが、AVRだと定数をフラッシュからSRAMに自動で読み込ませない方法があります。
そして、使う分だけその都度フラッシュから読み込んで処理をさせます。PICも同様だと思います。
つまり、処理としては文字コードの列の1バイトをフラッシュから読み込みながらスクロールさせていく
ようなコードを書く必要があります。
このような処理はキャラクタ液晶でも言えます。キャラクタ液晶はドットデータは液晶に入っていますけど、
総表示文字数が多いとやはりSRAM上には載せられません。それで本文をフラッシュから必要分読み込みながら処理します。
ドットデータと本文両方ともフラッシュに残すかどちらか片方にするのか、全部SRAMにロードさせるかは情報量や
積んでいるメモリによります。場合によっては本文の方がデータ量が多いこともあれば、逆もあります。
最終的には総データがフラッシュに載らなかったり、最低限必要なSRAMの容量(表示の為の帯状に展開させたドットを処理するための
容量)が無ければ、やはり機種変更になります。(フラッシュだけの場合はSDカードを付けたりする事もよくあります)
猛牛ロック   2016/02/06(Sat) 18:11 !email! No.724 !ico_edit!
Re: 続いています
TRさん、猛牛ロックさん、こんばんは。

どうやら、私のPICKIT3破損のようです。以前は、PICKIT3から電源供給して、PICのプログラム動かせたのですが、動かなくなりました。
書き込みも、ダメのようです。余計なものない状態でも、ICSPの基板の上でもだめです。
まあ、純正と言っても、○国製ですからね。

TRさん、意図した動作に近づいてよかったですね。目的の動作をさせるまで、紆余曲折、DIYの醍醐味(何度目でしょうかね。笑)ですね。

猛牛ロックさん、アドバイスありがとうございます。

左と右端に不具合がありました。最初気づかなかったのですが、あれ、と思って、修正しました。
いつもそうなんですが、境界値の変数等の処理に躓いてました。
細かい部分ではっきりしないことが多くで、いつもトライアンドエラーです。
お恥ずかしいかぎりですが、
 for(i=0;i<10;i++)
なんかの処理でも、結局何回処理されて、「i」は、いくつになるんだ、なんて、いつも考えてしまいます。
この辺が、エラーの原因ですね。

アルファベット26文字メモリーに積むと、ぎりぎりで、オート変数の領域もなくなってしまうようで、コンパイルのエラーになります。
できるかどうかわかりませんが、24LS256の使用例が本に載っていましたので、ぼちぼち挑戦しようかなと思ってます。
このメモリーとのやりとりがI2Cなので、ちょっと、頭抱えるようです。

スクロールの方向もそうですよね、英語表記では、左から右だと、逆の動きですね。

とりあえずの目標は、PCからのデーターを表示することなので、PIC変えて、トライしてみようと思ってます。

おっちょこちょいで、あっという間に、PIC(16F1937)を4個破損しました。
VSSから通電してしまうと一発ですね。VSSとVDDが隣り合わせの構造なので、一つ上にずらしてPICをさすと、VSSに通電することになるので、ひとたまりもないようです。
一見、動くようですが、ポートのビット演算等、できなくなるようです。
mabo   2016/02/06(Sat) 21:30 !email! No.725 !ico_edit!
Re: 続いています
猛牛ロックさんへ

SEC基板からの信号を受ける為に、
回路を写真のようにしました。
そして、入出力設定も下のように変えました。
でも、動作しません。
理由を教えて頂けませんでしょうか?

宜しくお願いします。


   記
// 入出力設定
TRISA =0b00100010;
TRISB = ~0;
TR   2016/02/06(Sat) 23:38 !email! No.726 !ico_edit!
Re: 続いています
TRさん、こんばんは。

もしかして、RA1は出力にするのでは?
mabo   2016/02/06(Sat) 23:52 !email! No.727 !ico_edit!
Re: 続いています
maboさんへ
>もしかして、RA1は出力にするのでは?

あっ、そうか!
そして、RB0を入力ですかね?
プログラムを直してみます

追記
RA1出力にしても駄目です。
TR   2016/02/06(Sat) 23:58 !email! No.728 !ico_edit!
Re: 続いています
TRさん、MACHのPIN設定はどうなってますか。

ブザーの端子は、プローブ接触でHIGHの出力でしょうけど、MACHの方は、もしかして、アクティブローでは。
だとすると、プローブ接触で、LOWの設定にしないとだめかなあ。

それと、プリセッターの所のLED、アノードとカソードが逆の配線ですけど、実際とは、ちがいますよね?
mabo   2016/02/07(Sun) 01:04 !email! No.729 !ico_edit!
Re: 続いています
プログラムが分かりました。

回路図を変えました。
RB0の内部プルアップに対応しました。

そして、プリセッター(接点)の開閉により
RA0からの出力モニター用に右側に発光LEDを設けて、
動作確認したところ、
プリセッター(接点)の開閉により発光LEDが同期し、
且つ、接点が開いてから、2秒くらい点灯し続けます。

上手くいきました。

訂正
この場合、フォトカプラーがローで動作するので、
駄目です。
ブザーの音が小さい
TR   2016/02/07(Sun) 08:15 !email! No.730 !ico_edit!
Re: 続いています
TRさん、猛牛ロックさん,おはようございます。

TRさn、回路のことはよく分からないのですが、個人的には、726の方がいいように思いますが・・・・。
726で内部プルアップがうまくいかないようでしたら、外部プルアップにするとか。
726の内部プルアップの設定は、大丈夫でしょうか。→OPTION_REGの設定。
それと、PICで直接のドライブがだめなら、トランジスターかまして、ブザーのドライブという手もあるかも。
確か、5mA程度だっと思うので、直接PICでも大丈夫かとも思いますが・・・・。

猛牛ロックさん、フラッシュメモリーのアドバイスありがとうございました。

>256文字入れても2kバイトです。1937は8kワードなのでこの辺りの文字数までは大丈夫かと思います。

ですが、配列でとるとRAM領域に配置されてしまうようです。26文字宣言すると、RAMが98パーセント近く消費されます。
プログラム領域に配置する方法あるんでしょうかね。この変、未知なる部分です。
それから、PICのこともAVRのこともよく分からない部分多いのですが、

>AVRだと定数をフラッシュからSRAMに自動で読み込ませない方法があります。

意図的に操作しないと、読み書きはできないようです。

http://www.geocities.jp/zattouka/GarageHouse/micon/MPLABX/HEF/HEF.htm

に、操作方法ありました。これ、参考にフラッシュメモリーの操作もしてみようと思います。
mabo   2016/02/07(Sun) 08:49 !email! No.731 !ico_edit!
Re: 続いています
回路図を更に変えました。
RB0は、エンドミル経由で直にGNDに落とす。

そして、エンドミル(接点)の開閉により
RA7からの出力モニター用にSEC基板に見立てた暫定の発光LEDを設けて、
動作確認したところ、
プリセッター(接点)の開閉により発光LEDが同期し、
且つ、接点が開いてから、2秒くらい点灯し続けます。

上手くいきました。
TR   2016/02/07(Sun) 09:12 !email! No.732 !ico_edit!
Re: 続いています
実機でテスト、繋いだ瞬間になりだします。
TR   2016/02/07(Sun) 11:04 !email! No.734 !ico_edit!
Re: 続いています
> SEC基板からの信号を受ける為に、

しようとしている事が良く分かりません。MACHへ出力するのではなく受けるのですか?
何の信号(合図)を受けるのですか?

このマイコン(16F627A)の設計の問題ですが、基本的に入力はBポート、出力はAポートで設計されています。
Bポートには内部プルアップ抵抗が付いていますけど、1ピン毎にオンオフ出来ません。一斉にポート毎にオンオフです。
なのでプルアップしたBポートに接続したブザーにはL出力でも微電流が流れます。音はならないでしょうけどあまり良くないですね。
RA5(リセットピン)は内部プルアップがあるので何も繋がなくて良いと思います。

> TRISB = ~0;

PB0は入力
PB1は出力ブザー
PB2は出力ブザー
PB3〜7未使用
ですから最低でも0b001です。未使用ピンを入力にするなら0b11111001,
出力にするなら0b00000001にして下さい

*********************************
やっぱりMACHへのプローブ用の出力でしたね。これはマイコンとは関係ありません。
処理しても高速でスルーさせるだけです。外部割り込みで最優先で処理させれば速度的には可能
かも知れませんけど特に処理するわけでなくスルーさせるだけなので入れない方が良いです。
添付図の様に結線すればOUT RA0となっている所をOUT RA0=RA1に変えるだけで良いと思います。


>MABOさん
マイコンは普通メモリは、フラッシュ、SRAM、EEPROMと3種あります。
で19F1937はフラッシュが8Kワード、SRAMが512バイト、EEPROMが256バイトです。
> アルファベット26文字メモリーに積むと、ぎりぎりで、オート変数の領域もなくなってしまうようで、コンパイルのエラーになります。
これはSRAMの領域のことです。
26文字だと208バイトです。フラッシュの容量は全く問題ありません。「オート変数の領域」はSRAMの中のことですから、
SRAMを増やすか、SRAMにはロードさせないでフラッシュのデータとやり取りするかです。
多分24LS256は24LD256のEEPROMだと思うのですけど、これは実行中に書き込み可能なメモリですが、読書きは遅いですし、
普通目的はSAVEすることです。使っているパラメータをセーブしておいて、次回はその設定を読み込みます。
例えば、液晶の照度だったりゲームのスコアだったり、プログラムでは書けない利用者が設定するパラメータを保存するのが
主な目的です。勿論、固定データを保存することも可能ですけど。
ドットデータをEEPROMに保存したとしてもやはりSRAMにロードさせれば同じくオート変数の領域は無くなります。

マイコンは起動するとフラッシュに書かれたデータをSRAMに書き移します。でも容量は圧倒的にフラッシュが多いので
パンクします。それで不必要な固定データはSRAMにはロードしない様に明記します。それをしないとエラーになります。
フラッシュとEEPROMだとフラッシュの方が断然早いでしょうから、書き換えないような固定データは普通フラッシュに
置いておきます。
16F1939だとSRAMは1024バイトになるので26文字は全く問題ないと思いますけど書き込む文字(コード)も長くなると
やっぱりメモリを食います。多分
const char DATA[] ={0x45,0x1f,0x03,......};
みたいに書くとフラッシュの残ると思います。このあたりの書式の仕様はコンパイラごとに違うので自信はありません。
「const」が一つのキーワードです。

参考までに、AVRだとavr/pgmspace.hを読み込ませたうえで、PROGMEM修飾子を使って宣言します。
#include <avr/pgmspace.h> //必要なヘッダファイル
const char pw[] PROGMEM="カウントチ リセット"; //この宣言でSRAMにはロードされない
c=pgm_read_byte(pw); //読み出し。ただしこれでは最初の1字(カ)です。実際はpw+tのような引数でアドレスを変えながら読み込みます
猛牛ロック   2016/02/07(Sun) 13:39 !email! No.735 !ico_edit!
SSR 燃えました 投稿者:TR 投稿日:2016/02/04(Thu) 21:05 No.693

maboさん、こんばんは。
困ってしまいました。
合成写真 左は、掃除機と制御用のOmron製SSR(G3R-OA202SZN)の図面です。
ほんの少し動作したら、掃除機が暴走したので、おかしいと思って、SSRを見たら、燃えていました。
繋ぎ方がおかしいのでしょうか??
原因を教えて下さい。

Re: SSR 燃えました
SSRにカタログです。
赤枠が使用したSSRです。
TR   2016/02/04(Thu) 21:11 !email! No.694 !ico_edit!
Re: SSR 燃えました
あっそうか!
2Aです。
それが原因ですか??
そうだよな〜
P=VI
1000Wとして
1000/100=10A

あ〜、良く調べればよかった。
どこかにSSRをご存知有りませんか?
失敗だ
TR   2016/02/04(Thu) 21:16 !email! No.695 !ico_edit!
Re: SSR 燃えました
TRさん、こんばんは。猛牛ロックさんこんばんは。

被害はSSRだけですか。他に及ぶと大変ですね。
○月に40Aのものがでてますが。

http://akizukidenshi.com/catalog/g/gI-08620/

使ったことはないので、わかりませんが。

配線は添付の配線図のようにするのだと思いますが。
TRさんの写真に、端子のNO書いてないので、ちょと不明ですが。
少し変かも?
mabo   2016/02/04(Thu) 21:43 !email! No.696 !ico_edit!
Re: SSR 燃えました
うわー、燃えたとは、、、
まぁ、SSRだけのようなので不幸中の幸いでしたね。
実際、SSRが大丈夫でも掃除機も熱を持って壊れやすいので注意して下さい。

SSRは秋月のキットが有名です。http://akizukidenshi.com/catalog/g/gK-00203/
ただ、偶然、売り切れのようですね。定番なので直ぐに補充されるだろうと思います。
SSRのコーナーでは更に大容量なキットやチップもあります。
http://akizukidenshi.com/catalog/c/cssr/
(私は25Aキットのような構成で自作しています)
稀に似たような機種(G3MB-202P)も使うのですけど、10Wや20W程度の小さな(シンクロナス)モーターに
使っています。
自作は面倒ですけど、NC(B接点)にも出来るので、大抵、パーツで組んでいます。
猛牛ロック   2016/02/04(Thu) 21:56 !email! No.697 !ico_edit!
Re: SSR 燃えました
慌てて回路図を書いたので、不鮮明となってしまいました。
済みませんでした
回路は、maboさんのものと同じです。

秋月のSSRですが、ヒートシンクは付ける必要がありますか?
http://akizukidenshi.com/catalog/g/gK-00203/

掃除機はモノタロウで、1200Wです。
https://www.monotaro.com/g/00357192/?t.q=%91%7C%8F%9C%8B%40
最近慣れてきて、SSRの定格を気にしませんでした。
TR   2016/02/04(Thu) 22:07 !email! No.698 !ico_edit!
Re: SSR 燃えました
注意書きを見ると、放熱は必須のようですね。
下の商品は、放熱板に直接取り付けがOKのようですが、、、
3本足ですけど、
繋ぎ方を知っていますか?
http://akizukidenshi.com/catalog/g/gK-00210/
TR   2016/02/04(Thu) 22:45 !email! No.699 !ico_edit!
Re: SSR 燃えました
TRさん、猛牛ロックさん、こんばんは。

TRさん、手元にある取説です。これだと、最大35Aの表記がありますね。
でも、掃除機だと、突入電流?がきっと、多いでしょうね。
余裕のあるものがいいかもですね。
mabo   2016/02/05(Fri) 00:03 !email! No.700 !ico_edit!
Re: SSR 燃えました
maboさん、資料のご恵与、有難うございます。
ちょっと面倒そうなのと、サージですか、、、。
やはり、最初にご紹介をしてくださった、↓にしました。
http://akizukidenshi.com/catalog/g/gI-08620/

燃えてしまったSSRで、開閉の動作を確認していますので、
このSSRをかえば、もう大丈夫です。
TR   2016/02/05(Fri) 06:23 !email! No.701 !ico_edit!
Re: SSR 燃えました
maboさん、続けて失礼します。

過日教わった、間欠のプログラムを利用して、
タッチプローブがONでブザーが鳴る。
そして、OFFの後も、少々なる
以上を出来るかと思って、、、
↓を利用しました。
ただし、delay_ms(10)にしました。

// 待ち時間関数}
void Second(int sec){
while(sec >0){
sec--;
__delay_ms(10);
}
}


これで、ブザーが鳴りましました。
でも、OFFの後も、少々なる が上手くできません。
どの様にしたらよいでしょうか??

お手すきの時で結構ですので、
教えて下さい。


PS
プログラムです。
/*****************************
* 間欠タイマー
* 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
int Start;
//関数宣言
void Second(int sec);
void interrupt InterSyori( void ){//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;
}
}
// メイン関数
void main (void){
OSCF=1;//内蔵発振器 4MHz使用に設定
CMCON = 0x07;// 1,2,17,18端子を入出力端子に設定
PORTA = 0x00;// 電圧レベルの初期設定
PORTB = 0xFF;
// 入出力設定
TRISA = 0b01010000;//RA5は入力専用・RA6は入力他は出力
TRISB = 0b00000000;//RB0は入力
//初期設定
RA2=Off;//MACH
RA6=Off;
Start=0;
//割り込み設定
OPTION_REG=0b000000000;//プリスケラ? 2 5ビット=0 WDTは使わない
TMR0=0; //TMR0カウンターを0に
TMR0IF=0; //TMR0フラグクリアー
TMR0IE=1;//TMR0割り込み許可
GIE=1;//全体割り込み許可
// 永久ループ
while(1){
if(Start==1){//スタートフラグが1なら動作開始
RA2=On;
Second(DousaTime);
RA2=Off;
Second(KanketuTime);
}
}
}
// 待ち時間関数}
void Second(int sec){
while(sec >0){
sec--;
__delay_ms(10);
}
}
TR   2016/02/05(Fri) 07:29 !email! No.702 !ico_edit!
Re: SSR 燃えました
TRさん,おはようございます。頑張っておられますね。

割り込み使わなくても大丈夫だと思いますが、TRさんのアップしてくださったプログラムに多少手を加えでも動作させられると思います。

要は、ブザーが「On→Off」の時だけ、ちょと間を置いてブザーを切ればいいので、ブザーが鳴っていたというフラグを作って判定すればいいと思います。
割り込みの方で、ブザーのOn、Offしてもいいのですが、
割り込みにWait()を入れると、割り込みを使う意味がなくなってしまうので、
main()の方で処理すればいいと思います。

MACHへも出力がないようですが、もし出力するようであれば、割り込みのところにいれれば大丈夫かなと思います。
ちょっと、チャタリングが心配かなあ。
mabo   2016/02/05(Fri) 10:07 !email! No.703 !ico_edit!
Re: SSR 燃えました
> これで、ブザーが鳴りましました。
> でも、OFFの後も、少々なる が上手くできません。
> どの様にしたらよいでしょうか??

言葉で動作を説明出来るようになるのが重要です。
より細かく動作を説明してください。
次に、マイコンの動作として説明してください。
つまり、「エンドミルがタッチプローブに接触したら」→「入力ピンがLになったら」です。
それが出来るようになったら、次にその動作がプログラムでどう配置すれば実現できるか
考えてください。

例、
入力ピンIN---プルアップ、出力ピンOUT---アイドルロー、遅延時間set_time(0.01ms単位16ビット)、0.01msタイマーtimer(16ビット)
<メイン関数>
・入力ピンがLにだったら出力ピンをHにしてタイマーリセット if(IN==0){OUT=1; timer=0;}
・チャタリング対策はしないで、最初の接触で動作させる。(何もしない)
・入力ピンがHだったら、タイマーを見て想定時間以上経っていたら出力L if(IN==1&&timer>set_time)OUT=0;

<タイマー割り込み>
16ビットで0.01msタイマーを作る。→4Mhz(1Mサイクル)で64分周だと156.25サイクルで0.01ms→99にセット
タイマーは50000で停止させるif(timer<50000)timer++;

※タイマーは両関数で扱うのでグローバル変数にする

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 

//周波数等は16F627Aに合わせています。取り合えす、接触が終わった後2秒後に止まります。
#include <xc.h>

// *** CONFIG 略  ***

#define set_time 200 //遅延設定時間
#define IN RA0
#define OUT RA1
unsigned int timer;

void interrupt InterSyori( void ){
if(TMR0IF==1){
TMR0=99; //0.01msごとに割り込み
TMR0IF=0;
if(timer<50000)timer++;
}
}

void main(void){


OSCF=1;//内蔵発振器 4MHz使用に設定
CMCON = 0x07;// 1,2,17,18端子を入出力端子に設定
/* *********************************
TRISA =
TRISB =
*********************************** */

OPTION_REG=0b00000101; //プリスケラを64
TMR0=99; //TMR0カウンターを99にする→0.01msごとに割り込み
TMR0IF=0;
TMR0IE=1; //TMR0割り込み許可
GIE=1; //全体割り込み許可

while(1){
if(IN==0){
OUT=1;
timer=0;
}else if(timer>set_time)OUT=0;
}
}
猛牛ロック   2016/02/05(Fri) 12:44 !email! No.704 !ico_edit!
Re: SSR 燃えました
maboさん、早々のレスに感謝申し上げます。
早速,ビルトしましたが、残念ながら、エラーです。
自分には見ても分かりませんでした。
ご確認して下さい。


それから、
猛牛ロックさん
本日、ブロワを手動で動作確認をしました。
サイコーです!!(^^♪
本当に素晴らしいですよ。
赤枠のLEDは、間欠と同期しています。
これで、モニターもできます。
今後は、掃除機のノズルをML4本体に取り付けたいと思います。

そうそう、明日、秋月のSSRが来ますので、
MACHからの、信号での動作確認もできると思います。
本当に有難うございます。

ブザー用のプログラムは、確認しますね。
TR   2016/02/05(Fri) 20:41 !email! No.705 !ico_edit!
Re: SSR 燃えました
猛牛ロックさんへ

RA0が入力端子で、
RA1が出力端子ですか?
TR   2016/02/05(Fri) 22:21 !email! No.706 !ico_edit!
Re: SSR 燃えました
TRさん、すみませんでした。コンパイラー通していませんでした。

一番最初のコメントアウトの部分が抜けてました。あと、最後の「{」等の整合性がありませんでした。

コンパイル通ってるの、アップしておきます。参考程度にしてください。

MACHへの信号は、いれていません。キットで遊ぼうのLEDで動作、たしかめてみてください。
mabo   2016/02/05(Fri) 22:56 !email! No.707 !ico_edit!
Re: SSR 燃えました
maboさん、レス有難う。

void interrupt InterSyori( void ){//TMR0の割り込み処理
InterSyoriはどういった意味があるのでしょうか?


!!! 追記
思い出しました。
void interrupt 関数名(void){
if(フラグ==1){ 処理 }

これだ
関数の使い方は、多種多様です(参った〜




以下訂正
maboさんへ

>要は、ブザーが「On→Off」の時だけ、ちょと間を置いてブザーを切ればいいので、
ブザーが鳴っていたというフラグを作って判定すればいいと思います。
割り込みの方で、ブザーのOn、Offしてもいいのですが、
割り込みにWait()を入れると、割り込みを使う意味がなくなってしまうので、
main()の方で処理すればいいと思います。


よく見ると 下が追加されています。
これが、「ブザーが「On→Off」の時だけ、ちょと間を置いてブザーを切ればいい」
ということですか?

if(Start==0){
if(Buzer==On){
Second(KanketuTime);
RA2=Off;
Buzer=Off;
しかし、音が鳴りません。
RA2は点灯したままです。
TR   2016/02/06(Sat) 06:07 !email! No.708 !ico_edit!
Re: SSR 燃えました
> RA0が入力端子で、
> RA1が出力端子ですか?

defineの部分を実際の端子に変えてください。INが入力端子、OUTが出力端子です。
無記入にしてもよかったのですが、一応、RA0とRA1を書いただけです。
想定しているのは、ツールセッターの接触(入力)→ブザー(出力)です。
それ以前に、マイコンは16F627Aにするのですか?
この程度の事なら、8ピンの方が場所も取らなくて良いですよ。
勿論、627Aでもサイズと価格以外で問題になる点はありませんけど。

今回の場合は
0.01s毎にカウントアップするタイマーを作って、
入力があれば、出力オン&タイマーリセット0
入力が無くて、タイマーが設定値を超えていれば出力オフ

という簡単なものなのでどちらかというとプログラムよりも設定部のほうが大事です。
周波数設定、I/Oピン設定、タイマー割り込みの使い方などです。
もっとも、私もconfig辺りはコピーして、確認もしないで使いだしています。


※私の好みだと接触したら「短時間」鳴らす、というものです。接触中ずっと鳴らすのは嫌です。
 でも一瞬でも触れた場合は、一瞬ではなく、同じ「短時間」鳴って欲しい。という動作です。

動作をまとめると、
接触したらブザーを一定時間鳴らす
鳴っている時間中に離着があっても無視し、鳴り終わってから離れたらリセット(鳴らす準備)
となります。

プログラムだとメインのループ部は下記の様な感じでしょうか。
while(1){
if(IN==0&&timer==50000){
timer=0;
OUT=1;
}
if(timer==set_time){
timer=60000;
OUT=0;
}
if(IN==1&&timer==60000) timer=49998; //リセット時のチャタリング対策
}
猛牛ロック   2016/02/06(Sat) 06:23 !email! No.709 !ico_edit!
Re: SSR 燃えました
猛牛ロックさん おはようございます。

>それ以前に、マイコンは16F627Aにするのですか?
そうです。

while(1){以下を 709に入れ替えたら、エラーです。
元(704)は、ビルとできますが、
RA0をONとしても、ブザーに見立てたRA2のLEDは点滅しません。
TR   2016/02/06(Sat) 06:50 !email! No.710 !ico_edit!
Re: SSR 燃えました
> 元(704)は、ビルとできますが、
> RA0をONとしても、ブザーに見立てたRA2のLEDは点滅しません。

そのままでは駄目ですよ。ちゃんとマイコンに合わせてI/Oを設定してください。
また、必要に応じて、プルアップ、若しくはプルダウンさせないと駄目です。
627Aなら、Bポートに内部プルアップ抵抗があるので
入力RB0、出力RA0にしました。内部プルアップなので0V入力でオンです

<追記>
709は1字全角空白が入っていました
「if(IN==1&&timer==60000) timer=49998; //リセット時のチャタリング対策」
猛牛ロック   2016/02/06(Sat) 07:48 !email! No.711 !ico_edit!
Re: SSR 燃えました
>そのままでは駄目ですよ。ちゃんとマイコンに合わせてI/Oを設定してください。
今回の提案には、I/Oは、記載されていないのですか?

間欠の時に、下記のようにしましたが、このことですか?

// 入出力設定
TRISA = 0b01100011;//RA0、1はセレクタ、RA6はMACH入力、RA2は掃除機出力、RA3はブロワ,RA7は発光LED
TRISB = 0b11111111;//RBは入力。ロータリースイッチ2個 1=入力 0=出力
TR   2016/02/06(Sat) 08:33 !email! No.712 !ico_edit!
Re: SSR 燃えました
それもそうです。それ以外も使うマイコン+使うピンに合わせる設定です。

> 今回の提案には、I/Oは、記載されていないのですか?

前回はわざと消えるように&目立つようにしておきました(/* ************* */)
間欠の時とは使うピンや方法が異なります。毎回、使うピンや方法に合わせて書き換えます。
場合によってはCONFIG部も書き換えます。
711に627A+入力RB0(内部プルアップ)、出力RA0にしたものを置いておきました。
※627AはBポートにしか?プルアップ抵抗が付いていません

709の全角スペースは直しておきましたけど、その位の修正は出来るようになってください。
猛牛ロック   2016/02/06(Sat) 08:55 !email! No.713 !ico_edit!
タッチプローブ改善 投稿者:TR 投稿日:2016/01/30(Sat) 21:54 No.675

maboさん、こんばんは。
以前、教えていただいた、タッチプローブですが、
SECさんから言われた点があります。
それは、SECさんの場合、
確認用の発光LEDの他にも、
音でも確認できるようにしているとのことでした。

今回、PICを初めて、PICなら、出来ると思い始めました。
方法論としては、
外部割込みでしょうかね〜。
でも、MACHに組み込んである、プログラムを改良するのが、
難しそうですね(苦笑

Re: タッチプローブ改善
TRさん、おはようござます。

タッチプローブに音とLEDですか・・・。MACHの方は、改良しなくても、そのままで、いけると思いますよ。

他の動作がないので、外部割り込み使わなくても、可能だと思います。
音、だと、圧電ブザー等でしょうかね。
http://akizukidenshi.com/catalog/g/gP-03958/
これあたりだと、発振回路内蔵なので、PICからの電源ON・OFFだけで、制御できそうですね。
5Vで5mA程度ですから、抵抗介して、直接ドライブできそうかなと思います。
発信回路内蔵タイプでないと、教科書のように、発信のプログラムも必要でしょうけど、これだと、ON・OFFだけかな。

多分、if( ){ }文だけで、大丈夫だと思いますよ。

 タッチプローブが接触→ブザ−ON
            LED−ON
            MACH−ON(OFF)


おもちゃは、お手本の回路がありましたので、それ、まねしました。

 http://www.piclist.com/images/www/hobby_elec/pic6_21.htm

74HC154が製造中止だったので、代わりに、

 http://www.geocities.jp/team_zero_three/TD4/#replacing_74hc154

を参考に、74LS138を2個×2で都合4個使いました。
mabo   2016/01/31(Sun) 09:59 !email! No.678 !ico_edit!
Re: タッチプローブ改善
>TRさん

私なら、(可能なら)直接ブザーを鳴らして、PICには通さないと思います。
それは、直接なら接触抵抗の具合で「鳴り」が変化するので接触具合がより確認できるからです。
また、PIC動作の確認にもなります。


> maboさん

配線はやっぱり大変だったでしょ?4枚ですからねー
私の「とりあえずブレットボード」配線じゃなくてきっちりされていますね。
動画拝見しました。

多分、予定動作としては
順次1つずつ点灯させていき、最左のマトリクス(M4)の一番左下になったら、最右のマトリクス(M1)の右上から
順次点灯させていく、というものだと思います。

となると
・M4→M1の受け渡し時にM4用のLS138をdisable出来ていない
・M2→M3の受け渡しが出来ていない(M2はdisableされているがM3がenableされていない)
の2点ですね。
逆に言えば、M1→M2は全て上手く処理されている、とも言えます。

両者とも配線の可能性もプログラムの可能性もありますね。
私の失敗(リセット端子やOD端子)も考慮にいれてくださいね。
勿論、破損の可能性もありますけど。

使ったICは74LS138だったんですか。私は専ら「HC」の方を購入することにしています。
138はTRさんの例の学習キットで初めて知りました。
買い物のついでに4つほど入手しました。また、ついでに2色モノhttp://akizukidenshi.com/catalog/g/gI-09878/
も一つ手元にあります。でも前回の配線の面倒さを思い出すと手を付ける気が起きていません(;'∀')
因みに、PICも数種買い求めました。(これで多少の実証もできます)
猛牛ロック   2016/01/31(Sun) 15:59 !email! No.679 !ico_edit!
Re: タッチプローブ改善
maboさん、猛牛ロックさん、レス有難うございます・

電子部サーのご紹介有難うございます。DC5Vで5mA!
これなら、OKですよね?
現在は、SEC基板の出力端子をフォトカプラーで受けて、DC5V〜発光LED〜エンドミル〜プリセッター〜GND
の流れです。
発光LEDと並列に組んでみようかと思います。

moboさん、PIC、なんて無茶ぶりして済みませんでした。


写真は、操作盤の作り直しです。
文字は、掘り直しました。
アドバイスを頂いたので、綺麗に彫れたと思います。
有難うございます。
TR   2016/01/31(Sun) 18:12 !email! No.680 !ico_edit!
Re: タッチプローブ改善
回路の写真です
TR   2016/01/31(Sun) 20:55 !email! No.681 !ico_edit!
Re: タッチプローブ改善
TRさん、猛牛ロックさんこんばんは。

16F1937ですが、日本語のマニュアルがあるようです。

http://www.microchip.jp/docs/41364B_JP.pdf

これだと楽です。

猛牛ロックさん、いろいろありがとうございます。残念ながら、PIC破損です。
原因はVSSに通電させてしまったことです。
ICソケットに刺すときに、一つずらして刺しました。二つとも同じことやって、同じ状態です。
差し直すまでは、正常に動いていました。ちょっと、手直しするのに外して、再び刺すときのトラブルです(ちょっと涙)。

TRさん、やはりCNCの威力ですね。きれいな、仕上がりです。
私の工作は、本当に大人のおもちゃです。それでも、思った通りに動いたときは、うれしいです。
破損のPIC再注文です。お店によって値段段違いです。

   ○月 250円
   ○立 500円
   ○S 296円(最小出荷5個)
   ○ark 210円
    (http://park.jp/items/index?dm=efellows.jq&fid=0101000&icd=MICROCHIP_PIC16F1937_I_P&paid=0031&pid=0000&sk=16f1937

 それにしても、○立はたかい。
mabo   2016/01/31(Sun) 21:08 !email! No.682 !ico_edit!
Re: タッチプローブ改善
> TRさん

その回路でも動作はするような気はするのですが、あまりよくありません。
フォトカプラのLEDに流す電流=表示用LEDの電流+ブザーの電流
になります。LEDは半導体なのでそれと並列にブザーは抵抗値を調整し辛いと思います。
(そのままだと20V程度かかるのでうるさ過ぎるような気がしますし、フォトカプラのLED
は30mA??程度になるので良くないです)

単純に24V-抵抗(ボリューム)-ブザー-エンドミルで試してみる方が良いと思います。


> maboさん

> 差し直すまでは、正常に動いていました。
それなら、破損で間違いない所ですね。「点灯しない」だけならケーブルが抜けた可能性もありますけど
「消灯しない」はケーブル抜けはないですよね?

使ったのは16F1937ですか。○月は不思議と上位の16F1939の方が安いんですよね。
何か理由があるのでしょうか?単にメモリ等が増えているだけのような気がします。
(1939は1個購入しました)

PICはやはり○月が安いですね。ほぼ1択だと思っています。
因みにMISUMIでもほぼ全種扱っています。
1937が382円、1939が460円(税別)です。MISUMIでマイコンも買わないですね。

<追記>
○arkはE-Fellowsですね。 http://efellows.jp/
PICはかなり安めで売っています。16F1939も200円(税込)でした。
品揃えは秋月に遠く及びませんけど良い店のようです。
猛牛ロック   2016/01/31(Sun) 21:40 !email! No.683 !ico_edit!
Re: タッチプローブ改善
図のような感じでしょうか?
電源は、DC5Vにしました。
この場合、可変抵抗は、2KΩ位で宜しいでしょうか?
TR   2016/01/31(Sun) 22:44 !email! No.684 !ico_edit!
Re: タッチプローブ改善
> 電源は、DC5Vにしました。

5Vでも、5V-抵抗-ブザー-エンドミルです。
※本来は
5V-抵抗-フォトカプラ-エンドミル
5V-抵抗-LED-エンドミル
5V-抵抗-ブザー-エンドミル
として、1つずつ最適な抵抗値を付けるのがベターです。
猛牛ロック   2016/02/01(Mon) 00:18 !email! No.685 !ico_edit!
Re: タッチプローブ改善
並列にLEDとブザーを繋ぐのは、×?
TR   2016/02/01(Mon) 06:56 !email! No.686 !ico_edit!
Re: タッチプローブ改善
> 並列にLEDとブザーを繋ぐのは、×?

直列にフォトカプラが入っているのが良くない所です。
全部並列が一番いいです。
枝がわかれるのが良くない所です。
抵抗値(ボリューム)をいじると、フォトカプラの電流とLEDの電流も変化します。
一本(直列)でフォトカプラとLEDならまだ、両者の電流は同じなのでそれでも良いですけど
枝が分かれてブザーとLEDだとブザーの電流+LEDの電流がフォトカプラの電流になり、偏りが
生じます。また、そのようにボリュームをつけて抵抗値を変化させると全ての電圧が変化します。
今回の場合は、おおよそ、それでも動作しそうですけど、わざわざ、誤動作が起こるような回路に
すべきではないです。
音量調整のためのボリュームが電流値調整のためのボリュームになってしまいます。


<追記>

> 私なら、(可能なら)直接ブザーを鳴らして、PICには通さないと思います。
と書きました。その考えが変わった訳ではないのですけど、
例えば、「触れたら一定時間(1,2秒)鳴らして止める」とかならPICも良いかもしれません。
また、ADCが付いているもので電圧値に応じた動作をさせる、とか、あるいは手パがらみになりますけど、
「0.001o下げて通電をチェックして」の動作を高速に繰り返す動作のボタンを付ける、とか
まぁ、色々試してみるのもいいかと思っています。
猛牛ロック   2016/02/01(Mon) 09:36 !email! No.687 !ico_edit!
Re: タッチプローブ改善
猛牛ロックさん、
有難うございます。
お写真でやってみます。

maboさん、
電子ブザーのご紹介に感謝申し上げます。
TR   2016/02/01(Mon) 18:24 !email! No.689 !ico_edit!
Re: タッチプローブ改善
TRさん、猛牛ロックさんこんばんは。

猛牛ロックさん、16F1937にしたのは、特に理由はありませんでした。
一番最初に目にとまったのを頼みました。言われてみれば、16F1939の方が、安くて、メモリーも倍なんですね。失敗です。

TRさん、いろいろ改造ですね。あまり複雑じゃない方がいいかも。シンプルイズベスト、なんて、ね。
でも、細かい改良加えていって、使い勝手は、格段によくなるでしょうね。

明日、追加のPICがきますので、いよいよ、流れる?文字に挑戦です。
どんなにしようかな、なんて、考えています。
いろいろあさると、できあいのものもあるんですね。この辺は、さすが商売だと思います。

 http://www.ministudio.co.jp/Cgi-bin/Order-JP/DetailJp.asp?GoodsNum=204

漢字も処理してるようですが、漢字コードからドットへの変換は、どうしてるのかな、なんて、興味津々です。
mabo   2016/02/01(Mon) 21:20 !email! No.690 !ico_edit!
Re: タッチプローブ改善
TRさん、猛牛ロックさん、こんばんは。

流れるサインボードがいちおうできました。ちょっと不具合があるのですが、それらしく見えます。
ちょっと、動きがぎくしゃくしてますが。

ただ、アルゴリズム的には、どうなのかな、なんて思ってます。
それと、ダイナミック表示なので、LEDがちょっと暗くなります。

しばらく遊んでみようと思います。
mabo   2016/02/02(Tue) 22:38 !email! No.691 !ico_edit!
Re: タッチプローブ改善
maboさん、猛牛ロックさん、こんばんは。
やっと、操作盤が完成しました。
明日は、上手くいけば、実験できます。
もうワクワクで、興奮しています(笑
若し、成功したら、
タッチプローブも電磁ブザーの実験に入ろうかと思います。
想像すると、PICで、プローブが離れてからも、音が鳴った方がいいように思います。


それから、サインボードやりましたね!!
頭の良い人は羨ましいです。
これからやろうとする、プローブのプログラムを考えただけで、頭が痛くなりそうです(苦笑
TR   2016/02/03(Wed) 22:26 !email! No.692 !ico_edit!
続き 投稿者:mabo 投稿日:2016/01/29(Fri) 22:18 No.669

TRさん、猛牛ロックさん、こんばんは。

TRさん,ご質問の件ですが、猛牛ロックさんが、レスしてくれましたね。
補足すると、下記の部分ですが、別な言い方すると、
 
 記憶したPORTBとPORTBが異なる時→時間のロータリースイッに変化があった時

ということでしょうかね。

「||」とか「&&」とか条件判断でよく使いますね。


猛牛ロックさん、やっと、配線が終わりましたが、正しく配線できた自信はありません。
諸兄のようにきっちりとしたものにはできませんでした。
これだと、間違いも多いんですよね。
簡単にチェックのプログラム組んで、動かしてみます。
どうなることやら。

Re: 続き
下に、
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1180180856

「0を正常終了、
0以外を以上終了というプログラムが多いです。」
となっています。

また、無くてもいいとあります。

意味としては、処理を正常終了したということなんでしょうか?
TR   2016/01/29(Fri) 22:24 !email! No.670 !ico_edit!
Re: 続き
> 意味としては、処理を正常終了したということなんでしょうか?

数値に特別な意味はありません。単に状況を関連づけているだけです。
正常終了や異常終了は単なる識別するためのものですから5でも-20でも
何でも構いません。

> if((MODE!=(PORTA&0b11))||(MODE==3&&MACH_sig==0)||(PORTB_save!=PORTB)) return 1;

if(MODE!=(PORTA&0b11))return 0;
else if(MODE==3&&MACH_sig==0) return 8;
else if(PORTB_save!=PORTB) return -3;
にして、正常終了を関数の一番下に「return 123;」
にしても全く構わないです。その戻り値に応じたプログラムを書いていくだけです。

ただ、正常、異常を知らせるだけが戻り値ではありません。

例. 絶対値をもとめるプログラム
int abs(int num){
if(num<0)num=-1*num;
return num;
}

このように計算結果を返すようなものもあります。引数をファイル名のポインタにしてそのファイルの文字数を返したり
使い方は様々です。
猛牛ロック   2016/01/29(Fri) 23:57 !email! No.671 !ico_edit!
Re: 続き
猛牛ロックさん、maboさん、おはようございます。


猛牛ロックさんへ
レス有難うございます。


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
}
return 0;

2進数でセレクタスイッチを読み込んで、1の時は、returnを1とする。
ただし、
while(sec >0){  左によりループされているので、

return=1を受け、DousaTime=1となり
0.01s待たされて、
sec--のところで、1−1が行われる??

以上の、条件式による場合の待ち時間を作っておいて
更に、メインプログラムの中で

change=Second(DousaTime);
により、1が呼び出された場合、changeに1がとなり、
前途の待ち時間関数により、待つ訳ですか?

流れは、
待ち時間関数を作る



メイン関数に
セレクタが変わった場合、待ち時間関数を実行し、動作を滑らかにする??
ということでしょうか?

どうぞ、宜しくお願いします。
TR   2016/01/30(Sat) 08:14 !email! No.672 !ico_edit!
Re: 続き
> //セレクタスイッチが変更された場合とMACH制御でのオフ信号、間欠時間の変更があった場合はwhileから抜ける

このコメントは以前のままでした。後半部を「・・・変更があった場合は、戻り値1で関数終了」に直してください。

> 2進数でセレクタスイッチを読み込んで、1の時は、returnを1とする

違います。動作はコメントの通りです。それ以外の余計な解釈はありません。
「(MODE!=(PORTA&0b11))」は
MODE→メイン関数内のループで読み取っていたコードスイッチの値
PORTA&0b11→現在のコードスイッチの値を読み取る
です。そして、「!=」は、前項と後項異なっていれば1を返し、同じなら0を返します
つまり、その部分をまとめるとコメントの通り「セレクタスイッチが変更された場合」になります

> ただし、
> while(sec >0){  左によりループされているので、

この辺が全く違います。以前ここで使った「break」ではループを終了なのでもうこのwhileには戻ってきません。
while文の次に飛びます。しかし、while文の次でSecond関数は終わりなので関数も終わります。
今回のreturn文だと直接その関数を終わらせます。

> change=Second(DousaTime);
メイン関数内で上記の形でsecond関数を呼び出しました。
この「=」の意味は右辺の数値を左辺へ代入しろと言う事です。
つまり、「変数changeに、(DousaTimeを引数にした)Second関数の戻り値を代入しろ」です。
別の見方をすれば、second関数(戻り値のある関数)は戻り値を得るために実行されています。
second関数内で「return 1;」が出てきたら1を持ち帰り、処理は次の行の
> if(change==0){
に移ります
猛牛ロック   2016/01/30(Sat) 13:03 !email! No.673 !ico_edit!
Re: 続き
猛牛ロックさん レス有難うございます。
関数も、戻り値の有無により、随分と違うものだと分かりました。
と言っても、自分ではプログラムは組めません。

近日中に、アルミ板なども来ますので、基板を実機組み込めます。
やってみます。



話違って、写真を見て下さい。
以前、サーボアンプが壊れたかと、勘違いした原因が、分かりました。
圧着端子の抜けでした(笑
原因が分かって良かったです。


それと、手パの誤作動ですが、基板をアルミケースに入れれば問題ないのですが、
セラミックコンデンサとフェライトコアを噛ませたら、誤作動を起こさなくなりました。
ただ、セラミックコンデンサだけでは、誤作動を起こしました。
これも、ノイズ対策を向上できて嬉しかったです(^^♪


追伸
電磁接触器のサージですが、現在は、操作コイルに設置しています。
カタログを見ていたら、気が付きました。
電磁接触器には、本回路側にもサージキラー対策品が売っていました。
知らなかったです。
商品を注文したところです。
着たら、早速付けてみます。ノイズとの戦いです(苦笑
TR   2016/01/30(Sat) 21:29 !email! No.674 !ico_edit!
Re: 続き
TRさん、こんばんは。猛牛ロックさん、こんばんは。

プログラムの解説は、猛牛ロックさんの方が、確かですね。
私も、だいたい理解はできますが、細かい所になると、不正確です。

私は、2,3日書けて、おもちゃ作ってました。配線が結構大変でした。
テストプログラム走らせて、配線等の間違い直して、やっと、目的の、と思ったら、PICを破損してしまいました。

動画は、破損したPICの動きです。正常なら、LEDが一つずつ、上から下に行って、右からひだりへと移動します。
大丈夫だろうとたかをくくっていたら、2個もPIC破損です。

TRさんも、いろいろですね。電磁波は、経験ないのですが、やっかいなんでしょうね。
少しずつ改善して、使い勝手よくなるでしょうね。
mabo   2016/01/30(Sat) 22:46 !email! No.676 !ico_edit!
Re: 続き
maboさん、おはようございます。
凄いのを作りましたね!!
流石に熟練者です。

maboさんの解説は助かりますよ。
凄く分かりやすいです。
これからも宜しくアドバイスをお願いします。
TR   2016/01/31(Sun) 06:33 !email! No.677 !ico_edit!
使い勝手 投稿者: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!
Page: | 1 | 2 | 3 | 4 | 5 | 6 |

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