049661
48時間以内の記事は New Mark で表示されます
制御分について
皆さんこんばんは。

maboさん、以前、
セレクターSWを使って、3軸の選択や、1/10mm、1/100mmの選択をできるプログラムを頂きまして、
感謝申し上げます。
当時の頂いたプログラムは、抜粋ですが、以下の通りです。

プログラムを眺めていて思った点があります。
IF文の条件式についてです。

条件式を判断した結果を真偽値というのだそうです。
答えは、1か0のどちらかで、1が真、0が偽だそうです。

そう思って、プログラムを見ると、
maboさんのプログラムは、
if (条件式1) {
処理1
} else if (条件式2) {
これが使われています。

セレクターSWの場合、ここまで、複雑にしなくてもいいと思うのですがいかがでしょうか?

1か0だけであれば、
もっと単純に
if (条件式) {
条件が成立するときの処理A
} else {
条件が成立しないときの処理B
}
このような感じでもいいと思うのですが、如何でしょうか?
ご気分を悪くしないでください。
自分のレベルを上げたい一心です。
宜しくお願いします。


当時、いただいたプログラムは今も大活躍をしています。

// メイン関数
void main (void){

// 1,2,17,18端子を入出力端子に設定
CMCON = 0x07;

// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;

// 入出力設定
TRISA = 0b11111111;//全部入力
TRISB = 0b10000000;//全部出力

//int 型の sw という変数を宣言
int sw0;
int sw1;
int sw2;
int sw3;
int sw4;
int sw5;
int sw6;

// 永久ループ
while(1){
//RA0*****************************
if(RA0 == 0){
WaitTime (500);// 待ち時間関数の呼び出
if(RA0 == 0){//もう一度確認する。
//PORTB=0x00;
RB0 = 1;// LED1点灯
sw0=1;//スイッチがおされた
}
}
else {
WaitTime (500);// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
if(sw0==1 && RB0==1){
RB0 = 0;// LED1消灯
sw0=0;
}
}
以下、上記と同じようにRA1、PR2〜 ず〜っと、制御文が並んでいます。
TR 2018/12/20(Thu) 20:13 No.1352  記事編集
Re: 制御分について
TRさん,こんばんは。

>セレクターSWの場合、ここまで、複雑にしなくてもいいと思うのですがいかがでしょうか?

なぜそんなプログラムにしたのか,忘れている部分もあるのですが,

while(1)のなかで,条件判断と処理をしてますので,

同じ処理を2回しないためとチャタリング対策のためかな,

と思い出してます。



elseのなかで,

if(sw0==1 && RB0==1){
RB0 = 0;// LED1消灯
sw0=0;

としているのは,スイッチが押されてない時に,

何回もLEDを消す動作をするのを避けるためだと思います。

LEDを消す動作は,LEDがONの時だけすればいいので,

こんな表現したのかもしれませせん。

ただ,else のなかでの処理ですので,

if(sw0==1 && RB0==1)

じゃなくて,

if(RB0==1)

でも,十分だったかもですね。

私のなかでは,電灯を消すのに,消えているにもかかわらず,

何回もOFFのスイッチを押すのが,好みでないようです。

多分,結果的には,あまり変わらないと思います。


それと,私の思考が堅いせいなのか,

考えられる条件の組み合わせを,

列挙しないと気が済まないようなところがあります。

そのくせ,肝心のところが抜けたりで,苦労するのですが・・・・・・(笑)。



ただ,TRさんのおっしゃるように,あまりいいプログラムでは,ないですね。

猛牛ロックさんにも多分,ご指摘受けたと思いますけど,

WaitTime (500);を使ってチャタリングを防止しようとしてますので,

その間,何もできないことになります。

割り込み等を使って,判断した方がよかったかもしれませんね。
mabo   2018/12/20(Thu) 23:55 No.1353 記事編集
Re: 制御分について
> そう思って、プログラムを見ると、
> maboさんのプログラムは、
> if (条件式1) {
> 処理1
> } else if (条件式2) {
> これが使われています。

どう見ても、使われていないのですけど、後半部のプログラムは、TRさんが変更した後のものでしょうか?


> セレクターSWの場合、ここまで、複雑にしなくてもいいと思うのですがいかがでしょうか?
>
> 1か0だけであれば、
> もっと単純に
> if (条件式) {
> 条件が成立するときの処理A
> } else {
> 条件が成立しないときの処理B
> }。

セレクタスイッチならば駄目です。

if(1番がONなら)選択番号=1;
else if(2番がONなら)選択番号=2;
else if(3番がONなら)選択番号=3;
else if(4番がONなら)選択番号=4;

のような処理になります。条件式は真か偽で判断されますけど、行いたい事が2択で判断できるわけではありません。
勿論、「スイッチが押されたら」の逆は「スイッチが押されていない」なので、そういった「それ以外」という判断で充分なら
「else」のみになります。


で、このプログラムの内容的には、ポートAがSW、ポートBがLEDで、押されている時は〜、というプログラムですね。
となると、基本的にはチャタリング対策は不要です。
一番シンプルなのが

while(1){
PORTB=(PORTB&0x80)|(~PORTA&0x7F);
__delay_ms(1);//無くても良い
}

です。処理的には一番早く、合理的です。ただし、慣れていないと使いにくいです。
なので、

while(1){
RB0=!RA0;
RB1=!RA1;
RB2=!RA2;
RB3=!RA3;
RB4=!RA4;
RB5=!RA5;
RB6=!RA6;
}

と並べた方が良いかもしれません。
ただし、LATレジスタを使わないと誤動作するかもしれません。
猛牛ロック   2018/12/21(Fri) 12:41 No.1354 記事編集
Re: 制御分について
原文の方、失礼をしました。

変えようとしている途中のものでした。

正しくは以下の通りです。

// 永久ループ
while(1){
//RA0*****************************
if(RA0 == 0){
WaitTime (500);// 待ち時間関数の呼び出
if(RA0 == 0){//もう一度確認する。
//PORTB=0x00;
RB0 = 1;// LED1点灯
sw0=1;//スイッチがおされた
}
}
else {
WaitTime (500);// 待ち時間関数の呼び出し(約10m秒:チャタリング対策)
if(sw0==1 && RB0==1){
RB0 = 0;// LED1消灯
sw0=0;
}
}



猛牛ロックさんの変えたプログラムですが、
過日、教えて下さったですね。思い出しました。

Bを反転しAに代入する意味でした。
これはいいですね!
でもよく見ると、似た記号がありますね。
比較演算子
A!=B
AとBは等しくない。

猛牛ロックさんのプログラムを記録しておいて、現行プログラム済みPIC16F627Aの不慮の出来事に備えたいと思います。

実は、なんで、こういった事をしていたかというと、
1/100mmのモニター用LEDが点灯しなくなりました。
で、基盤を見たんですよ、勿論、プログラム済みPICも動作を確認しました。
ま〜、原因は、断線でした。
でも、自作して正解でしたと、つくづく思いました。
既製品でしたら、自分レベルでは、買い替えです。
でも、自作なので、原因を調べられますからね。


写真は、実機に使用中のセレクターSWです。


追記
16F88の場合、LATAだと、エラーを起こします。
ANS0という記載ならOKですが、如何でしょうか?

TR   2018/12/21(Fri) 18:44 No.1355 記事編集
Re: 制御分について
88はLATレジスタがなさそうですね。
TR   2018/12/21(Fri) 21:30 No.1356 記事編集
Re: 制御分について
TRさん,猛牛ロックさん,こんばんは。

猛牛ロックさん,相変わらず,適切なアドバイスありがとうございます。

TRさん,16F88は,LATレジスタないと思います。

ですので,もしエラーになるようなら,間にアセンブラで,

nopをいれてやればいいようです。

 asm("nop");→何もしない休みの時間です。

間に,

 __delay_ms(1);

でもいいかもですね。




それと以前ポートをそれぞれに操作して,

思った結果がでないことがありました。

 RA0=1;

はまともにうごかなくて,

 PORTA=0b00000001;

のように書いたらまともに動いたことがあります。
mabo   2018/12/21(Fri) 23:33 No.1357 記事編集
Re: 制御分について
maboさん、猛牛ロックさんこんばんは。

>__delay_ms(1);


気持ちって感じなんでしょうか?


で、素人考えですが、
セレクタSWの場合、チャタリング対策不要ということ。

88に、デジタル用出力として、LATレジスタがないとしたら、
RB6とかしてもいいんじゃないかと思います。
それだけ、88の動作速度が、最新型にあるLATレジスタを必要とするほど、早くないっていうことだと推測します。

ネット検索してもまだ、はっきりとはしません。
TR   2018/12/22(Sat) 18:30 No.1358 記事編集
Re: 制御分について
TRさん,猛牛ロックさんこんばんは。

私もよく分からないところあるのですが,

要は,レジスターの連続した操作をした場合,不具合が起きる可能性がある,ということだと思います。

>RB6とかしてもいいんじゃないかと思います。

16F88の場合,LATレジスタありませんので,今までのレジスタを使うことになりますけど,

while(1){
RB0=!RA0;
RB1=!RA1;
RB2=!RA2;
RB3=!RA3;
RB4=!RA4;
RB5=!RA5;
RB6=!RA6;
}

のように,連続して,レジスタを使うとだめな場合がある,
ということだと思います。

内部クロック等を使用の場合は,影響は,少ないかもしれませんが,

外部クロック等を使って,クロックをあげるとその可能性大だと思います。

その際は,

while(1){
RB0=!RA0;
asm("nop");(4MHzの場合1μs)
RB1=!RA1;
asm("nop");
RB2=!RA2;
asm("nop");
RB3=!RA3;
asm("nop");
RB4=!RA4;
asm("nop");
RB5=!RA5;
asm("nop");
RB6=!RA6;
}

のようにしただけで,うまくいったということ経験してます。

asm("nop");

は,ワンクロック待つということですの,

(これ正確には間違いですね。NOPは何もしないという命令ですので。)******追記

 __delay_ms(1);

より遙かに短い時間です。
mabo   2018/12/22(Sat) 22:56 No.1359 記事編集
Re: 制御分について
> セレクタSWの場合、チャタリング対策不要ということ

いえいえ、セレクタSW自体にはチャタリング以外に、ショーティング/ノーショーティングタイプの問題もありますから
難しいです。
但し、「ボタンを押している間は〜」という理屈も成り立ちます。

LEDレベルの切り替えなら、ノイズによる誤動作も気づかないうちに通り過ぎて元に戻りますから対策は不要です。
けれども、そのセレクタスイッチが大きなシステムの変更ならば、ちゃんと対策すべきです。


> 88の動作速度が、最新型にあるLATレジスタを必要とするほど、早くないっていうことだと推測します。

どの位の速度から誤動作をするのかは判りませんけど、どのデバイスでも遅く動かせば問題は発生しません。
また、LATレジスタが存在しないデバイスでもその問題は起こり得ます。

最近の電子工作も、それなりの能力が無いとデバイスを制御出来ません。
例えば、最近人気のマイコン入りLED(ネオピクセル)WS2812B等の制御はF88あたりでは無理です。
F1827でもかなりきついと思います(でも、最適な値を見つければ多分動く)。UNOやPIC18(16MIPS)でなんとか(勘でプログラムすれば動く)、というレベルだと思います。
勿論、F88やF1827でも大多数のものは制御可能ですけど、時代が進むにつれ、周辺デバイスも変化していきますから、
だんだんと扱えないものの割合も増えることになります。

> __delay_ms(1);

__delay_us(1)で充分でしょうね。
前述のLEDは下の感じの制御になります。
この範囲に制御するのはある程度、速度のあるマイコンじゃなくては無理です。
そして、__deley_us(1)なんてしていたら、全く制御出来ません。
何クロック休むか(asm("nop"))、です。
(でも、実際には分岐命令が入りこみますから、そこが難しい所なのです)

T0H 0 code ,high voltage time 0.4us ±150ns
T1H 1 code ,high voltage time 0.8us ±150ns
T0L 0 code , low voltage time 0.85us ±150ns
T1L 1 code ,low voltage time 0.45us ±150ns
(WS2812のデータシートより)
猛牛ロック   2018/12/23(Sun) 02:29 No.1360 記事編集
Re: 制御分について
皆さんおはようございます。

>asm("nop");

この意味を調べて分かりました。
使い方は、ICの応答待ちというのが狙いなんですね。
ワンクロック待ちというというので、飽くまでも、決まった時間を待つのかと思っていましたが、
ICの動作を待つという意味だったんですね。

>、「ノンショーティングタイプ」
すっかりと忘れていた言葉です。(笑

調べて思い出しました。
maboさんが以前に言っていたと思い出しました。


追記
早速 OSCCONレジスタも弄って4MHZに設定しました。
TR   2018/12/23(Sun) 07:35 No.1361 記事編集
Re: 制御分について
> ICの動作を待つという意味だったんですね。

いいえ、違います。16Fなら1サイクル=4クロック消費します。
単に何もするな、という命令です。
表には出なくても、よく使われる命令です。
__delay_ms()や__delay_us()はこのnop命令を指定時間行います。
で、何回すれば、その指定時間かはコンパイラが解らないので、F_CPUや_XTAL_FREQなど、
どの位の駆動クロックかを記述しないとdelay命令が出来ません。


ICの動作を待つ、ということではありません。
猛牛ロック   2018/12/23(Sun) 10:20 No.1362 記事編集
ファイルの追加方法
皆さんおはようございます。
これも皆様にとっては今更なのかも。

MPLAB IDEの操作方法で、
mainファイルを作り、追加でファイルを増やす方法が、
やっと分かりました。 下のページの中頃にありました。
今までどうしていたかというと、
テキストファイルに保存したファイルを、
MPLAB IDEのエディタにコピペしていました。

http://www.picfun.com/mplabx/mpxlab01.html
TR 2018/12/19(Wed) 10:27 No.1351  記事編集
疑似手パ
折角、CNC用PCが新しく?なったんで、これを機に疑似手パを作ってみます。

一応、画像のような構想です。
大体、この位あれば原点だしはその場で出来ると思うのですけど。

ただ困ったことに、当初考えていたArduino pro microだとピンが足りません。
(元々はMEGA8あたりで、V-USBをつかってフォルムさん形式で行おうと思っていたのですけど、
ボタンが増えたのと、Arduinoの方が簡単そうなので、変更しました)
本来はもっと沢山端子があるはずですけど、引き出されたGPIOは18ピン程度のようです。

アナログ入力を使えば、(同時押しの可能性の無い)真ん中の9つのボタン等は1ピンで済むのですけど、
あまり使いたくない気がするんですよね。stopボタンがあるし。
それとも、シフトレジスタを使うか…

などと、悩んでいた所、ふと机の中に眠っていたSTM32F103ボードを思い出しました。
https://www.aliexpress.com/item//32656048071.html
結構な高性能、多ピンなのに、価格は200円程度という、コスパMAXの商品です。
※そもそも国内ではチップ単体で500円程度はするんですけど、どうやって利益を上げているのでしょう?

調べてみると、これでも簡単にHIDキーボードが作れるようです。

猛牛ロック 2018/12/16(Sun) 14:06 No.1345  記事編集
Re: 疑似手パ
何か凄そうなのができそうですね!
色々と詳しく教えてください。

自分は、何度も復習しています。
が、なかなか、進めません。
TR   2018/12/17(Mon) 08:38 No.1346 記事編集
Re: 疑似手パ
いやいや、結構チープなコントローラですよ。試作機みたいなものを考えています。
良く落とすので、軽くて落としても壊れにくいのが良いです。

部材も、エンコーダはおもちゃエンコーダhttp://www.aitendo.com/product/11408
POMで、ダイヤル部を付けようと思っています。周囲の○は今の所、穴では無く凹みです。

ケースもhttps://www.monotaro.com/p/1876/9214/を使おうと思っています。
L字フックを付けるだけで定位置が決まっていいかなぁ、なんて安易に考えています。

仕組みも簡単です。
・全ての動作を必要に応じてボタンを配置して、ホットキー(キーボード)で操作出来るようにする。
・コントローラから、押されたボタンに応じてそのキーを送る
というだけです。
なので、テストもキーボードで出来ます。
だけど、使い勝手は作ってみないと判りません。
特にエンコーダ部はMACHがどの位の速度でキーを読み取ってくれるのかは不明です。

Arduinoなら、スケッチも、

#include "Keyboard.h"
と、ライブラリをインクルードして、
Keyboard.begin();
と、初期設定して、後は
Keyboard.press(ctrlKey);
Keyboard.press('t');
delay(100);
Keyboard.releaseAll();
みたいにどのキーが、押されたか、又は離れたかを書いていきます。

今の所、STM32F103ボードを使う予定ですから多少手続きは違うでしょうけど、やり方は同じです。


>> 何度も復習しています
私は「復習」というのはしたことが無いです。
作りたいものがまずあって、それを作るのにどうするか?だけですね。
ちゃんと動けば終わりですし、今一つ納得しないまま、というのもあります。

どちらかというと、過去のプログラムは見たくないです。
(勿論、見返すことはありますよ。)
猛牛ロック   2018/12/17(Mon) 13:50 No.1347 記事編集
Re: 疑似手パ
猛牛ロックさん,TRさん,こんばんは。

猛牛ロックさん,新しい構想ですね。

是非,できあがり,教えてください。

>私は「復習」というのはしたことが無いです。

いいですねえ,私は,復習ではないのかもしれませんが,

ちょっと前のことを忘れてしまし,新しいもの作る時は,

またあれこれ調べ直すなんてこと何度もやってます。

年ですかね。

今年66才のもう,すっかり老人です。

気持ちだけは若いのですが・・・・・・。
mabo   2018/12/17(Mon) 20:58 No.1348 記事編集
Re: 疑似手パ
疑似手パですけど、基本的な構想はフォルムさんの手パと同じだと思っています。
つまり、実際には、パルスを送るのではなく、キーボード操作で処理しています。

エンコーダでCWで、10パルス(クリック)すれば、キーボードの「→」キー等を10回押されたように
PCに送ります。
なので、使用したい命令はホットキーとして、画面にボタンを配置します。
添付画像の紫線あたりがそれです。ボタンによって
・Gコード---G54やF100など
・VBS---X/2など
・OEMコード---CONT./STEPの切り替えなど
で、書かれていますけど、全てホットキーを登録します。

X+ →
X- ←
Y+ ↑
Y- ↓
Z+ PAGE UP
Z- PAGE DOWN
1 ALT+CTRL+K
0.1 ALT+CTRL+L
0.01 ALT+CTRL+;
0.001 ALT+CTRL+:
F500 ALT+CTRL+F
F100 ALT+CTRL+G
F20 ALT+CTRL+H
X/2 ALT+CTRL+A
Y/2 ALT+CTRL+S
Z/2 ALT+CTRL+D
ZERO X ALT+CTRL+B
ZERO Y ALT+CTRL+N
ZERO Z ALT+CTRL+M


のような感じに、自分で作ったものはALT+CTRL+○という形にしました。

MACH3(スクリーン)上の仕込みはこの位で良いと思います。

あとは疑似手パ(疑似キーボード)です。

プログラムの方は、入力が多いので面倒ではありますけど、複雑な処理でもないので、
2,3時間もあればβ版はできるでしょうけど、その前に基板(配線)ですね。

猛牛ロック   2018/12/18(Tue) 12:07 No.1349 記事編集
Re: 疑似手パ
猛牛ロックさん,こんばんは。TRさん,こんばんは。

猛牛ロックさん,構想の詳細のご紹介ありがとうございます。

ということは,PCとはUSB接続でしょうか。

ご紹介いただいたStm32f103c8t6 arm stm32には,

USBのインターフェースも搭載でしょうかね。

USBの部分のプログラムがやっかいのような気がしますが,

できたら,ご紹介くださいね。
mabo   2018/12/18(Tue) 22:38 No.1350 記事編集
CNC用PCが壊れる-続
TRさん,猛牛ロックさん,こんばんは。

猛牛ロックさん,新しく購入なさったPCいかがですが。

XPの再インストールなさったということですが,HDのリカバリー-領域からの,インストールですか。

それとも,XPのCD等からですか。

確かXPから,インストール中に,アックティべーションというか,認証が必要だったと思いますが,XPでまだできるのでしょうか。

再起動やら,不安定なのは,きっと,HDのクラッシュ等が原因でしょうかね。

きっと,システム領域の破損等が原因でしょうかね。プラス,
メーモリー等のハードの不具合でしょうかね。

インストールCDからとかのインストールなら,HDの交換等もかんがえられますけど,動けばいいけど,動かないと,無駄になりますからね。

私は,幸い,日常使ってるのはノートばっかりなので,今のところ心配ありません。
mabo 2018/12/11(Tue) 20:58 No.1328  記事編集
Re: CNC用PCが壊れる-続
今日新しいPC(といっても5,6年物ですけど)が届きました。
動きにもっさり感は全くなく、そこは気に入りました。

だけども、ウィンドウズアップデートは何故かエラー。
再起動させたつもりが、そのままシャットダウンしたりと、ちょっと不安も感じました。
ただ、基本的にオフラインで、CNC専用、24時間点けっぱなしにする予定です。
MACHの方は2,30分のコードを空中で試した見たのですが、取りあえず問題無さそうでした。

壊れたPCの方は原因は判っていません。
もう11年も使ったので、一部を直しても、直ぐに別の箇所おかしくなってくるだろう、という判断です。
実際、既にOSの再インストール(CDからです)やMACHの再インストール等でだいぶ時間を無駄にしてしまいました。
最初は数日はさくさく動いたのですが、突然フリーズ。それからはより頻繁にフリーズや再起動、etc。
猛牛ロック   2018/12/11(Tue) 22:24 No.1329 記事編集
Re: CNC用PCが壊れる-続
maboさんへ

新しいPCが届いて約1週間経過。
古いPCから思ったら、早くて爽快です。
DELLのPCです。
安い方ですよ。
でも自分にはちょうどいいです。
気になるのが廃棄方法。
早速廃棄方法について質問メールを出しました。

古いマウスも動作が悪かったので、買い換えました。
DELLのPC相性がいいです。
なんと、びっくりしました。
マウスのメーカーは、 ナカバヤシ株
大昔、増えるアルバムってありましたよね。

サクサクしていい感じです。
気に入りました(^^♪



猛牛ロックさんへ

>CNC専用、24時間点けっぱなしにする予定です。

え〜!
猛牛ロックさんは、プロだったんですか?
仕事に使われるのですか?

TR   2018/12/12(Wed) 06:24 No.1330 記事編集
Re: CNC用PCが壊れる-続
猛牛ロックさん,TRさん,おはようございます。

猛牛ロックさんは,CNC用のPC24時間ですか。

以前,XPがOSの場合,運用しっぱなしにすると,ゴミ?がたまって,不具合が起こる,なんて,記事目にしたことあります。

本当かどうかは不明です。

そのせいかどうかは分かりませんが,以前の職場のPCは,専門の業者に一括してセットしてもらったものですが,

メイン?(サーバー機?)は,Redhat上で,VMWARE動かして,
VMWARE上でXP動かしてました。

なんで,こんなことしてたのかは素人の私には不明でしたが。


TRさん,新しいPCいいですね。

私は,マウスはもっぱらトラックボールです。これだとマウスパッドもいらないし,マウス自体を動かさなくていいので,

狭いところでも重宝してます。

https://www.yodobashi.com/product/100000001001809673/?gad1=&gad2=g&gad3=&gad4=56278881131&gad5=4952543099077816841&gad6=1o5&gclid=Cj0KCQiA3b3gBRDAARIsAL6D-N_ldoRY5d9RJ5zNEcxZIDJrRsLSsCaLqUEdJ8fzKb8mVstgQ9TdPCwaAkvuEALw_wcB&xfr=pla
mabo   2018/12/12(Wed) 09:19 No.1331 記事編集
Re: CNC用PCが壊れる-続
失敗報告です。

書き込み兼 テストボード作成に挑戦しましたが、
残念ながら、テストの方は、動作が不安定で使い物になりません。
ま〜、書き込みはできるので、捨てないで使います。

TR   2018/12/12(Wed) 12:04 No.1332 記事編集
Re: CNC用PCが壊れる-続
> 猛牛ロックさんは、プロだったんですか?
モノづくりはプロですけど、CNCや電子工作はそのレベルじゃないですね。
まぁ、仕事の一部です。
(CNCは、ロックヒルさんとフォルムさんのサイトを見て、我慢できずに始めました。
壊れたPCが初代ですから、11年前の事です。
マイコンは5年前からですね)


> XPがOSの場合,運用しっぱなしにすると,ゴミ?がたまって
これって埃の事じゃなくてメモリーの事ですよね?
WIN98までは定期的に再インストールでしたね。
XPも使っていると重くなって再起動はしたりしますよ。
電気屋が工事するから止めて帰る事もあります。

この間ネットにも繋がずにCNCの事位しか使っていないので、あまり変な事にはならないのだと思います。


> 残念ながら、テストの方は、動作が不安定で使い物になりません。
> ま〜、書き込みはできるので、捨てないで使います。

重要な事は、
・PGC、PGDにはプルダウン抵抗4.7kΩが付いている(PICKIT3の事です)
・PICKIT3は30mAしか電流供給能力が無い
といった事です。

書き込みが出来ているのなら、PICKITは抜いて、外部電源のみに切り替える、という手もあります。
動作が不安定の場合は回路の場合もありますけど、プログラムの場合もあります。
猛牛ロック   2018/12/12(Wed) 17:46 No.1333 記事編集
Re: CNC用PCが壊れる-続
みなさんこんばんは。

やはり、猛牛ロックさんは、その道の人でしたか、通りでお詳しいはずです。
ご自分の好きな道を進んでいるなんて凄いです。

自作のボードですが、今一歩です。
具体的には、
ほんとに不思議なのですが、
以下のプログラムで操作した場合、
目標の動作
@ SW RA5 ONでLED RA4が点灯
A 〃 RB0 ONで 〃 RA3が点灯
B 〃 RB1 ONで 〃 RA2が点灯
C 〃 RB2 ONで 〃 RB7が点灯
D 〃 RB3 ONで 〃 RA6が点灯
E 〃 RB4 ONで 〃 RA7が点灯
F 〃 RB5 ONで 〃 RA0が点灯
G 〃 RB6 ONで 〃 RA1が点灯

のはずなんですが、@ Aまではそれぞれ点灯するのですが、
Bから全てSWと連携しLEDが点灯しない!

でも、不思議と、G → @ 方向へは、SWと連携しLEDが点灯いていきます。


と思って、プログラムをよく見ると、}が抜けていました〜。
完璧に動作をしています。

入力側のRB6とRA5だけ除いて内部プルアップにしています。

ちなみに、SWはオルタネートです。
回路図をアップします。

※後から、写真を差し替えました。

どうゆうわけか、RB6だけは プルアップ抵抗を使わないとだめです。

追記
猛牛ロックさんPIC3のことを言っているね、そういえば!!
たぶんそう。



//自作 SW ONでLED常灯
/// PIC16F1827 Configuration Bit Settings
// 'C' source line config statements

// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ 4000000
// メイン関数

void main(void) {
// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;

// 入出力設定
TRISA = 0b00100000; //RA5のみ入力
TRISB = 0b01111111; //RB7のみ入力
ANSELA = 0x00; //すべてのピンをデジタルモードに設定
ANSELB = 0x00; //すべてのピンをデジタルモードに設定
OPTION_REG = 0;
// 永久ループ
while (1) {
// SWがONの場合
if (RA5 == 0) {
// LED1点灯
LATA4 = 1;
} else {
// LED消灯
LATA4 = 0;
}
if (RB0 == 0) {
LATA3 = 1;
} else {
LATA3 = 0;
}
if (RB1 == 0) {
LATA2 = 1;
} else {
LATA2 = 0;
}
if (RB2 == 0) {
LATB7 = 1;
} else {
LATB7 = 0;
}
if (RB3 == 0) {
LATA6 = 1;
} else {
LATA6 = 0;
}
if (RB4 == 0) {
LATA7 = 1;
} else {
LATA7 = 0;
}
if (RB5 == 0) {
LATA0 = 1;
} else {
LATA0 = 0;
}
if (RB6 == 0) {
LATA1 = 1;
} else {
LATA1 = 0;
}
}
}
TR   2018/12/12(Wed) 19:11 No.1335 記事編集
Re: CNC用PCが壊れる-続
PICKIT3の中でPGDとPGCは4.7kでプルダウンされています。
そうなると、外部プルアップの10kとPIC内の4.7kとで引っ張り合います。
で、内部プルアップを無効にしている場合は約1.6Vとなります。
で、PB6,PB7はTTLタイプの入力ですから、データシートでは0.8V以下ならLOW、2V以上ならHIGHです。
つまり、どちらの範囲にも入っていないので、どちらになるかは不明です。

内部プルアップを有効にすればより高い値になるので、2V以上になるのかもしれません。
「2V以上」でなくても、より、HIGHのラインに近づくのでHIGHと認識される割合は高くなるでしょうね。

で、問題なのは前半部の内部プルアップ無効時の「どちらになるかは不明です。」の状態です。
これはいわば、「PICKIT3による書き込み時」に当たる可能性があります。
可能性とは、PICKITが「HIGH出力と入力(プルダウンによるLOW)」で切り替えている場合です。
この場合はかなりきわどい、或いはアウトのような気がします。
なので、「HIGH出力とLOW出力」の切り替えで書き込んでいるような気がします。

取説でも、外部プルアップを付けては駄目と書いてあります。

猛牛ロック   2018/12/13(Thu) 01:37 No.1336 記事編集
Re: CNC用PCが壊れる-続
そうでしたか。
PIC端子の電圧を図ると、1.8Vくっらいだったかな〜。
低ったので、10kオームのプルアップをしたら、
安定して書き込めました。
No1335の回路図がそれです。
このまま行きます。
TR   2018/12/13(Thu) 07:42 No.1337 記事編集
Re: CNC用PCが壊れる-続
追記
1回路2接点のスイッチを使って直します。
書き込み時に外部プルアップ抵抗でプルさせる
スイッチオンの時は、スイッチの接点をPICからPICに切り替えます。
この方が、内部プルアップの面で他の入力端子と統一できます。
TR   2018/12/13(Thu) 10:03 No.1338 記事編集
Re: CNC用PCが壊れる-続
皆さんこんばんは。
お陰様で完成しました。

CLKとRB6へ繋がっているプルアップアップ抵抗は、MPLABの言うように
止めました。 写真の青で×をしたプルアップ抵抗です。

でも、その代わりに、2回路のSWを付けて、RB6をローにする為のSWとしての役割と、
RB6とPIC3のCLKへの導通の機能を分離してやりました。
これで、大丈夫と思います。

自作書き込みボードはこれで2個目です。
使い分けをします。
PORTA側とPORTB側を入れ替えるためです。
実際は、PICの方向を入れ替えて書き込めます。
TR   2018/12/13(Thu) 21:38 No.1339 記事編集
Re: CNC用PCが壊れる-続
その×印は、開放という事ですよね?
×だけだと、短絡なのか開放か判らないので消した方が良いです。

で、その回路だとRB6ピンは内部プルアップをしてもHIGHまではいかないと思います。
なので、プルダウンしているPICKIT3を外す必要があります。
それと、SWがオルタネイトですよね?やっぱりモーメンタリが良いと思いますよ。
MCLRに接続しているSWは、書き込み時には必ず開放して下さい。短絡して書き込もうとすると、PICKIT3に
損傷を与える危険性があります。※書き込み時には最初に高電圧をつくりだして、MCLRピンに流します。

書き込み時の基本(推奨)は、単に5本線を繋ぐだけです。
そして、あまり複雑にすると汎用性が無くなります。
実際にはLCD、7セグやセンサー、モーター等、様々なものが付きますから、そんなに決め打ちをしなくても良いかと思います。
でもまぁ、SWとLEDは基本ですから、ちょくちょく出番はあるかもしれません。

私も書き込みモジュールはありますけど、もっぱらブレッドボードです。
画像のように、SWとLEDだけは部品として作っています。
今まで、ほぼ外部電源も使ったことは無いですし、この手法で書き込めなかったことはありません。(回路として)
例え、書き込めないにしても、ちょっと引き抜くだけなので、大した苦でもありません。

SW-LEDモジュールは見ての通り、シンプルなものですけど、端子を後ろに纏めて、SW操作とLEDの確認をしやすくしています。
裏はホットボンドを付けて、安定して押せるようにしています。(まぁ、適当に付けていっただけですけど)
タクトスイッチはよくある4足では無く、2本の長足http://akizukidenshi.com/catalog/g/gP-08078/です。
(青)LEDはSMD抵抗の1kを付けています。そして、LEDとタクトスイッチの足だけで配線してあります。
一応、8連にしていますけど、1つのSW、あるいは1つのLEDが必要なときでもこれを使いますね。
結構重宝しますよ。

猛牛ロック   2018/12/14(Fri) 12:42 No.1340 記事編集
Re: CNC用PCが壊れる-続
ご披露して頂きましては、有り難うございます。

×は図面に記載した抵抗は止めました。
×を付けた理由はありますが、誤解してしまうとの事なので、今から、削除します。


RB6は1回路2接点を使い、書き込み時のみPic3と導通します。

Pic3のVPPですが、
書き込み時はRA5と切り放すのですか?


スイッチオンはなんとなく、今までの使い勝手から選びました。
ただ、端子を付けたので分岐してスイッチの種類は変えられます。LEDにも繋げられます。


書き込み時の電源取りは、ツールラボの記事をまねました。
電源取りは、外部やpic3からでもいいというものでした。

タクトスイッチの情報有り難うございます。
TR   2018/12/14(Fri) 15:31 No.1341 記事編集
Re: CNC用PCが壊れる-続
> Pic3のVPPですが、
> 書き込み時はRA5と切り放すのですか?
いいえ、そのSW位置だとどちらでもRA5とは短絡しています。
問題なのはGNDと短絡する事です。タクトスイッチなら、わざわざ押しながら書き込むことは無いでしょうけど、
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。

※私が以前言ったのは、切り離すためのDIPスイッチのようなものを付けて、
更に通常のタクトスイッチ、或いはLEDを付ければ間違いない、という意味です。

> 電源取りは、外部やpic3からでもいいというものでした。
はい。外部電源を使う方が安定すると思います。
ただし、等電圧以上の電源を使う必要があります。(USBの電圧を使うのが良いと思います)
例えば、4.5Vの電池を繋いでも4.5Vの電池には逆に充電されるように働くので注意してください。
(4.5V以下に下降して、初めて電池から電流が流れだします)
猛牛ロック   2018/12/14(Fri) 18:12 No.1342 記事編集
Re: CNC用PCが壊れる-続
>問題なのはGNDと短絡する事です。タクトスイッチなら、わざわざ押しながら書き込むことは無いでしょうけど、
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。

書き込む時、スライドスイッチにより、
RA5端子はGNDと絶縁し、VPPと導通しています。

これでいいわけですね。
TR   2018/12/14(Fri) 19:08 No.1343 記事編集
Re: CNC用PCが壊れる-続

今回、キットであそうぼうの書き込みボードが故障したのを契機として自作しました。
原因が分かりませんが、書き込めなくなりました。

自作書き込みテストボードのチョイ使用インプレをしたいと思います。

書き込み時の出力側LEDを見た感じ、
PIC3に繋がっているRB7とPIC3には繋がっていないRA4が、書き込み中にちかちかと点滅をしているので、
電流が漏れているんだと思います。
けれども、書き込み自体は、問題ないです。
それと、秋月から買った、ゼロプレッシャーICソケットのお陰で、抜き差しが楽です。
自分のように、プログラムが苦手な人にとって、PICの抜き差しが多くなります。
でもその煩わさが無くなって、ストレスが減りました。

その他
入力側にピンソケットを付けたので、ここから、分岐をしLED等にも配線できます。
今まで、やってきた中で、こうなったらいいな〜とかを具現化しました。
色々とご意見はあろうかと思いますが、今のところ気に入っています。



結果オーライ
・Pic3とつながっているRB7ですが、書き込み時に影響としてLEDがちかちか光る程度でよかったです。


やり過ぎと思った点
出力側に2列10Pピンソケットを跨いで、LEDと繋がっています。書き込めなくなるかもしれないと思ったからです。
でも、そういった事は有りませんでした。 従って、入力側と同じ1列ピンソケットでよかったと思います。


最後に、猛牛ロックさんに、色々とアドバイスを頂きまして有難うございました。
自分一人では此処まで出来ませんでした。


ボードの裏側は、恥ずかしいので、写真は有りません。(笑

TR   2018/12/15(Sat) 07:30 No.1344 記事編集
CNC用PCが壊れる
話題がかわりますけど、最近、ちょっと挙動が不安だったCNC用PCがとうとう壊れました(T_T)

WIN-XPの再インストール等してみましたけど、結局の所、不意にフリーズしたり、再起動したりで諦めました。
11年稼働していたので、まぁ寿命といえばそれまでです。

で、新しいPCの購入なのですが、MACHの必要スペックを見てみると、
パラレルポート制御の場合は
・WIN-XP,VISTA,7,8の32bit
・外付けのグラフィックボード
となっています。
※11年前は、そのような条件だったのは知っていましたけど、今では64ビットのOSとかでも大丈夫になっているのかと思っていました。

で、私の使っているシステム(オリマイのクワトロ)はシリアルポートも必要です。

マザーボードは、シリアル、パラレルが付いたものがまだ売られているようなのですが、OSの方が売られているのか不明でした。
結局、組んでOSインストールも面倒なので、中古で探す事に…
しかし、それもまた大変です。現物の裏を見てシリアル、パラレルポートが付いているのを1つずつ確認しました。
けれども、ポートがあれば、OSが64BITだったりで、やっと見つけたのが
https://www.0799.jp/products/detail.php?product_id=981
あたりです。
しかし、古すぎる。
CPU Core2DuoE8400[3G]/2GB
2009年10月 発売
だととても5年ももつと思えません。

で、そこからさらに探してやっと見つけ出したのが
http://www.used-pc.co.jp/shopdetail/000000074528/
です。
Corei5 3470 3.2GHz
と大夫良くなりました。
ベースモデルはWIN8 64Bitだったのを諸事象でWIN7 32bitに構成をかえたもののようです。
これは即購入を決意しました。

長く安定して動いてくれるのを祈るばかりです。
次に壊れた時はCNCシステムの変更になりそうです。
猛牛ロック 2018/12/08(Sat) 18:33 No.1313  記事編集
Re: CNC用PCが壊れる
猛牛ロックさん,こんばんは。

前スレでは,細かい解説ありがとうございます。いつもながら勉強になります。




時間がたつと,しかたないんでしょうかね。

それにしても,だんだん,以前の環境が手に入りにくくなりますね。

一番のネックは,シリアルポートでしょうかね。

これ,なければ,ノートでも十分なんですけどね。

最悪

 PC→→ 「スムーズステッパー」 →→ CNC

みたいな環境でシリアルポート省略かな。

以前,ノートのシリアルポートでも動いたの記事で,私の環境であれこれやりましたが,結局ノートのシリアルポートはだめでしたね。


それに,Mach3もいつまでもつのでしょうかね。

Mach4は,確か,インストールできるPCが一台かなんかだったような気がします。

久しぶりにSSTのHP見てみましたが,

https://warp9td.com/index.php/sw#WindowsDriverUss

ドライバーは,windoes10のものまであるんですね。
mabo   2018/12/08(Sat) 22:19 No.1316 記事編集
Re: CNC用PCが壊れる
maboさん、ご例示提供有難うございます。
原因が分かりました。
可変抵抗器のご接続でした。
写真の左側が正解。



気が付くまで2日間以上かかりました。



プログラムを見ていて疑問があります。
若しお分かりでしたら、教えてください。



60行目です。
(temp << 8)の意味を知りたいのです。
<<は、tempのビット列を8ビット右へシフトすると思います。
これは、ADRESHに入った値をADRESHビット内の右端に合わせて値を整列させるということですか?

1111000→0001111

若しそうであれば、
ADRESHに読み込まれる値は、左端から入るということになるけど、
どうなんだろう?

TR   2018/12/09(Sun) 06:58 No.1317 記事編集
Re: CNC用PCが壊れる
TRさん,猛牛ロックさん,おはようございます。

TRさん,ごめんなさい。

かなり前に作ったプログラムなので,中身すっかり忘れてます。

なぜ,左詰にしたのか,忘れてます。

ADFM = 0

で左詰めの設定をして,右に8ビットシフトしてますので,下位の2ビット切り捨ててます。

多分,PR2の値を60〜255にするための処理だと思いますが,忘れています。

猛牛ロックさんのように,理論的な背景があるわけではなく,
トライアンドエラーで,設定した数値なので,なぜこうしたか不明です。

混乱させてすみません。

追記です。多分,精度がいらないので,

http://electronicworkce.boo.jp/pic16f88%E3%81%A7ad%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B%E3%80%82/

のHPのようにしたのかもしれません。
mabo   2018/12/09(Sun) 10:06 No.1318 記事編集
Re: CNC用PCが壊れる
> (temp << 8)の意味を知りたいのです。
> <<は、tempのビット列を8ビット右へシフトすると思います。

8ビット「左シフト<<」です。
よくあるのが
unsigned int adc=(ADRESH<<8)+ADRESL;
です。右詰めなら10ビット、左詰めなら16ビット(下位6bitは0)になります。
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。
猛牛ロック   2018/12/09(Sun) 13:10 No.1319 記事編集
Re: CNC用PCが壊れる
>です。右詰めなら10ビット、左詰めなら16ビット(下位6bitは0)になります。
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。

例は、右詰になっていますが
ということは、ADコンバーター設定でコンバーターに読み込ませる設定を左詰めにしたから、
右に8ビット戻したということですか。


// ADコンバータ設定
ADCON0 = 0b00000001; // RA0をADコンバータピンにし、ADコンバータ機能をEbableに
ADCON1 = 0b10010000; // 結果数値は右寄せ、
TR   2018/12/09(Sun) 17:58 No.1320 記事編集
Re: CNC用PCが壊れる
> ということは、ADコンバーター設定でコンバーターに読み込ませる設定を左詰めにしたから、
> 右に8ビット戻したということですか。

ADRESHとADRESLの桁を合わせたと言う事です。右揃え、左揃えは関係ありません。
元々の桁が違うので、それをもとにもどしただけです。

10進数で言えば、ADRESHは万の単位、ADRESLは一の単位だと思ってください。
98765432という数値が、9876と5432の2つに分かれてくるわけです。で、9876を左に4つシフトさせて
98760000にしてから5432を足して、元に戻します。
猛牛ロック   2018/12/09(Sun) 19:21 No.1321 記事編集
Re: CNC用PCが壊れる
AD返還後のことが写真の部分に書かれると推測します。
推測の意味は、
ADRESHとADRESLが合わさって16ビットなんだけど、10ビット分だけ読み込みますとあるようです。
それも、合わせ場合、左詰めか右詰めを選べるようなことが書いてあると思います。

猛牛ロックさんの言っている意味が分かりません。
写真のことと何か、関係があるのですかそれとも、全く違うのでしょうか?

合成写真右は、ツールラボさんからお借りしました。
絵を添えた方が分かりやすいと思いました。

TR   2018/12/09(Sun) 20:02 No.1322 記事編集
Re: CNC用PCが壊れる
TRさん,猛牛ロックさん,こんばんは。

猛牛ロックさん,解説ありがとうございます。

なんか,自分の前に作ったプログラム,だしてしまいましたが,
このプログラム,通常のやりかたではないですね。

PWMといいつつ,PR2をいじって,周期をかえてましたが。

PWMの本来である,振幅を変更してないので,邪道かもですね。

目的がステッピングモーターの制御だったので,苦肉の策でした。
mabo   2018/12/09(Sun) 21:30 No.1323 記事編集
Re: CNC用PCが壊れる
画像のそのままです。ADRESHはADRESH<<8で、本来の桁になります。
割合で使う場合も、ADRESLと合体する場合は桁合わせの為に「<<8」をします。

画像の説明では
ADRES、つまり変換した10ビットの値は0b1111011011です。
これがADRESHとADRESLの2つに分かれて格納されます。
右詰めなら
ADRESHが0b11
ADRESLが0b11011011です。
なので、ます、ADRESH<<8をすると0b1100000000です。元の0b「11」11011011の桁に移動させただけです。
そして、ADRESLを足すと、元のADRES値(10ビット)になります
※12ビットとして使いたいなら(ADRESH<<10)+(ADRESL<<2)みたいになります。


左詰めなら
ADRESHが0b11110110
ADRESLが0b11000000
です。おおよそ、左詰めの場合は8ビットで使うか、16ビットで使うかの場合が多いです。
8ビットならADRESHのみしか使いません。16ビットで使うなら同じ様にADRESH<<8をします。
つまり、0b1111011000000000です。これとADRESLを足して16ビット値とします。


<追記>

> ADRESHとADRESLが合わさって16ビットなんだけど、10ビット分だけ読み込みますとあるようです。
> それも、合わせ場合、左詰めか右詰めを選べるようなことが書いてあると思います。

ADCの変換値はADRESです。それは10bitの値です。
1バイト(8bit)には当然収まらないので、2バイト、つまり、ADRESHの1バイトとADRESLの1バイトの
2つにわけられて書かれます。そして、関係ない場所の6bitには0が書かれます。

正直、何が解らないのかが解らないです。


更に追記
もしかしたら、10進数&メモリ3*2桁、値4桁に置き換えて、
1234の数値が右揃えなら「001234」になって、
左揃えなら「432100」になるなんて思っていました?
単純に右揃えなら「001234」で、左揃えなら「123400」と
格納されます。※関係ないマスには0が入ります
で、
右揃えなら、1と234の2つに分かれるので1を3つ左シフトして1000にしてから234を更に足します
猛牛ロック   2018/12/09(Sun) 22:13 No.1324 記事編集
Re: CNC用PCが壊れる
temp = ADRESH;
temp = (temp << 8) + ADRESL

上記の式は、ADRESHを8bit右にずらしてADRESLと合体させてADRESの10ビットにするといっているが、
結果は、ADRESHの内6ビットだけ消えて、
残りの2ビットとADRESLと合体し、10ビットとなるわけですね?
TR   2018/12/10(Mon) 10:18 No.1325 記事編集
Re: CNC用PCが壊れる
> 上記の式は、ADRESHを8bit右にずらしてADRESLと合体させてADRESの10ビットにするといっているが、
だから違います。「<<」は見ての通り左へのビットシフトです。2進数表示で8つ「左」にずらします。
どこかで右って間違いましたか?

> 結果は、ADRESHの内6ビットだけ消えて、
いいえ消えません。勿論tempが8bitの変数ならすべて消えることになります。
しかし、今回は
unsigned int temp;
と、16ビットなので、8BIT左にずらして、本来の桁へと移動させただけです。
16ビットの内の下位8ビットに入っていたものを上位8ビットに移動させています。

(ADRESH<<8)+ADRESL
という計算自体が、「元のADRESレジスタを取り出している」と言う事です。
(2行表記でも同じ)


<追記>
あぁ、MABOさんのNo.1318 のレスですね。

これは、No.1314とNo.1315の話が混ざっている?ような気がします。

No.1315では左詰めの設定で、単にADRESHのみをreturnしています。
8ビット値で充分な場合は通常、左詰めにして、ADRESLを見ずにADRESHだけを採用します。

No.1314は右詰めに設定して、普通に10ビット取り出しています。そして、main関数のループ部で、
CCPR1L = num / 4;
と8ビットに直しています。
つまり両者ともに上位8BITしか使っていません。

まぁ、実際には8ビットしか使っていないので、
「左詰め&ADRESHのみ」をする方が良い、という考え方もあります。

ただ、もう一方で、今回のadconv関数をライブラリとして使いまわす、という考えもあります。
それは、無駄にデータシートを見て書き直すよりも、実績のある馴れたものを使う、という考え方です。
ADRESレジスタ値をそのまま返す関数として、adconv関数を使って、それを使いたいBIT数に変える、というのも
プログラミングではよくあります。
下手にadconv関数を書き換えてしまうと、振り返った時に「このソースで使ったのはどっちだったっけ?」となるわけです。

猛牛ロック   2018/12/10(Mon) 12:44 No.1326 記事編集
Re: CNC用PCが壊れる
間違って覚えてしまったようです。
了解です。
有難うございました。
TR   2018/12/10(Mon) 17:11 No.1327 記事編集

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