48時間以内の記事は
で表示されます
で表示されます
疑似手パ,中間報告
手パの経過報告です。幾つかの問題に直面しました。
部材(スライドスイッチ)が25日発送予定なので、どちらにしてもまだなのですけど、
プログラムとCADの部分はおおよそ作って、テストしています。
@一番大きな問題ですけど、「CTRL」+「ALT」+「X」が通用しません。
試してみると、「CTRL」+「X」や「ALT」+「X」なら問題無さそうです。
(STM32F103ボード、PRO MICRO共通)
勿論、本物のキーボードからは「CTRL」+「ALT」+「X」で通用します。
今の所、解決策は3つです。
1.根本的に、プログラム(ライブラリ)を見直して、「CTRL」+「ALT」+が通用するものを作る
2.ホットキーの割り当てを変える。
3.今まで行っていたJoyToKeyというソフトを使うなら通用するでしょうから、
ジョイパッドとして作って、JoyToKeyを通して作業するなら問題はすり抜けそうです。
今の所、2番の割り当て変更になりそうです。ただ、元々どこに当てられているのかがはっきりしないんですよね。
一覧とかがあれば、「それ以外」も決めれるのですけど。
ASTM32F103ボードにはBOOTジャンパが付いています。これで、起動を切り替えるのですけど、
これが邪魔で予定ケースには入らないことが判明しました。ピンヘッダを削ってはんだ付けしちゃうか?ケースに
穴をあけるか、それともピンヘッダの無いPRO MICROにするか?まぁ、ケースを変える、というのもありましたね。
添付画像のように、PRO MICROは平らです。リセットボタンやISPピンも出てないのが今回は好結果になります。
(勿論あった方が使いやすいですけど、この平べったさをみると意図的にしているようですね)
これはちょっとPRO MICROに気持ちが傾いています。ジャンパを取ってもちょっと膨れる位なんですよね。
B以前MABOさんから、「フォルムさんの疑似手パは使いにくかった」というようなことを聞いたような気がするのですけど、
それと同じような要因なのかと思います。
CONTモードの時はボタンが直ぐに切り替わりません。0.5秒位は離さないと次の命令(ボタンを押す)を聞いてくれません。
最初にこれに遭遇したので戸惑いました。
(これはキーボードでも確認できます。→キーを押してX+方向にうごかしていて、直ぐに←キーに切り替えるとX-には動かずに停止します。
また、同じキーの2度打ちでも停止します)
ただし、stepモードの場合は
> for (i = 0; i < 100; i++) {
> BootKeyboard.press(KEY_PAGE_UP);
> delay(3);
> BootKeyboard.release(KEY_PAGE_UP);
> delay(3);
> }
のコードで動くことを確認しました。(0.01mm×100回押す=1mm動作)
エンコーダ自体は1周30パルスなので、早く回しても1秒間に3回転=90パルス/秒です。
これで動いたと言う事は160パルス/秒でも問題ないことを意味しているので、STEPモードにすれば
ちゃんと動きそうです。
Re: 疑似手パ,中間報告
猛牛ロックさん,TRさん,こんばんは。
猛牛ロックさん,着々とすすでますね。
ちょっと疑問点なんですが,
USB接続だと思うのですが,
USBまわりのライブラりーでもあるのでしょうか。
それと,
BootKeyboard.press(KEY_PAGE_UP)
のKEY_PAGE_UPは,猛牛ロックさんが別途作った,Define等で
の処理でしょうか。
それとも,一括で,ヘッダーフィアイルかんなんかにあるのでしょうか。
猛牛ロックさん,着々とすすでますね。
ちょっと疑問点なんですが,
USB接続だと思うのですが,
USBまわりのライブラりーでもあるのでしょうか。
それと,
BootKeyboard.press(KEY_PAGE_UP)
のKEY_PAGE_UPは,猛牛ロックさんが別途作った,Define等で
の処理でしょうか。
それとも,一括で,ヘッダーフィアイルかんなんかにあるのでしょうか。
Re: 疑似手パ,中間報告
HIDデバイス絡みのライブラリです。
HIDデバイスなら、標準ドライバで動くのでドライバを作る必要もありません。
マウス、キーボード、ジョイパッドあたりのデバイスです。
数日前に参考プログラムを乗せたと思うのですけど。(No.1347です)
STM32F103ボードの方はコンポジットライブラリ(それらの複合)になっていて、
モードが幾つかあるので面倒です。でも基本は一緒で、
#include <USBComposite.h>
USBHID HID;
HIDKeyboard BootKeyboard(HID, 0);
void setup() {
HID.begin(HID_BOOT_KEYBOARD);
BootKeyboard.begin();
まで記述すれば、既に始める準備が出来ています。
後は
BootKeyboard.press('M');
BootKeyboard.release('M');
BootKeyboard.write('M');//押して離す複合
BootKeyboard.releaseAll();
の類の命令を状況に応じて書くだけです。
※「BootKeyboard」は自由に付けていいはずです。。
なので3行目は
HIDKeyboard TEPA(HID, 0);
とすれば、6行目は
TEPA.begin();
として、
TEPA.press('k');
のように使います。
PRO MICROは単独のHIDキーボードライブラリのなので、もっと簡単に
#include "Keyboard.h"
void setup() {
Keyboard.begin();
}
の2行を付けれるだけで準備OKです。
KEY_PAGE_UP
等は既に定義されています。
まともなマニュアルはありませんから、ライブラリ内を検索して、実際にはUSBHID.hというファイルに定義されていました。
(Arduinoの方はリファレンスサイトに載っています。勿論PICにも同様のライブラリはあると思います。
ただし、PRO MICRO(実際はLEONARDOのライブラリ)とSTM32ボードやPIC、その他のライブラリでそれぞれ違いはあります。
どれも、その仕様に沿って書くことになります。)
HIDデバイスなら、標準ドライバで動くのでドライバを作る必要もありません。
マウス、キーボード、ジョイパッドあたりのデバイスです。
数日前に参考プログラムを乗せたと思うのですけど。(No.1347です)
STM32F103ボードの方はコンポジットライブラリ(それらの複合)になっていて、
モードが幾つかあるので面倒です。でも基本は一緒で、
#include <USBComposite.h>
USBHID HID;
HIDKeyboard BootKeyboard(HID, 0);
void setup() {
HID.begin(HID_BOOT_KEYBOARD);
BootKeyboard.begin();
まで記述すれば、既に始める準備が出来ています。
後は
BootKeyboard.press('M');
BootKeyboard.release('M');
BootKeyboard.write('M');//押して離す複合
BootKeyboard.releaseAll();
の類の命令を状況に応じて書くだけです。
※「BootKeyboard」は自由に付けていいはずです。。
なので3行目は
HIDKeyboard TEPA(HID, 0);
とすれば、6行目は
TEPA.begin();
として、
TEPA.press('k');
のように使います。
PRO MICROは単独のHIDキーボードライブラリのなので、もっと簡単に
#include "Keyboard.h"
void setup() {
Keyboard.begin();
}
の2行を付けれるだけで準備OKです。
KEY_PAGE_UP
等は既に定義されています。
まともなマニュアルはありませんから、ライブラリ内を検索して、実際にはUSBHID.hというファイルに定義されていました。
(Arduinoの方はリファレンスサイトに載っています。勿論PICにも同様のライブラリはあると思います。
ただし、PRO MICRO(実際はLEONARDOのライブラリ)とSTM32ボードやPIC、その他のライブラリでそれぞれ違いはあります。
どれも、その仕様に沿って書くことになります。)
Re: 疑似手パ,中間報告
Re: 疑似手パ,中間報告
Re: 疑似手パ,中間報告
使用マイコンの方はまだどちらにするか悩んでいます。ホットキーについては、はっきりとしたことは判りません。
例えば、Ctrl+ALT+1(Qキーの上にある方)だとマイコンもキーボードも同一です。
しかし、特定のものはやはり違った値になります。
でも、まぁ、マイコンはどちらにしろ、この問題はあるようですし、対処できない訳でもないので
この部分で悩んでいる訳でもないのですけど。
・あまりADCは使いたくない→STM32ボードが良いかなぁ
・ピンヘッダが邪魔→PRO MICROの方がすっきりするかなぁ
今となっては使うか判らないSTM32ボード用の最初のスケッチです。
実際試した訳では無いので、多少変えないと動かないと思います。
大部分は、「押したボタンに対応するコードを送る」というだけです。
こっちはブートキーボードじゃなくて、単なるキーボードになっていますね。
(何が違うのかは把握していません。今回の件ではどちらのモードでも同じかも)
#include <USBComposite.h>
const uint32_t used_pin=0b11111111110110000011111111111;
uint16_t pin_old[29];
uint8_t pin_state[29];
volatile uint8_t axis,feed,step_unit;
USBHID HID;
HIDKeyboard TEPA(HID);
void read_mode(void) {
for(byte i=0; i<=2; i++) {
if(digitalRead(i)==0)axis=i;
}
for(byte i=19; i<=22; i++) {
if(digitalRead(i)==0)step_unit=i;
}
for(byte i=23; i<=25; i++) {
if(digitalRead(i)==0)feed=i;
}
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.press('.'); //基本的に、STEPがデフォルト
if(step_unit==22)TEPA.write('K');
else if(step_unit==21)TEPA.write('L');
else if(step_unit==20)TEPA.write(';');
else if(step_unit==19)TEPA.write(':');
if(feed==25)TEPA.write('F');
else if(feed==24)TEPA.write('G');
else if(feed==23)TEPA.write('H');
TEPA.releaseAll();
}
void setup() {
HID.begin(HID_KEYBOARD);
TEPA.begin();
for(byte i=0; i<=28; i++) {
if((used_pin>>i)&1) {
pinMode(i,INPUT_PULLUP);
}
}
delay(1000);
read_mode();
}
void loop() {
byte enc;
for(byte i=0; i<=28; i++) { //16bit履歴を保存
if((used_pin>>i)&1) {
pin_old[i]<<=1;
if(digitalRead(i)==0) {//SW-ON
pin_old[i]++;
if(pin_old[i]=0xFFFF) {
if(i<=2 && i!=axis) {
axis=i;
} else if(i>=19 && i<=22 && i!=step_unit) {
step_unit=i;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(i==19)TEPA.press(':');
else if(i==20)TEPA.press(';');
else if(i==21)TEPA.press('L');
else if(i==22)TEPA.press('K');
TEPA.releaseAll();
} else if(i>=23 && i<=25 && i!=feed) {
feed=i;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(i==23)TEPA.press('H');
else if(i==24)TEPA.press('G');
else if(i==25)TEPA.press('F');
TEPA.releaseAll();
} else if(i==3 && pin_state[3]==0) { //1/2
pin_state[3]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(axis==0)TEPA.press('A');
else if(axis==1)TEPA.press('S');
else if(axis==2)TEPA.press('D');
TEPA.releaseAll();
} else if(i==4 && pin_state[i]==0) { //z1.02
pin_state[4]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.press('/');
TEPA.releaseAll();
} else if(i==5 && pin_state[i]==0) { //DRO 0
pin_state[5]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(axis==0)TEPA.press('B');
else if(axis==1)TEPA.press('N');
else if(axis==2)TEPA.press('M');
TEPA.releaseAll();
} else if(i<=8 && pin_state[i]==0) { //g56,55,54
pin_state[i]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(i==8)TEPA.press('4');
else if(i==7)TEPA.press('5');
else if(i==6)TEPA.press('6');
TEPA.releaseAll();
} else if(i==26 && pin_state[i]==0) { //stop
pin_state[i]=1;
TEPA.press(KEY_RIGHT_ALT);
TEPA.press('S');
TEPA.releaseAll();
} else if(i==27 && pin_state[i]==0) {
pin_state[i]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
if(axis==0)TEPA.press('W');
else if(axis==1)TEPA.press('E');
else if(axis==2)TEPA.press('R');
TEPA.releaseAll();
} else if(i==28 && pin_state[i]==0) { //G0z1
pin_state[i]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.press('Z');
TEPA.releaseAll();;
} else if(i==9 && pin_state[i]==0) { //+ ※releaseはしない
pin_state[i]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.write(',');//CONT指定
if(axis==0)TEPA.press(KEY_RIGHT_ARROW);
else if(axis==1)TEPA.press(KEY_UP_ARROW);
else if(axis==2)TEPA.press(KEY_PAGE_UP);
} else if(i==10 && pin_state[i]==0) { //- ※releaseはしない
pin_state[i]=1;
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.write(',');//CONT指定
if(axis==0)TEPA.press(KEY_LEFT_ARROW);
else if(axis==1)TEPA.press(KEY_DOWN_ARROW);
else if(axis==2)TEPA.press(KEY_PAGE_DOWN);
}
}
} else { //SW-OFF
if(pin_old[i]==0) {
if((i==9 || i==10)&& pin_state[i]==1) {
pin_state[i]=0;
TEPA.releaseAll();
TEPA.press(KEY_RIGHT_CTRL);
TEPA.press(KEY_RIGHT_ALT);
TEPA.press('.');//STEP指定
TEPA.releaseAll();
} else if(pin_state[i]==1)pin_state[i]=0;
}
}
enc=((pin_old[16]&0b11)<<2)|(pin_old[17]&0b11);//step-cont切替も
if(enc==1) {
if(axis==0)TEPA.write(KEY_RIGHT_ARROW);
else if(axis==1)TEPA.write(KEY_UP_ARROW);
else if(axis==2)TEPA.write(KEY_PAGE_UP);
} else if(enc==2) {
if(axis==0)TEPA.press(KEY_LEFT_ARROW);
else if(axis==1)TEPA.press(KEY_DOWN_ARROW);
else if(axis==2)TEPA.press(KEY_PAGE_DOWN);
}
}
}
delay(1);
}
Re: 疑似手パ,中間報告
猛牛ロックさん,TRさん,こんばんは。
猛牛ロックさん,疑問点への回答ありがとうございます。
arduino,ライブラリー等,充実してるんですね。
機種にもよるのでしょうけど,本当,親切ですね。
16系のPICだと,新しいものでないと,USBのインターフェース等,搭載してないようですね。
私がもっている,16ファミリーでの解説書でも,USBのインターフェ-スについては,載ってないです。
STM32F103のUSBのライブラリ-ちょっとみてみました。
https://github.com/arpruss/USBComposite_stm32f1
PICのこともよく分からないのですが,arduinoは,なんか充実しているような感じです。
PICだと16系では,16F1455がUSBのインターフェース搭載なのですね。
秋月での販売が2016年あたりですので,新しいですよね。
このあたりは。arduino の方が進んでるんでしょうかね。
TRさん,PWMのコントローラーの不具合,原因分かってよかったですね。
ICは,もしかして,中華製だったりして・・・・・・。
ICの交換より,全体の買い換えの方が安くつくんでしょうかね。
猛牛ロックさん,疑問点への回答ありがとうございます。
arduino,ライブラリー等,充実してるんですね。
機種にもよるのでしょうけど,本当,親切ですね。
16系のPICだと,新しいものでないと,USBのインターフェース等,搭載してないようですね。
私がもっている,16ファミリーでの解説書でも,USBのインターフェ-スについては,載ってないです。
STM32F103のUSBのライブラリ-ちょっとみてみました。
https://github.com/arpruss/USBComposite_stm32f1
PICのこともよく分からないのですが,arduinoは,なんか充実しているような感じです。
PICだと16系では,16F1455がUSBのインターフェース搭載なのですね。
秋月での販売が2016年あたりですので,新しいですよね。
このあたりは。arduino の方が進んでるんでしょうかね。
TRさん,PWMのコントローラーの不具合,原因分かってよかったですね。
ICは,もしかして,中華製だったりして・・・・・・。
ICの交換より,全体の買い換えの方が安くつくんでしょうかね。
Re: 疑似手パ,中間報告
Re: 疑似手パ,中間報告
> MABOさん
基本的に、上位のマイコンほど複雑ですけど、逆に複雑な部分は捨て去って?、簡単になります。
PCは内部は複雑だけれども、それを知らなくてもすぐにインターネットやEXCELが出来るのと同じです。
まぁ、複雑な部分は他人に任せているのですけど。
基本的に、Arduinoもmbedなども同じ(WINDOWSとMACのようなもの)で、それに対応させれば、同じような操作で
GPIO等は操れます。(Arduinoに対応したデバイスはArduino流に書いて、mbedならmbed流に書く)
Arduino(UNO)なら、レジスタ操作からライブラリを使った、様々なデバイスも容易に纏められます。
つまり、入門から応用まで対応出来ます。
PICでそう言った事が出来るかは、良く判りません。(勿論、マイコン性能ではなく、開発環境の問題です)
USBもPIC16Fからありますし、品ぞろえ的にはPICは問題ないです。
だけど、設定が面倒なんですよね。だから、http://bit-trade-one.co.jp/product/assemblydisk/revive-usb/
のような物も発売されています。
でも、多少いじるなら、このコードを改変するよりも、https://garretlab.web.fc2.com/arduino_reference/language/functions/usb/index.html
を見て、Arduinoで組んだ方が楽で面白いかと思います。
> TRさん
プログラム自体は全然難しいものではありませんよ。
ボタンを押されたら1回点滅させる、というLチカと同じ類のものです。
それが、1回(そのボタンに対応する)キーコードを送る、となっているだけです。
で、その回路ですけど、
・FETは4V(或いは2.5V)駆動品を選ぶ
・プルダウン抵抗は高すぎです。数十kΩが良いです。
・3.5kΩの部分はプルダウン抵抗の1/10程度が良いかな?
・バリスタよりもダイオードが良いです。
※バリスタ27Vなら実際のバリスタ電圧?が30Vとして、42Vになった時にDC12V側に還流されます。
つまり、42Vのサージが残ります。
ダイオードなら12.6Vで還流されるので、ほぼサージが消えます。
基本的に、上位のマイコンほど複雑ですけど、逆に複雑な部分は捨て去って?、簡単になります。
PCは内部は複雑だけれども、それを知らなくてもすぐにインターネットやEXCELが出来るのと同じです。
まぁ、複雑な部分は他人に任せているのですけど。
基本的に、Arduinoもmbedなども同じ(WINDOWSとMACのようなもの)で、それに対応させれば、同じような操作で
GPIO等は操れます。(Arduinoに対応したデバイスはArduino流に書いて、mbedならmbed流に書く)
Arduino(UNO)なら、レジスタ操作からライブラリを使った、様々なデバイスも容易に纏められます。
つまり、入門から応用まで対応出来ます。
PICでそう言った事が出来るかは、良く判りません。(勿論、マイコン性能ではなく、開発環境の問題です)
USBもPIC16Fからありますし、品ぞろえ的にはPICは問題ないです。
だけど、設定が面倒なんですよね。だから、http://bit-trade-one.co.jp/product/assemblydisk/revive-usb/
のような物も発売されています。
でも、多少いじるなら、このコードを改変するよりも、https://garretlab.web.fc2.com/arduino_reference/language/functions/usb/index.html
を見て、Arduinoで組んだ方が楽で面白いかと思います。
> TRさん
プログラム自体は全然難しいものではありませんよ。
ボタンを押されたら1回点滅させる、というLチカと同じ類のものです。
それが、1回(そのボタンに対応する)キーコードを送る、となっているだけです。
で、その回路ですけど、
・FETは4V(或いは2.5V)駆動品を選ぶ
・プルダウン抵抗は高すぎです。数十kΩが良いです。
・3.5kΩの部分はプルダウン抵抗の1/10程度が良いかな?
・バリスタよりもダイオードが良いです。
※バリスタ27Vなら実際のバリスタ電圧?が30Vとして、42Vになった時にDC12V側に還流されます。
つまり、42Vのサージが残ります。
ダイオードなら12.6Vで還流されるので、ほぼサージが消えます。
Re: 疑似手パ,中間報告
猛牛ロックさんへ、先ほど、バラックでテスト完了しました。
中華ポンプは、えらくいい加減です。
動作する電圧の範囲です。
表示はDC12Vですが、DC24でも行けそうです。
バリスタはどうって選ぶのか分かりませんでした。
以下のページを参考にして、出しました。
VE≦VA(1−α) …A
VE:回路電圧
VA:最大許容回路電圧
α:設計マージン(α=0.2)
http://www.koaglobal.com/product/basic/varistor
本当は違うのですか、よかったら、
詳しく教えてください。
MOSFETの1MΩは、自信があります。
続トランジスタ回路の設計から出しましたし、実験の結果、やはり1MΩじゃないと、
GND側に引っ張り切れなくて、ドレインから電流が流れてしまいました。
FET方向への3.9kΩは、実験の結果、一番安定していました。
ただ、参考文献でもハッキリとしませんでした。
バリスタは、高速ダイオードに変えます。
それから、教えていただいたPWMとADのプログラムは、理解できたので、
大活躍していますよ。
バラックでのテストは、安定電源でやったので、ポンプ無理なく滑らかに回っています。
ボリュームをいじっていると気分がいいです。
ただ、ポンプがいまいち、ボリュームを目いっぱいに絞っていないのに停止します。
これはプログラムじゃなくポンプです。
なにせ、DC18Vの電源だとパワフルに回ってくれますから、きっと、最適の電圧は12Vじゃなくもっと上だと思います。
言語は、MPLABの言語じゃないのですか?
写真は、バラックでのテスト風景です。
Re: 疑似手パ,中間報告
皆さんこんばんは。
教えて欲しい事があります。
SEC基板のポート2 SL13の1 からの出力信号(これが、「-電圧」なんです、、、。)。
今まで、逆に繋いでいました。
話を戻します。
PWMをSL13の1からの信号をRB7に繋ぎ、RB7により全体を制御したいと思います。
そこで、プログラムの真ん中あたり、@のところに、break文を付けました。
これで、宜しいでしょうか?
動作
RB7のLoで、すべて停止、
Hiで、
・全体の動作モニター用のLED
・PWM信号をRB0端子で、DCモーターポンプを回転数制御
・RB3で回転数を電圧読み取り
/*PWM機能によりRB3可変抵抗で制御*/
//RB7がSEC基板ポート2のSL-13の1番ピン(出力端子)を入力端子として受けるその表示をLEDでRA1から発光させる
//RB0を出力端子LEDPIC16F1827 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
// 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 = ON // Power-up Timer Enable (PWRT enabled)
#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 1000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を1MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // 可変抵抗の電圧読み込み用にRB3のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 可変抵抗用ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(AN9 RB3から読込む)
ADCON1 = 0b10010000; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする
__delay_us(5); // アナログ変換情報が設定されるまでとりあえず待つ
//変数宣言
unsigned int num;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
@ if(RB7==0){break;}
LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num = adconv(); // RB3 9番ピン(AN9)から半固定抵抗の値を読み込む
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
APFCON0bits.CCP1SEL = 1; // RB0端子を出力端子に設定
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 255; //PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
教えて欲しい事があります。
SEC基板のポート2 SL13の1 からの出力信号(これが、「-電圧」なんです、、、。)。
今まで、逆に繋いでいました。
話を戻します。
PWMをSL13の1からの信号をRB7に繋ぎ、RB7により全体を制御したいと思います。
そこで、プログラムの真ん中あたり、@のところに、break文を付けました。
これで、宜しいでしょうか?
動作
RB7のLoで、すべて停止、
Hiで、
・全体の動作モニター用のLED
・PWM信号をRB0端子で、DCモーターポンプを回転数制御
・RB3で回転数を電圧読み取り
/*PWM機能によりRB3可変抵抗で制御*/
//RB7がSEC基板ポート2のSL-13の1番ピン(出力端子)を入力端子として受けるその表示をLEDでRA1から発光させる
//RB0を出力端子LEDPIC16F1827 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
// 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 = ON // Power-up Timer Enable (PWRT enabled)
#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 1000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を1MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // 可変抵抗の電圧読み込み用にRB3のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 可変抵抗用ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(AN9 RB3から読込む)
ADCON1 = 0b10010000; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする
__delay_us(5); // アナログ変換情報が設定されるまでとりあえず待つ
//変数宣言
unsigned int num;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
@ if(RB7==0){break;}
LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num = adconv(); // RB3 9番ピン(AN9)から半固定抵抗の値を読み込む
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
APFCON0bits.CCP1SEL = 1; // RB0端子を出力端子に設定
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 255; //PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
Re: 疑似手パ,中間報告
DCモータは電圧によって力(回転数)が変わります。
なので、電圧を上げれば上げるほど回ります。
ただし、壊れる危険性も上がります。
電圧を2倍にすれば電流も2倍流れ、消費電力は4倍になります。当然発熱も4倍ですから気を付けてください。
> GND側に引っ張り切れなくて
誤解があるようですけど、1MΩよりも10kΩの方が引っ張る力は100倍あります。
けれども、あまりFETは使っていないので、どの位が適切かは自信がありません。
バリスタは交流の方が良く使われます。
交流の場合は素子の両側が入れ替わりますから、両方対処する必要があります。
例えばAC12Vなら最大17V程度ですよね?その場合は実効20Vのバリスタを入れれば最大値の3Vオーバーの値までにとどめられます。
でも、今回のようにDC12Vの場合は、20Vだと逆電流の場合は20+12V=32V以上の時にVCC(12V)側に流れる事になります。
で、ダイオードなら0.6V程度で流れだすのでこちらの方をお薦めします。
プログラムの方ですけど、はっきりとは言えませんけど多分、再起動を繰り返すのだと思います。
で、そこまでのプログラムではPWMはLOW状態なので、大体、LOW出力あるいはアナログ入力になると思います。
私自身はプログラムが終わるコードを書いたことが無いので、当然、試したこともありません。
なので、電圧を上げれば上げるほど回ります。
ただし、壊れる危険性も上がります。
電圧を2倍にすれば電流も2倍流れ、消費電力は4倍になります。当然発熱も4倍ですから気を付けてください。
> GND側に引っ張り切れなくて
誤解があるようですけど、1MΩよりも10kΩの方が引っ張る力は100倍あります。
けれども、あまりFETは使っていないので、どの位が適切かは自信がありません。
バリスタは交流の方が良く使われます。
交流の場合は素子の両側が入れ替わりますから、両方対処する必要があります。
例えばAC12Vなら最大17V程度ですよね?その場合は実効20Vのバリスタを入れれば最大値の3Vオーバーの値までにとどめられます。
でも、今回のようにDC12Vの場合は、20Vだと逆電流の場合は20+12V=32V以上の時にVCC(12V)側に流れる事になります。
で、ダイオードなら0.6V程度で流れだすのでこちらの方をお薦めします。
プログラムの方ですけど、はっきりとは言えませんけど多分、再起動を繰り返すのだと思います。
で、そこまでのプログラムではPWMはLOW状態なので、大体、LOW出力あるいはアナログ入力になると思います。
私自身はプログラムが終わるコードを書いたことが無いので、当然、試したこともありません。
Re: 疑似手パ,中間報告
>プログラムの方ですけど、はっきりとは言えませんけど多分、再起動を繰り返すのだと思います。
今まで使っていた、秋月のPWMキットは、使っていて、感じた点があります。
それは、完全にON・OFFしない事。
その欠点とも思われる事は、秋月のPWMキット説明書にも、その旨の記載があります。
今回、自作、ま〜ガラクタですけど(笑い)
その辺の欠点を何とかと思った次第です。
それと、もう一点あります。
ボリュームの途中で、モーターが停止します。
これも何とかしたいのですが、何かいいアイデアありませんか?
PWMは、MACH3のボタン操作に伴い、SEC基板からの信号をPIC16F1827が受けて制御します。
AD変換する仕切り値といいうのかな〜、
仕切り値以上になったら、電圧の読み取り開始とか、
したらいいのでしょうか?
そうか、DUTYだ!
追記
Dutyを決めるCCPR1に最初から加算したら、どうかな?
+400 とか 500
動作速度から算出する。
今まで使っていた、秋月のPWMキットは、使っていて、感じた点があります。
それは、完全にON・OFFしない事。
その欠点とも思われる事は、秋月のPWMキット説明書にも、その旨の記載があります。
今回、自作、ま〜ガラクタですけど(笑い)
その辺の欠点を何とかと思った次第です。
それと、もう一点あります。
ボリュームの途中で、モーターが停止します。
これも何とかしたいのですが、何かいいアイデアありませんか?
PWMは、MACH3のボタン操作に伴い、SEC基板からの信号をPIC16F1827が受けて制御します。
AD変換する仕切り値といいうのかな〜、
仕切り値以上になったら、電圧の読み取り開始とか、
したらいいのでしょうか?
そうか、DUTYだ!
追記
Dutyを決めるCCPR1に最初から加算したら、どうかな?
+400 とか 500
動作速度から算出する。
Re: 疑似手パ,中間報告
PWMの動作開始を50%から出来たらいいな〜と、考えました。
そこで、プログラム真ん中辺りに、@ Aを書き加えました。
50%は、内部クロック1Mhzにしたので、
1/1000000 → 1サイクル時間は、1μs=1000ms
50%なら、500ms
ここから推測なのですが、
50%にしたいなら、CCPR1Lが500でいいと思いました。
如何でしょうか?
ご指摘願います。
宜しくお願いします。
/*PWMによりRB3で可変抵抗制御し、RB0を出力端子*/
//RB7がSEC基板ポート2のSL-13の1番ピン(出力端子)を入力端子として受ける
//その表示を操作盤のLEDでRA1から発光させる、また、基盤でもRA0からLEDにより発光させる
//PIC16F1827 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
// 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 = ON // Power-up Timer Enable (PWRT enabled)
#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 1000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を1MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // 可変抵抗の電圧読み込み用にRB3のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 可変抵抗用ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(AN9 RB3から読込む)
ADCON1 = 0b10010000; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする
__delay_us(5); // アナログ変換情報が設定されるまでとりあえず待つ
//変数宣言
unsigned int num;//ADRESHの値
unsigned int duty;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
if(RB7==0){__delay_ms(10);break;}
LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num = adconv(); // RB3 9番ピン(AN9)から半固定抵抗の値を読み込む
@ duty=500+num;//Duty比50%からスタート
A if(duty > 500){
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);}
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
APFCON0bits.CCP1SEL = 1; // RB0端子を出力端子に設定
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 255; //PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
そこで、プログラム真ん中辺りに、@ Aを書き加えました。
50%は、内部クロック1Mhzにしたので、
1/1000000 → 1サイクル時間は、1μs=1000ms
50%なら、500ms
ここから推測なのですが、
50%にしたいなら、CCPR1Lが500でいいと思いました。
如何でしょうか?
ご指摘願います。
宜しくお願いします。
/*PWMによりRB3で可変抵抗制御し、RB0を出力端子*/
//RB7がSEC基板ポート2のSL-13の1番ピン(出力端子)を入力端子として受ける
//その表示を操作盤のLEDでRA1から発光させる、また、基盤でもRA0からLEDにより発光させる
//PIC16F1827 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
// 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 = ON // Power-up Timer Enable (PWRT enabled)
#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 1000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を1MHzに設定
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00001000; // 可変抵抗の電圧読み込み用にRB3のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00001000; //RB3 可変抵抗用ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100101; // アナログ変換情報設定(AN9 RB3から読込む)
ADCON1 = 0b10010000; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする
__delay_us(5); // アナログ変換情報が設定されるまでとりあえず待つ
//変数宣言
unsigned int num;//ADRESHの値
unsigned int duty;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
if(RB7==0){__delay_ms(10);break;}
LATA0=LATA1=RB7;//SEC基板ポート2のSL-13の1番ピン
num = adconv(); // RB3 9番ピン(AN9)から半固定抵抗の値を読み込む
@ duty=500+num;//Duty比50%からスタート
A if(duty > 500){
CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
CCP1CONbits.DC1B = num & 0b11;
__delay_ms(10);}
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
APFCON0bits.CCP1SEL = 1; // RB0端子を出力端子に設定
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 255; //PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
Re: 疑似手パ,中間報告
> その辺の欠点を何とかと思った次第です。
そのように、気にくわない部分を直していくのも良いと思います。
> ボリュームの途中で、モーターが停止します
これは単純に動き出す位置の問題ですよね?
前にも言ったと思いますけど、ボリューム位置をADCで取得しているのです。duty比を取得しているのではありません。
で、そのボリューム位置へ自由にduty比を割りづければ良いです。ただし、最低付近はキッチリ止めた方が良いです。(duty比0もしくはPWM停止)
止めなければモータが動かなくても電流が流れて発熱します。なので、ボリュームの10%?とか停止範囲を作った方が良いと思います。
※読み取りは全範囲します。というか、読み取らなければどの位置か判りません。
ツマミ位置が0-10%で停止。ツマミ位置10〜100%の位置で、使用する最低のちょっと下ぐらいのPWM〜100%PWMみたいな感じの割り付けになると思います。
スイッチ付のボリュームならちょっと違うと思います。
> @ duty=500+num;//Duty比50%からスタート
> A if(duty > 500){
> CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
> CCP1CONbits.DC1B = num & 0b11;
> __delay_ms(10);}
> }
Aがif文なのが判らないです。numが0の場合を除外したいのならもう少し範囲を確保した方が良いです。
テスターで電圧を測れば判ると思いますけど、一番下の桁はちょくちょく動きます。
そして、このコードだと上が切り取られる?(桁があふれる)のでちゃんと割合で合わせなければ駄目です。
そのように、気にくわない部分を直していくのも良いと思います。
> ボリュームの途中で、モーターが停止します
これは単純に動き出す位置の問題ですよね?
前にも言ったと思いますけど、ボリューム位置をADCで取得しているのです。duty比を取得しているのではありません。
で、そのボリューム位置へ自由にduty比を割りづければ良いです。ただし、最低付近はキッチリ止めた方が良いです。(duty比0もしくはPWM停止)
止めなければモータが動かなくても電流が流れて発熱します。なので、ボリュームの10%?とか停止範囲を作った方が良いと思います。
※読み取りは全範囲します。というか、読み取らなければどの位置か判りません。
ツマミ位置が0-10%で停止。ツマミ位置10〜100%の位置で、使用する最低のちょっと下ぐらいのPWM〜100%PWMみたいな感じの割り付けになると思います。
スイッチ付のボリュームならちょっと違うと思います。
> @ duty=500+num;//Duty比50%からスタート
> A if(duty > 500){
> CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
> CCP1CONbits.DC1B = num & 0b11;
> __delay_ms(10);}
> }
Aがif文なのが判らないです。numが0の場合を除外したいのならもう少し範囲を確保した方が良いです。
テスターで電圧を測れば判ると思いますけど、一番下の桁はちょくちょく動きます。
そして、このコードだと上が切り取られる?(桁があふれる)のでちゃんと割合で合わせなければ駄目です。
Re: 疑似手パ,中間報告
猛牛ロックさん、有難うございます。
>※読み取りは全範囲します。というか、読み取らなければどの位置か判りません。
ツマミ位置が0-10%で停止。ツマミ位置10〜100%の位置で、使用する最低のちょっと下ぐらいのPWM〜100%PWMみたいな感じの割り付けになると思います。
スイッチ付のボリュームならちょっと違うと思います。
以下の部分が、電圧読み取りの部分ですが、@〜Fの間で細工するということでしょうか?
改善したい点は、現在、ボリュームが0〜50%に部分では動作しないので、
50%から動作開始としたいです。
// アナログ値の変換と読込み処理関数
@ unsigned int adconv() {
A unsigned int temp;
B GO_nDONE = 1; // アナログ値読取り開始指示
C while (GO_nDONE); // 読取り完了まで待つ
D temp = ADRESH; //
E temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
F return temp; //読み込んだtempをnumに返す
}
>※読み取りは全範囲します。というか、読み取らなければどの位置か判りません。
ツマミ位置が0-10%で停止。ツマミ位置10〜100%の位置で、使用する最低のちょっと下ぐらいのPWM〜100%PWMみたいな感じの割り付けになると思います。
スイッチ付のボリュームならちょっと違うと思います。
以下の部分が、電圧読み取りの部分ですが、@〜Fの間で細工するということでしょうか?
改善したい点は、現在、ボリュームが0〜50%に部分では動作しないので、
50%から動作開始としたいです。
// アナログ値の変換と読込み処理関数
@ unsigned int adconv() {
A unsigned int temp;
B GO_nDONE = 1; // アナログ値読取り開始指示
C while (GO_nDONE); // 読取り完了まで待つ
D temp = ADRESH; //
E temp = (temp << 8) + ADRESL; //RA3で読み込んだ値をtempに代入
F return temp; //読み込んだtempをnumに返す
}
Re: 疑似手パ,中間報告
AD変換のプログラムの内、@を追加したら、
ボリューム0でも、いきなり電圧が出てよくなったのですが、
不安定です。3,2V
ボリュームが悪いのかな〜、プログラムかな〜、どこが悪いのか分かりませんか?
皆様方宜しくお願いします。
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
@ if(ADRES > 300 ) {
temp = ADRESH; //上位8bit
temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
return temp;} //読み込んだtempをnumに返す
}
ボリューム0でも、いきなり電圧が出てよくなったのですが、
不安定です。3,2V
ボリュームが悪いのかな〜、プログラムかな〜、どこが悪いのか分かりませんか?
皆様方宜しくお願いします。
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
@ if(ADRES > 300 ) {
temp = ADRESH; //上位8bit
temp = (temp << 8) + ADRESL; //RB3→RB4で読み込んだ値をtempに代入
return temp;} //読み込んだtempをnumに返す
}
Re: 疑似手パ,中間報告
こんな感じじゃないこと思います。
No.1377の@Aの部分に入れてください。
※ADCの値が50以上で動作。出力500(/1023)から。
if(num<50){
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}else{
num=(num-50)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
}
No.1377の@Aの部分に入れてください。
※ADCの値が50以上で動作。出力500(/1023)から。
if(num<50){
CCPR1L = 0;
CCP1CONbits.DC1B = 0;
}else{
num=(num-50)*(1023-500)/(1023-50)+500;
CCPR1L =num>>2 ;
CCP1CONbits.DC1B = num&3;
}
Re: 疑似手パ,中間報告
猛牛ロックさん駄目です。
途中から2.2V位出てそのまま、ほぼ一定です。
まだ、No1380の方が良いです。
右肩上がりで、1.4V〜約4.2Vでます。
途中から2.2V位出てそのまま、ほぼ一定です。
まだ、No1380の方が良いです。
右肩上がりで、1.4V〜約4.2Vでます。
Re: 疑似手パ,中間報告
> @ duty=500+num;//Duty比50%からスタート
> A if(duty > 500){
> CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
> CCP1CONbits.DC1B = num & 0b11;
ちゃんと↑の4行をに変えましたか?
追伸
あぁ、多分桁あふれですね。
num=(num-50.0)*(1023-500)/(1023-50)+500;
でどうでしょう?
> A if(duty > 500){
> CCPR1L = num / 4; // アナログ値からのデータでデューティ値を設定
> CCP1CONbits.DC1B = num & 0b11;
ちゃんと↑の4行をに変えましたか?
追伸
あぁ、多分桁あふれですね。
num=(num-50.0)*(1023-500)/(1023-50)+500;
でどうでしょう?
制御分について
皆さんこんばんは。
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〜 ず〜っと、制御文が並んでいます。
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〜 ず〜っと、制御文が並んでいます。
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);を使ってチャタリングを防止しようとしてますので,
その間,何もできないことになります。
割り込み等を使って,判断した方がよかったかもしれませんね。
>セレクター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);を使ってチャタリングを防止しようとしてますので,
その間,何もできないことになります。
割り込み等を使って,判断した方がよかったかもしれませんね。
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レジスタを使わないと誤動作するかもしれません。
> 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レジスタを使わないと誤動作するかもしれません。
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ですが、如何でしょうか?
Re: 制御分について
TRさん,猛牛ロックさん,こんばんは。
猛牛ロックさん,相変わらず,適切なアドバイスありがとうございます。
TRさん,16F88は,LATレジスタないと思います。
ですので,もしエラーになるようなら,間にアセンブラで,
nopをいれてやればいいようです。
asm("nop");→何もしない休みの時間です。
間に,
__delay_ms(1);
でもいいかもですね。
それと以前ポートをそれぞれに操作して,
思った結果がでないことがありました。
RA0=1;
はまともにうごかなくて,
PORTA=0b00000001;
のように書いたらまともに動いたことがあります。
猛牛ロックさん,相変わらず,適切なアドバイスありがとうございます。
TRさん,16F88は,LATレジスタないと思います。
ですので,もしエラーになるようなら,間にアセンブラで,
nopをいれてやればいいようです。
asm("nop");→何もしない休みの時間です。
間に,
__delay_ms(1);
でもいいかもですね。
それと以前ポートをそれぞれに操作して,
思った結果がでないことがありました。
RA0=1;
はまともにうごかなくて,
PORTA=0b00000001;
のように書いたらまともに動いたことがあります。
Re: 制御分について
maboさん、猛牛ロックさんこんばんは。
>__delay_ms(1);
気持ちって感じなんでしょうか?
で、素人考えですが、
セレクタSWの場合、チャタリング対策不要ということ。
88に、デジタル用出力として、LATレジスタがないとしたら、
RB6とかしてもいいんじゃないかと思います。
それだけ、88の動作速度が、最新型にあるLATレジスタを必要とするほど、早くないっていうことだと推測します。
ネット検索してもまだ、はっきりとはしません。
>__delay_ms(1);
気持ちって感じなんでしょうか?
で、素人考えですが、
セレクタSWの場合、チャタリング対策不要ということ。
88に、デジタル用出力として、LATレジスタがないとしたら、
RB6とかしてもいいんじゃないかと思います。
それだけ、88の動作速度が、最新型にあるLATレジスタを必要とするほど、早くないっていうことだと推測します。
ネット検索してもまだ、はっきりとはしません。
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);
より遙かに短い時間です。
私もよく分からないところあるのですが,
要は,レジスターの連続した操作をした場合,不具合が起きる可能性がある,ということだと思います。
>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);
より遙かに短い時間です。
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のデータシートより)
いえいえ、セレクタ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のデータシートより)
Re: 制御分について
皆さんおはようございます。
>asm("nop");
この意味を調べて分かりました。
使い方は、ICの応答待ちというのが狙いなんですね。
ワンクロック待ちというというので、飽くまでも、決まった時間を待つのかと思っていましたが、
ICの動作を待つという意味だったんですね。
>、「ノンショーティングタイプ」
すっかりと忘れていた言葉です。(笑
調べて思い出しました。
maboさんが以前に言っていたと思い出しました。
追記
早速 OSCCONレジスタも弄って4MHZに設定しました。
>asm("nop");
この意味を調べて分かりました。
使い方は、ICの応答待ちというのが狙いなんですね。
ワンクロック待ちというというので、飽くまでも、決まった時間を待つのかと思っていましたが、
ICの動作を待つという意味だったんですね。
>、「ノンショーティングタイプ」
すっかりと忘れていた言葉です。(笑
調べて思い出しました。
maboさんが以前に言っていたと思い出しました。
追記
早速 OSCCONレジスタも弄って4MHZに設定しました。
ファイルの追加方法
皆さんおはようございます。
これも皆様にとっては今更なのかも。
MPLAB IDEの操作方法で、
mainファイルを作り、追加でファイルを増やす方法が、
やっと分かりました。 下のページの中頃にありました。
今までどうしていたかというと、
テキストファイルに保存したファイルを、
MPLAB IDEのエディタにコピペしていました。
http://www.picfun.com/mplabx/mpxlab01.html
これも皆様にとっては今更なのかも。
MPLAB IDEの操作方法で、
mainファイルを作り、追加でファイルを増やす方法が、
やっと分かりました。 下のページの中頃にありました。
今までどうしていたかというと、
テキストファイルに保存したファイルを、
MPLAB IDEのエディタにコピペしていました。
http://www.picfun.com/mplabx/mpxlab01.html
疑似手パ
折角、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キーボードが作れるようです。
Re: 疑似手パ
何か凄そうなのができそうですね!
色々と詳しく教えてください。
自分は、何度も復習しています。
が、なかなか、進めません。
色々と詳しく教えてください。
自分は、何度も復習しています。
が、なかなか、進めません。
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ボードを使う予定ですから多少手続きは違うでしょうけど、やり方は同じです。
>> 何度も復習しています
私は「復習」というのはしたことが無いです。
作りたいものがまずあって、それを作るのにどうするか?だけですね。
ちゃんと動けば終わりですし、今一つ納得しないまま、というのもあります。
どちらかというと、過去のプログラムは見たくないです。
(勿論、見返すことはありますよ。)
良く落とすので、軽くて落としても壊れにくいのが良いです。
部材も、エンコーダはおもちゃエンコーダ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ボードを使う予定ですから多少手続きは違うでしょうけど、やり方は同じです。
>> 何度も復習しています
私は「復習」というのはしたことが無いです。
作りたいものがまずあって、それを作るのにどうするか?だけですね。
ちゃんと動けば終わりですし、今一つ納得しないまま、というのもあります。
どちらかというと、過去のプログラムは見たくないです。
(勿論、見返すことはありますよ。)
Re: 疑似手パ
猛牛ロックさん,TRさん,こんばんは。
猛牛ロックさん,新しい構想ですね。
是非,できあがり,教えてください。
>私は「復習」というのはしたことが無いです。
いいですねえ,私は,復習ではないのかもしれませんが,
ちょっと前のことを忘れてしまし,新しいもの作る時は,
またあれこれ調べ直すなんてこと何度もやってます。
年ですかね。
今年66才のもう,すっかり老人です。
気持ちだけは若いのですが・・・・・・。
猛牛ロックさん,新しい構想ですね。
是非,できあがり,教えてください。
>私は「復習」というのはしたことが無いです。
いいですねえ,私は,復習ではないのかもしれませんが,
ちょっと前のことを忘れてしまし,新しいもの作る時は,
またあれこれ調べ直すなんてこと何度もやってます。
年ですかね。
今年66才のもう,すっかり老人です。
気持ちだけは若いのですが・・・・・・。
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時間もあればβ版はできるでしょうけど、その前に基板(配線)ですね。
CNC用PCが壊れる-続
TRさん,猛牛ロックさん,こんばんは。
猛牛ロックさん,新しく購入なさったPCいかがですが。
XPの再インストールなさったということですが,HDのリカバリー-領域からの,インストールですか。
それとも,XPのCD等からですか。
確かXPから,インストール中に,アックティべーションというか,認証が必要だったと思いますが,XPでまだできるのでしょうか。
再起動やら,不安定なのは,きっと,HDのクラッシュ等が原因でしょうかね。
きっと,システム領域の破損等が原因でしょうかね。プラス,
メーモリー等のハードの不具合でしょうかね。
インストールCDからとかのインストールなら,HDの交換等もかんがえられますけど,動けばいいけど,動かないと,無駄になりますからね。
私は,幸い,日常使ってるのはノートばっかりなので,今のところ心配ありません。
猛牛ロックさん,新しく購入なさったPCいかがですが。
XPの再インストールなさったということですが,HDのリカバリー-領域からの,インストールですか。
それとも,XPのCD等からですか。
確かXPから,インストール中に,アックティべーションというか,認証が必要だったと思いますが,XPでまだできるのでしょうか。
再起動やら,不安定なのは,きっと,HDのクラッシュ等が原因でしょうかね。
きっと,システム領域の破損等が原因でしょうかね。プラス,
メーモリー等のハードの不具合でしょうかね。
インストールCDからとかのインストールなら,HDの交換等もかんがえられますけど,動けばいいけど,動かないと,無駄になりますからね。
私は,幸い,日常使ってるのはノートばっかりなので,今のところ心配ありません。
Re: CNC用PCが壊れる-続
今日新しいPC(といっても5,6年物ですけど)が届きました。
動きにもっさり感は全くなく、そこは気に入りました。
だけども、ウィンドウズアップデートは何故かエラー。
再起動させたつもりが、そのままシャットダウンしたりと、ちょっと不安も感じました。
ただ、基本的にオフラインで、CNC専用、24時間点けっぱなしにする予定です。
MACHの方は2,30分のコードを空中で試した見たのですが、取りあえず問題無さそうでした。
壊れたPCの方は原因は判っていません。
もう11年も使ったので、一部を直しても、直ぐに別の箇所おかしくなってくるだろう、という判断です。
実際、既にOSの再インストール(CDからです)やMACHの再インストール等でだいぶ時間を無駄にしてしまいました。
最初は数日はさくさく動いたのですが、突然フリーズ。それからはより頻繁にフリーズや再起動、etc。
動きにもっさり感は全くなく、そこは気に入りました。
だけども、ウィンドウズアップデートは何故かエラー。
再起動させたつもりが、そのままシャットダウンしたりと、ちょっと不安も感じました。
ただ、基本的にオフラインで、CNC専用、24時間点けっぱなしにする予定です。
MACHの方は2,30分のコードを空中で試した見たのですが、取りあえず問題無さそうでした。
壊れたPCの方は原因は判っていません。
もう11年も使ったので、一部を直しても、直ぐに別の箇所おかしくなってくるだろう、という判断です。
実際、既にOSの再インストール(CDからです)やMACHの再インストール等でだいぶ時間を無駄にしてしまいました。
最初は数日はさくさく動いたのですが、突然フリーズ。それからはより頻繁にフリーズや再起動、etc。
Re: CNC用PCが壊れる-続
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
猛牛ロックさんは,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
Re: CNC用PCが壊れる-続
Re: CNC用PCが壊れる-続
> 猛牛ロックさんは、プロだったんですか?
モノづくりはプロですけど、CNCや電子工作はそのレベルじゃないですね。
まぁ、仕事の一部です。
(CNCは、ロックヒルさんとフォルムさんのサイトを見て、我慢できずに始めました。
壊れたPCが初代ですから、11年前の事です。
マイコンは5年前からですね)
> XPがOSの場合,運用しっぱなしにすると,ゴミ?がたまって
これって埃の事じゃなくてメモリーの事ですよね?
WIN98までは定期的に再インストールでしたね。
XPも使っていると重くなって再起動はしたりしますよ。
電気屋が工事するから止めて帰る事もあります。
この間ネットにも繋がずにCNCの事位しか使っていないので、あまり変な事にはならないのだと思います。
> 残念ながら、テストの方は、動作が不安定で使い物になりません。
> ま〜、書き込みはできるので、捨てないで使います。
重要な事は、
・PGC、PGDにはプルダウン抵抗4.7kΩが付いている(PICKIT3の事です)
・PICKIT3は30mAしか電流供給能力が無い
といった事です。
書き込みが出来ているのなら、PICKITは抜いて、外部電源のみに切り替える、という手もあります。
動作が不安定の場合は回路の場合もありますけど、プログラムの場合もあります。
モノづくりはプロですけど、CNCや電子工作はそのレベルじゃないですね。
まぁ、仕事の一部です。
(CNCは、ロックヒルさんとフォルムさんのサイトを見て、我慢できずに始めました。
壊れたPCが初代ですから、11年前の事です。
マイコンは5年前からですね)
> XPがOSの場合,運用しっぱなしにすると,ゴミ?がたまって
これって埃の事じゃなくてメモリーの事ですよね?
WIN98までは定期的に再インストールでしたね。
XPも使っていると重くなって再起動はしたりしますよ。
電気屋が工事するから止めて帰る事もあります。
この間ネットにも繋がずにCNCの事位しか使っていないので、あまり変な事にはならないのだと思います。
> 残念ながら、テストの方は、動作が不安定で使い物になりません。
> ま〜、書き込みはできるので、捨てないで使います。
重要な事は、
・PGC、PGDにはプルダウン抵抗4.7kΩが付いている(PICKIT3の事です)
・PICKIT3は30mAしか電流供給能力が無い
といった事です。
書き込みが出来ているのなら、PICKITは抜いて、外部電源のみに切り替える、という手もあります。
動作が不安定の場合は回路の場合もありますけど、プログラムの場合もあります。
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;
}
}
}
やはり、猛牛ロックさんは、その道の人でしたか、通りでお詳しいはずです。
ご自分の好きな道を進んでいるなんて凄いです。
自作のボードですが、今一歩です。
具体的には、
ほんとに不思議なのですが、
以下のプログラムで操作した場合、
目標の動作
@ 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;
}
}
}
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出力」の切り替えで書き込んでいるような気がします。
取説でも、外部プルアップを付けては駄目と書いてあります。
Re: CNC用PCが壊れる-続
そうでしたか。
PIC端子の電圧を図ると、1.8Vくっらいだったかな〜。
低ったので、10kオームのプルアップをしたら、
安定して書き込めました。
No1335の回路図がそれです。
このまま行きます。
PIC端子の電圧を図ると、1.8Vくっらいだったかな〜。
低ったので、10kオームのプルアップをしたら、
安定して書き込めました。
No1335の回路図がそれです。
このまま行きます。
Re: CNC用PCが壊れる-続
追記
1回路2接点のスイッチを使って直します。
書き込み時に外部プルアップ抵抗でプルさせる
スイッチオンの時は、スイッチの接点をPICからPICに切り替えます。
この方が、内部プルアップの面で他の入力端子と統一できます。
1回路2接点のスイッチを使って直します。
書き込み時に外部プルアップ抵抗でプルさせる
スイッチオンの時は、スイッチの接点をPICからPICに切り替えます。
この方が、内部プルアップの面で他の入力端子と統一できます。
Re: CNC用PCが壊れる-続
皆さんこんばんは。
お陰様で完成しました。
CLKとRB6へ繋がっているプルアップアップ抵抗は、MPLABの言うように
止めました。 写真の青で×をしたプルアップ抵抗です。
でも、その代わりに、2回路のSWを付けて、RB6をローにする為のSWとしての役割と、
RB6とPIC3のCLKへの導通の機能を分離してやりました。
これで、大丈夫と思います。
自作書き込みボードはこれで2個目です。
使い分けをします。
PORTA側とPORTB側を入れ替えるためです。
実際は、PICの方向を入れ替えて書き込めます。
お陰様で完成しました。
CLKとRB6へ繋がっているプルアップアップ抵抗は、MPLABの言うように
止めました。 写真の青で×をしたプルアップ抵抗です。
でも、その代わりに、2回路のSWを付けて、RB6をローにする為のSWとしての役割と、
RB6とPIC3のCLKへの導通の機能を分離してやりました。
これで、大丈夫と思います。
自作書き込みボードはこれで2個目です。
使い分けをします。
PORTA側とPORTB側を入れ替えるためです。
実際は、PICの方向を入れ替えて書き込めます。
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が必要なときでもこれを使いますね。
結構重宝しますよ。
Re: CNC用PCが壊れる-続
ご披露して頂きましては、有り難うございます。
×は図面に記載した抵抗は止めました。
×を付けた理由はありますが、誤解してしまうとの事なので、今から、削除します。
RB6は1回路2接点を使い、書き込み時のみPic3と導通します。
Pic3のVPPですが、
書き込み時はRA5と切り放すのですか?
スイッチオンはなんとなく、今までの使い勝手から選びました。
ただ、端子を付けたので分岐してスイッチの種類は変えられます。LEDにも繋げられます。
書き込み時の電源取りは、ツールラボの記事をまねました。
電源取りは、外部やpic3からでもいいというものでした。
タクトスイッチの情報有り難うございます。
×は図面に記載した抵抗は止めました。
×を付けた理由はありますが、誤解してしまうとの事なので、今から、削除します。
RB6は1回路2接点を使い、書き込み時のみPic3と導通します。
Pic3のVPPですが、
書き込み時はRA5と切り放すのですか?
スイッチオンはなんとなく、今までの使い勝手から選びました。
ただ、端子を付けたので分岐してスイッチの種類は変えられます。LEDにも繋げられます。
書き込み時の電源取りは、ツールラボの記事をまねました。
電源取りは、外部やpic3からでもいいというものでした。
タクトスイッチの情報有り難うございます。
Re: CNC用PCが壊れる-続
> Pic3のVPPですが、
> 書き込み時はRA5と切り放すのですか?
いいえ、そのSW位置だとどちらでもRA5とは短絡しています。
問題なのはGNDと短絡する事です。タクトスイッチなら、わざわざ押しながら書き込むことは無いでしょうけど、
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。
※私が以前言ったのは、切り離すためのDIPスイッチのようなものを付けて、
更に通常のタクトスイッチ、或いはLEDを付ければ間違いない、という意味です。
> 電源取りは、外部やpic3からでもいいというものでした。
はい。外部電源を使う方が安定すると思います。
ただし、等電圧以上の電源を使う必要があります。(USBの電圧を使うのが良いと思います)
例えば、4.5Vの電池を繋いでも4.5Vの電池には逆に充電されるように働くので注意してください。
(4.5V以下に下降して、初めて電池から電流が流れだします)
> 書き込み時はRA5と切り放すのですか?
いいえ、そのSW位置だとどちらでもRA5とは短絡しています。
問題なのはGNDと短絡する事です。タクトスイッチなら、わざわざ押しながら書き込むことは無いでしょうけど、
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。
※私が以前言ったのは、切り離すためのDIPスイッチのようなものを付けて、
更に通常のタクトスイッチ、或いはLEDを付ければ間違いない、という意味です。
> 電源取りは、外部やpic3からでもいいというものでした。
はい。外部電源を使う方が安定すると思います。
ただし、等電圧以上の電源を使う必要があります。(USBの電圧を使うのが良いと思います)
例えば、4.5Vの電池を繋いでも4.5Vの電池には逆に充電されるように働くので注意してください。
(4.5V以下に下降して、初めて電池から電流が流れだします)
Re: CNC用PCが壊れる-続
>問題なのはGNDと短絡する事です。タクトスイッチなら、わざわざ押しながら書き込むことは無いでしょうけど、
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。
書き込む時、スライドスイッチにより、
RA5端子はGNDと絶縁し、VPPと導通しています。
これでいいわけですね。
オルタネイトスイッチなら忘れて短絡状態で書き込みを始める危険性があります。
書き込む時、スライドスイッチにより、
RA5端子はGNDと絶縁し、VPPと導通しています。
これでいいわけですね。
Re: CNC用PCが壊れる-続

今回、キットであそうぼうの書き込みボードが故障したのを契機として自作しました。
原因が分かりませんが、書き込めなくなりました。
自作書き込みテストボードのチョイ使用インプレをしたいと思います。
書き込み時の出力側LEDを見た感じ、
PIC3に繋がっているRB7とPIC3には繋がっていないRA4が、書き込み中にちかちかと点滅をしているので、
電流が漏れているんだと思います。
けれども、書き込み自体は、問題ないです。
それと、秋月から買った、ゼロプレッシャーICソケットのお陰で、抜き差しが楽です。
自分のように、プログラムが苦手な人にとって、PICの抜き差しが多くなります。
でもその煩わさが無くなって、ストレスが減りました。
その他
入力側にピンソケットを付けたので、ここから、分岐をしLED等にも配線できます。
今まで、やってきた中で、こうなったらいいな〜とかを具現化しました。
色々とご意見はあろうかと思いますが、今のところ気に入っています。
結果オーライ
・Pic3とつながっているRB7ですが、書き込み時に影響としてLEDがちかちか光る程度でよかったです。
やり過ぎと思った点
出力側に2列10Pピンソケットを跨いで、LEDと繋がっています。書き込めなくなるかもしれないと思ったからです。
でも、そういった事は有りませんでした。 従って、入力側と同じ1列ピンソケットでよかったと思います。
最後に、猛牛ロックさんに、色々とアドバイスを頂きまして有難うございました。
自分一人では此処まで出来ませんでした。
ボードの裏側は、恥ずかしいので、写真は有りません。(笑
- JoyfulNote v6.02 -
++ Edited by Hamel ++
Home
Item
新規投稿
アルバム
ワード検索
過去ログ
Topic
Notice
Admin
猛牛ロック
2018/12/23(Sun) 10:23
mabo 



