48時間以内の記事は で表示されます
疑似手パ
折角、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キーボードが作れるようです。
一応、画像のような構想です。
大体、この位あれば原点だしはその場で出来ると思うのですけど。
ただ困ったことに、当初考えていた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時間もあればβ版はできるでしょうけど、その前に基板(配線)ですね。
つまり、実際には、パルスを送るのではなく、キーボード操作で処理しています。
エンコーダで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出力」の切り替えで書き込んでいるような気がします。
取説でも、外部プルアップを付けては駄目と書いてあります。
そうなると、外部プルアップの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が必要なときでもこれを使いますね。
結構重宝しますよ。
×だけだと、短絡なのか開放か判らないので消した方が良いです。
で、その回路だと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列ピンソケットでよかったと思います。
最後に、猛牛ロックさんに、色々とアドバイスを頂きまして有難うございました。
自分一人では此処まで出来ませんでした。
ボードの裏側は、恥ずかしいので、写真は有りません。(笑
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システムの変更になりそうです。
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システムの変更になりそうです。
Re: CNC用PCが壊れる
猛牛ロックさん,こんばんは。
前スレでは,細かい解説ありがとうございます。いつもながら勉強になります。
時間がたつと,しかたないんでしょうかね。
それにしても,だんだん,以前の環境が手に入りにくくなりますね。
一番のネックは,シリアルポートでしょうかね。
これ,なければ,ノートでも十分なんですけどね。
最悪
PC→→ 「スムーズステッパー」 →→ CNC
みたいな環境でシリアルポート省略かな。
以前,ノートのシリアルポートでも動いたの記事で,私の環境であれこれやりましたが,結局ノートのシリアルポートはだめでしたね。
それに,Mach3もいつまでもつのでしょうかね。
Mach4は,確か,インストールできるPCが一台かなんかだったような気がします。
久しぶりにSSTのHP見てみましたが,
https://warp9td.com/index.php/sw#WindowsDriverUss
ドライバーは,windoes10のものまであるんですね。
前スレでは,細かい解説ありがとうございます。いつもながら勉強になります。
時間がたつと,しかたないんでしょうかね。
それにしても,だんだん,以前の環境が手に入りにくくなりますね。
一番のネックは,シリアルポートでしょうかね。
これ,なければ,ノートでも十分なんですけどね。
最悪
PC→→ 「スムーズステッパー」 →→ CNC
みたいな環境でシリアルポート省略かな。
以前,ノートのシリアルポートでも動いたの記事で,私の環境であれこれやりましたが,結局ノートのシリアルポートはだめでしたね。
それに,Mach3もいつまでもつのでしょうかね。
Mach4は,確か,インストールできるPCが一台かなんかだったような気がします。
久しぶりにSSTのHP見てみましたが,
https://warp9td.com/index.php/sw#WindowsDriverUss
ドライバーは,windoes10のものまであるんですね。
Re: CNC用PCが壊れる
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のようにしたのかもしれません。
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のようにしたのかもしれません。
Re: CNC用PCが壊れる
> (temp << 8)の意味を知りたいのです。
> <<は、tempのビット列を8ビット右へシフトすると思います。
8ビット「左シフト<<」です。
よくあるのが
unsigned int adc=(ADRESH<<8)+ADRESL;
です。右詰めなら10ビット、左詰めなら16ビット(下位6bitは0)になります。
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。
> <<は、tempのビット列を8ビット右へシフトすると思います。
8ビット「左シフト<<」です。
よくあるのが
unsigned int adc=(ADRESH<<8)+ADRESL;
です。右詰めなら10ビット、左詰めなら16ビット(下位6bitは0)になります。
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。
Re: CNC用PCが壊れる
>です。右詰めなら10ビット、左詰めなら16ビット(下位6bitは0)になります。
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。
例は、右詰になっていますが
ということは、ADコンバーター設定でコンバーターに読み込ませる設定を左詰めにしたから、
右に8ビット戻したということですか。
例
// ADコンバータ設定
ADCON0 = 0b00000001; // RA0をADコンバータピンにし、ADコンバータ機能をEbableに
ADCON1 = 0b10010000; // 結果数値は右寄せ、
ADRES「H」レジスタなので、単純に「その位置(桁)に戻した」ということです。
例は、右詰になっていますが
ということは、ADコンバーター設定でコンバーターに読み込ませる設定を左詰めにしたから、
右に8ビット戻したということですか。
例
// ADコンバータ設定
ADCON0 = 0b00000001; // RA0をADコンバータピンにし、ADコンバータ機能をEbableに
ADCON1 = 0b10010000; // 結果数値は右寄せ、
Re: CNC用PCが壊れる
> ということは、ADコンバーター設定でコンバーターに読み込ませる設定を左詰めにしたから、
> 右に8ビット戻したということですか。
ADRESHとADRESLの桁を合わせたと言う事です。右揃え、左揃えは関係ありません。
元々の桁が違うので、それをもとにもどしただけです。
10進数で言えば、ADRESHは万の単位、ADRESLは一の単位だと思ってください。
98765432という数値が、9876と5432の2つに分かれてくるわけです。で、9876を左に4つシフトさせて
98760000にしてから5432を足して、元に戻します。
> 右に8ビット戻したということですか。
ADRESHとADRESLの桁を合わせたと言う事です。右揃え、左揃えは関係ありません。
元々の桁が違うので、それをもとにもどしただけです。
10進数で言えば、ADRESHは万の単位、ADRESLは一の単位だと思ってください。
98765432という数値が、9876と5432の2つに分かれてくるわけです。で、9876を左に4つシフトさせて
98760000にしてから5432を足して、元に戻します。
Re: CNC用PCが壊れる
Re: CNC用PCが壊れる
TRさん,猛牛ロックさん,こんばんは。
猛牛ロックさん,解説ありがとうございます。
なんか,自分の前に作ったプログラム,だしてしまいましたが,
このプログラム,通常のやりかたではないですね。
PWMといいつつ,PR2をいじって,周期をかえてましたが。
PWMの本来である,振幅を変更してないので,邪道かもですね。
目的がステッピングモーターの制御だったので,苦肉の策でした。
猛牛ロックさん,解説ありがとうございます。
なんか,自分の前に作ったプログラム,だしてしまいましたが,
このプログラム,通常のやりかたではないですね。
PWMといいつつ,PR2をいじって,周期をかえてましたが。
PWMの本来である,振幅を変更してないので,邪道かもですね。
目的がステッピングモーターの制御だったので,苦肉の策でした。
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を更に足します
割合で使う場合も、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を更に足します
Re: CNC用PCが壊れる
temp = ADRESH;
temp = (temp << 8) + ADRESL
上記の式は、ADRESHを8bit右にずらしてADRESLと合体させてADRESの10ビットにするといっているが、
結果は、ADRESHの内6ビットだけ消えて、
残りの2ビットとADRESLと合体し、10ビットとなるわけですね?
temp = (temp << 8) + ADRESL
上記の式は、ADRESHを8bit右にずらしてADRESLと合体させてADRESの10ビットにするといっているが、
結果は、ADRESHの内6ビットだけ消えて、
残りの2ビットとADRESLと合体し、10ビットとなるわけですね?
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関数を書き換えてしまうと、振り返った時に「このソースで使ったのはどっちだったっけ?」となるわけです。
だから違います。「<<」は見ての通り左へのビットシフトです。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関数を書き換えてしまうと、振り返った時に「このソースで使ったのはどっちだったっけ?」となるわけです。
動作しなくなりました。
皆さんこんばんは。
PIC/ですが、今日秋月から16F1827が届きました。 16F627Aより安かったです。
これから、頑張りたいと思います。
それで、いきなりなんですが、以前、動作したはずの以下のプログラムですが、
まったく動作しません。
2日間見ましたが、ダメでした。
どうしてなんでしょうか??
すみませんが見ていただけますか。
宜しくお願いします。
動作
可変抵抗 RA0に接続
RB3に接続のLEDが可変抵抗により調光する。
/*PWM機能によりRB3のLEDで滑らかに調光。可変抵抗で制御 RA0可変抵抗接続*/
// PIC16F88 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB3 // CCP1 Pin Selection bit (CCP1 function on RB3)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// CONFIG2
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode enabled)
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ 4000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を4MHzに設定
PORTA = 0xFF;
PORTB = 0xFF;
ANSEL = 0b00000011; //RA0をアナログピンに設定
// 入出力設定
TRISA = 0b00000011; // RA0(AN0)はアナログで読み取りピン(入力)
TRISB = 0x00; //全て出力端子
// ADコンバータ設定
ADCON0 = 0b00000001; // RA0をADコンバータピンにし、ADコンバータ機能をEbableに
ADCON1 = 0b10000000; // 結果数値は右寄せ、ADコンバータクロックはFOSC/2、基準電圧はVDD
//変数宣言
unsigned int num;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
// アナログ値の変換と読込み処理関数 呼び出し
num = adconv(); //RA0から電圧を読み込んだ値をtempをnumに代入
CCPR1L = num / 4; // 4で割って上位8ビットを取り出しアナログ値からのデータでデューティ値を設定
__delay_ms(10);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
ADCON0bits.GO_DONE = 1; //AD変換開始
while (ADCON0bits.GO_DONE); //変換完了待ち
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA0で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
// RB3端子を出力端子に設定
TRISBbits.TRISB3 = 0;
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 0b11111111;//PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.CCP1X = 0;
CCP1CONbits.CCP1Y = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
PIC/ですが、今日秋月から16F1827が届きました。 16F627Aより安かったです。
これから、頑張りたいと思います。
それで、いきなりなんですが、以前、動作したはずの以下のプログラムですが、
まったく動作しません。
2日間見ましたが、ダメでした。
どうしてなんでしょうか??
すみませんが見ていただけますか。
宜しくお願いします。
動作
可変抵抗 RA0に接続
RB3に接続のLEDが可変抵抗により調光する。
/*PWM機能によりRB3のLEDで滑らかに調光。可変抵抗で制御 RA0可変抵抗接続*/
// PIC16F88 Configuration Bit Settings
// 'C' source line config statements
// CONFIG1
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF // Low-Voltage Programming Enable bit (RB3 is digital I/O, HV on MCLR must be used for programming)
#pragma config CPD = OFF // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB3 // CCP1 Pin Selection bit (CCP1 function on RB3)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
// CONFIG2
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor enabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode enabled)
#include <xc.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ 4000000
// プロトタイプ宣言
void InitPWM(void);
void InitTimer2(void);
unsigned int adconv(void);
// メイン関数
void main(void) {
OSCCON = 0b0110101; //クロック周波数を4MHzに設定
PORTA = 0xFF;
PORTB = 0xFF;
ANSEL = 0b00000011; //RA0をアナログピンに設定
// 入出力設定
TRISA = 0b00000011; // RA0(AN0)はアナログで読み取りピン(入力)
TRISB = 0x00; //全て出力端子
// ADコンバータ設定
ADCON0 = 0b00000001; // RA0をADコンバータピンにし、ADコンバータ機能をEbableに
ADCON1 = 0b10000000; // 結果数値は右寄せ、ADコンバータクロックはFOSC/2、基準電圧はVDD
//変数宣言
unsigned int num;
// PWMモード設定関数の呼び出し
InitPWM();
// タイマ2設定関数の呼び出し
InitTimer2();
while (1) {
// アナログ値の変換と読込み処理関数 呼び出し
num = adconv(); //RA0から電圧を読み込んだ値をtempをnumに代入
CCPR1L = num / 4; // 4で割って上位8ビットを取り出しアナログ値からのデータでデューティ値を設定
__delay_ms(10);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {
unsigned int temp;
ADCON0bits.GO_DONE = 1; //AD変換開始
while (ADCON0bits.GO_DONE); //変換完了待ち
temp = ADRESH; //
temp = (temp << 8) + ADRESL; //RA0で読み込んだ値をtempに代入
return temp; //読み込んだtempをnumに返す
}
// PWMモード設定関数
void InitPWM(void) {
// RB3端子を出力端子に設定
TRISBbits.TRISB3 = 0;
// CCPのモードをPWMモードに設定
CCP1CONbits.CCP1M3 = 1;
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M1 = 0;
CCP1CONbits.CCP1M0 = 0;
// 周期を255μ秒に設定(PR2 + 1μ秒)×1/(動作処理速度÷4)
PR2 = 0b11111111;//PR2レジスタ8bit0~255
// デューティーサイクルを0msで初期化
CCPR1L = 0;
CCP1CONbits.CCP1X = 0;
CCP1CONbits.CCP1Y = 0;
}
// タイマ2設定関数
void InitTimer2(void) {
// プリスケーラ値を1に設定
T2CONbits.T2CKPS1 = 0;
T2CONbits.T2CKPS0 = 0;
// TMR2レジスタをクリア
TMR2 = 0;
// タイマ2起動
T2CONbits.TMR2ON = 1;
}
Re: 動作しなくなりました。
TRさん,猛牛ロックさん,こんばんは。
猛牛ロックさん,前スレ,詳しい解説ありがとうございます。
いつもながら,勉強になります。
TRさん,頑張ってられますね。
細かい原因はわからないのですが,以前私も,PWMとAD変換の組み合わせで,はまりました。
私のプログラムがうまく行かなかった原因は,
http://mabo52.sakura.ne.jp/index.php?c=7-11&page=2
にも書きましたが,周辺機器割り込み(拡張割り込み?)を許可しないためでした。
多分うまく動いていた私のプログラム掲載します。
ただ,今,見返してみて,なんでこんなことしたのかと,
忘れていること多いです。
このプログラム,かない古い環境でのものなので,
手直ししないと動かないと思います。
//************************************
//16F88 HI-TECH C v.9.83
//RA0(AN0)の入力電圧をA/D変換
//AD変換後割り込みで、結果をLCD表示
//PWMに取り込んでステッピングモーターを無段階にコントロール
// 約1khz〜240Hz
// 2014−11−21〜
//************************************
#define _LEGACY_HEADERS
#include "pic.h"
#include "stdlib.h"
#include "lcd.h"
#define _XTAL_FREQ 8000000
__CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
unsigned int adconv(void);
void set_duty(unsigned int);
static void interrupt isr(void);
unsigned int tmp;
unsigned int temp1;
unsigned char temp2;
unsigned int dummy;
unsigned int i;
unsigned int cnt1;
char str[7];
void main(void){
//OSCCON = 0x60;// 内蔵OSC 4MHz
OSCCON = 0x50;// 内蔵OSC 2MHz
ADCS2 = 0;//AD変換のクロック選択
ADCS1 = 0;//001で2.0μs
ADCS0 = 1;//
//ADFM = 1;// AD変換結果は右詰めで格納
ADFM = 0;// AD変換結果は左詰めで格納
VCFG1 = 0;// 基準電圧はVddとVss
VCFG0 = 0;
ANSEL = 0b00000001;// RA0(AN0)はアナログ
TRISA = 0b00000001;// RA0(AN0)入力
TRISB = 0b00000000;// すべて出力
PORTA = 0b00000000;// すべてlow
PORTB = 0b00000000;// すべてlow
CCP1CON = 0b00001100; // PWMモードにする
T2CON = 0b00000111; // プリスケール16
set_duty(1);//デューティーの設定 DC1{CCPR1L・CCP1CON(5:4)}*Tosc(クロック)*プリスケラ-
// DC1*0.25usec*16=5 DC1=1.25
lcd_init();//SD1602の初期化4
ADIF = 0;//AD割り込みフラグクリアー
ADIE = 1;//AD割り込み許可
PEIE=1;//拡張割り込み許可(これがないとAD変換後の割り込みができない)
GIE= 1;//割り込み全体の許可
while (1){
tmp = adconv();//AD変換 結果をtmpに格納
//if(tmp>60){PR2=tmp;}//PWMの設定 PR2 = (PWM周期 / 4 * Tosc * TMR2プリスケール値) - 1
//if(tmp<60){PR2=60;} //PR2に60〜255を代入
if(tmp>=30){PR2=tmp;}//PWMの設定 PR2 = (PWM周期 / 4 * Tosc * TMR2プリスケール値) - 1
if(tmp<30){PR2=30;} //PR2に60〜255を代入
}
}
unsigned int adconv(void){
CHS2 = 0;//AD変換ポート設定
CHS1 = 0;//000でRA0
CHS0 = 0;//
ADON = 1;//AD変換ON
__delay_us(20);//アクイジション時間 20us
GODONE = 1;//AD変換開始
while(GODONE);//変換完了待ち
return (ADRESH) ;//変換結果を返す
}
void set_duty(unsigned int duty){//DUTYの設定
unsigned int temp1 ;
unsigned char temp2 ;
temp1 = duty ;
temp1 >>= 2 ;
temp2 = temp1 & 0xff;
CCPR1L = temp2 ;
temp1 = duty ;
temp1 <<= 4 ;
temp2 = temp1 | 0x0c ;
CCP1CON = temp2 ;
}
static void interrupt isr(void){
if(ADIF == 1){//AD変換後の割り込みでLCDに表示
itoa(str,tmp,10);//
lcd_clear();//表示クリア
lcd_goto(0);//カーソルを0行目の先頭に移動する
lcd_puts("PR2=");
lcd_puts(str);
__delay_ms(10);//10msの時間待ち
ADIF = 0;
}
}
猛牛ロックさん,前スレ,詳しい解説ありがとうございます。
いつもながら,勉強になります。
TRさん,頑張ってられますね。
細かい原因はわからないのですが,以前私も,PWMとAD変換の組み合わせで,はまりました。
私のプログラムがうまく行かなかった原因は,
http://mabo52.sakura.ne.jp/index.php?c=7-11&page=2
にも書きましたが,周辺機器割り込み(拡張割り込み?)を許可しないためでした。
多分うまく動いていた私のプログラム掲載します。
ただ,今,見返してみて,なんでこんなことしたのかと,
忘れていること多いです。
このプログラム,かない古い環境でのものなので,
手直ししないと動かないと思います。
//************************************
//16F88 HI-TECH C v.9.83
//RA0(AN0)の入力電圧をA/D変換
//AD変換後割り込みで、結果をLCD表示
//PWMに取り込んでステッピングモーターを無段階にコントロール
// 約1khz〜240Hz
// 2014−11−21〜
//************************************
#define _LEGACY_HEADERS
#include "pic.h"
#include "stdlib.h"
#include "lcd.h"
#define _XTAL_FREQ 8000000
__CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO);
unsigned int adconv(void);
void set_duty(unsigned int);
static void interrupt isr(void);
unsigned int tmp;
unsigned int temp1;
unsigned char temp2;
unsigned int dummy;
unsigned int i;
unsigned int cnt1;
char str[7];
void main(void){
//OSCCON = 0x60;// 内蔵OSC 4MHz
OSCCON = 0x50;// 内蔵OSC 2MHz
ADCS2 = 0;//AD変換のクロック選択
ADCS1 = 0;//001で2.0μs
ADCS0 = 1;//
//ADFM = 1;// AD変換結果は右詰めで格納
ADFM = 0;// AD変換結果は左詰めで格納
VCFG1 = 0;// 基準電圧はVddとVss
VCFG0 = 0;
ANSEL = 0b00000001;// RA0(AN0)はアナログ
TRISA = 0b00000001;// RA0(AN0)入力
TRISB = 0b00000000;// すべて出力
PORTA = 0b00000000;// すべてlow
PORTB = 0b00000000;// すべてlow
CCP1CON = 0b00001100; // PWMモードにする
T2CON = 0b00000111; // プリスケール16
set_duty(1);//デューティーの設定 DC1{CCPR1L・CCP1CON(5:4)}*Tosc(クロック)*プリスケラ-
// DC1*0.25usec*16=5 DC1=1.25
lcd_init();//SD1602の初期化4
ADIF = 0;//AD割り込みフラグクリアー
ADIE = 1;//AD割り込み許可
PEIE=1;//拡張割り込み許可(これがないとAD変換後の割り込みができない)
GIE= 1;//割り込み全体の許可
while (1){
tmp = adconv();//AD変換 結果をtmpに格納
//if(tmp>60){PR2=tmp;}//PWMの設定 PR2 = (PWM周期 / 4 * Tosc * TMR2プリスケール値) - 1
//if(tmp<60){PR2=60;} //PR2に60〜255を代入
if(tmp>=30){PR2=tmp;}//PWMの設定 PR2 = (PWM周期 / 4 * Tosc * TMR2プリスケール値) - 1
if(tmp<30){PR2=30;} //PR2に60〜255を代入
}
}
unsigned int adconv(void){
CHS2 = 0;//AD変換ポート設定
CHS1 = 0;//000でRA0
CHS0 = 0;//
ADON = 1;//AD変換ON
__delay_us(20);//アクイジション時間 20us
GODONE = 1;//AD変換開始
while(GODONE);//変換完了待ち
return (ADRESH) ;//変換結果を返す
}
void set_duty(unsigned int duty){//DUTYの設定
unsigned int temp1 ;
unsigned char temp2 ;
temp1 = duty ;
temp1 >>= 2 ;
temp2 = temp1 & 0xff;
CCPR1L = temp2 ;
temp1 = duty ;
temp1 <<= 4 ;
temp2 = temp1 | 0x0c ;
CCP1CON = temp2 ;
}
static void interrupt isr(void){
if(ADIF == 1){//AD変換後の割り込みでLCDに表示
itoa(str,tmp,10);//
lcd_clear();//表示クリア
lcd_goto(0);//カーソルを0行目の先頭に移動する
lcd_puts("PR2=");
lcd_puts(str);
__delay_ms(10);//10msの時間待ち
ADIF = 0;
}
}
TRISAとTRISB
maboさんこんばんは。
F1827お使いということでお聞きしたいことがあります。
TRISAを出力にして、TRISBを入力にした時
何か注意点はありますか?
というのも、タイマー0割込みで、上手くいった下記プログラムを使って、入力側と出力側を入れ替えたのですが、上手く動作しなくなりました。
お気づきの点がありましたら、教えてください。
// タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RB3SW ONで5秒間点灯
// 'C' source line config statements
#include <xc.h>
// 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 = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // 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 = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // 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)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
volatile int event;
// プロトタイプ宣言
void InitInterTimer0(void);
// メイン関数
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;
// 入出力設定
TRISA = 0b01000000;
TRISB = 0x00;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
event = 0; //初期値イベント無しRB3ロー
// 永久ループ
while (1) {
if (event == 0) {
RB3 = 0;
}
if (event == 1) {
RB3 = 1;
}
}
}
// 割込みサービスルーチン
static void interrupt isr() {
if (RA6 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
event = 1;
}
if(RA6==1&& event==1){//もしRA6が放されていて、イベントがまだやっていたら、enentフラグを0にする
event=0;
} // タイマ0割込みフラグをクリア
T0IF = 0;
}
// タイマ0割込み設定関数
void InitInterTimer0(void) {
OPTION_REG = 0b000000000; //プリスケラ000 5ビット=0内部クロック使用 WDTは使わない
TMR0 = 0x00;
INTCONbits.TMR0IF = 0; //TMR0フラグクリアー
INTCONbits.TMR0IE = 1; //TMR0割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
}
F1827お使いということでお聞きしたいことがあります。
TRISAを出力にして、TRISBを入力にした時
何か注意点はありますか?
というのも、タイマー0割込みで、上手くいった下記プログラムを使って、入力側と出力側を入れ替えたのですが、上手く動作しなくなりました。
お気づきの点がありましたら、教えてください。
// タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RB3SW ONで5秒間点灯
// 'C' source line config statements
#include <xc.h>
// 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 = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // 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 = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // 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)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
volatile int event;
// プロトタイプ宣言
void InitInterTimer0(void);
// メイン関数
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;
// 入出力設定
TRISA = 0b01000000;
TRISB = 0x00;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
event = 0; //初期値イベント無しRB3ロー
// 永久ループ
while (1) {
if (event == 0) {
RB3 = 0;
}
if (event == 1) {
RB3 = 1;
}
}
}
// 割込みサービスルーチン
static void interrupt isr() {
if (RA6 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
event = 1;
}
if(RA6==1&& event==1){//もしRA6が放されていて、イベントがまだやっていたら、enentフラグを0にする
event=0;
} // タイマ0割込みフラグをクリア
T0IF = 0;
}
// タイマ0割込み設定関数
void InitInterTimer0(void) {
OPTION_REG = 0b000000000; //プリスケラ000 5ビット=0内部クロック使用 WDTは使わない
TMR0 = 0x00;
INTCONbits.TMR0IF = 0; //TMR0フラグクリアー
INTCONbits.TMR0IE = 1; //TMR0割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
}
Re: TRISAとTRISB
TRさん,猛牛ロックさん,こんばんは。
TRさん,すみません,動かなくなった原因はちょっとわかりません。
それに1827使ったの大分前なので,忘れているところも多いのですが,思いついたこと書きます。
まず,event の変数は,mach からの信号で,信号が入るとLEDを点滅させる,というような動作のプログラムでしょうか。
mach→RA6
RB3→LED
でしょうか。
コメントには,スイッチの記載もあるようで,スイッチがONで,
machからの信号があった時だけ,LEDを5秒点灯でしょうか。
この辺がちょっ不明です。
この辺分からると私なりのプログラムはか書けそうですが。
ただ,TRさんのプログラムだと,LEDが5秒点灯するようにはなってない気がします。
私が以前はまったのは,ポートの操作を連続して行ったことが原因です。
次のような感じで,ポートの操作を連続でしました。
RB4=1;
RB6=0;
RB7=0;
RA0=0;
これは,うまく動作しませんでした。対策はLATレジスタを使うか,間に,次のようになにもしない命令をいれるかでした。
RB4=1;
asm("nop");→何もしない休みの時間です。
RB6=0;
asm("nop");
RB7=0;
asm("nop");
RA0=0;
TRさん,すみません,動かなくなった原因はちょっとわかりません。
それに1827使ったの大分前なので,忘れているところも多いのですが,思いついたこと書きます。
まず,event の変数は,mach からの信号で,信号が入るとLEDを点滅させる,というような動作のプログラムでしょうか。
mach→RA6
RB3→LED
でしょうか。
コメントには,スイッチの記載もあるようで,スイッチがONで,
machからの信号があった時だけ,LEDを5秒点灯でしょうか。
この辺がちょっ不明です。
この辺分からると私なりのプログラムはか書けそうですが。
ただ,TRさんのプログラムだと,LEDが5秒点灯するようにはなってない気がします。
私が以前はまったのは,ポートの操作を連続して行ったことが原因です。
次のような感じで,ポートの操作を連続でしました。
RB4=1;
RB6=0;
RB7=0;
RA0=0;
これは,うまく動作しませんでした。対策はLATレジスタを使うか,間に,次のようになにもしない命令をいれるかでした。
RB4=1;
asm("nop");→何もしない休みの時間です。
RB6=0;
asm("nop");
RB7=0;
asm("nop");
RA0=0;
Re: TRISAとTRISB
SWをしたらLEDが光る、と言う事なら間違いはありません。
っていうか、このプログラム自体は動いたプログラムで、これをポートABを入れ替える、と言う事ですね?
で、重要な事は、「PICはアナログ入力がデフォルト」という点です。なのでデジタル入力する為には
アナログ機能をオフにする必要があります。
デジタル出力に設定した場合は自動でデジタル出力になる(アナログ入力は1次的に無効)ので問題ないですけど
普通はmain関数の初期設定の部分でアナログ機能をオフにします。
他にも動かないものがあれば、GPIOになっていない、という部分をまず疑った方が良いです。
例えば、ポートA,B入れ替えて、内部プルアップするなら以下のプログラムです。
WPUB(個別の内部プルアップレジスタ)はデフォルトで有効(1)なので操作していません。
なので、他のポートBのピンも内部プルアップ有効状態です。
//上部略
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
OPTION_REG = 0; //内部プルアップ有効
ANSELA = 0; //アナログ機能無効
ANSELB = 0;
LATA = 0; //ポートAはLOW出力
TRISA = 0x20; //RA6にLED
TRISB = 0xFF; //RB3にSW
while (1) {
LATA6 = !RB3;
}
}
っていうか、このプログラム自体は動いたプログラムで、これをポートABを入れ替える、と言う事ですね?
で、重要な事は、「PICはアナログ入力がデフォルト」という点です。なのでデジタル入力する為には
アナログ機能をオフにする必要があります。
デジタル出力に設定した場合は自動でデジタル出力になる(アナログ入力は1次的に無効)ので問題ないですけど
普通はmain関数の初期設定の部分でアナログ機能をオフにします。
他にも動かないものがあれば、GPIOになっていない、という部分をまず疑った方が良いです。
例えば、ポートA,B入れ替えて、内部プルアップするなら以下のプログラムです。
WPUB(個別の内部プルアップレジスタ)はデフォルトで有効(1)なので操作していません。
なので、他のポートBのピンも内部プルアップ有効状態です。
//上部略
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
OPTION_REG = 0; //内部プルアップ有効
ANSELA = 0; //アナログ機能無効
ANSELB = 0;
LATA = 0; //ポートAはLOW出力
TRISA = 0x20; //RA6にLED
TRISB = 0xFF; //RB3にSW
while (1) {
LATA6 = !RB3;
}
}
Re: TRISAとTRISB
maboさん,有難うございます。
>まず,event の変数は,mach からの信号で,信号が入るとLEDを点滅させる,というような動作のプログラムでしょうか。
mach→RA6
RB3→LED
でしょうか。
そうです。
>コメントには,スイッチの記載もあるようで,スイッチがONで,
machからの信号があった時だけ,LEDを5秒点灯でしょうか。
フライス盤のプローブ信号をmach(probeの設定端子 たしか、入力だったと思います。)送るです。
この流れを今回にあてあはめると。
RA6(SW=モーメンタリSW)→RB3(LED)です。
SW ON の時、LED発光する これだけです。
今のプログラムにはLEDが5秒点灯はないです。以下に至る途中は5秒点灯がありました。
>RB4=1;
RB6=0;
RB7=0;
RA0=0;
これは,うまく動作しませんでした。対策はLATレジスタを使うか,間に,次のようになにもしない命令をいれるかでした。
RB4=1;
asm("nop");→何もしない休みの時間です。
RB6=0;
asm("nop");
RB7=0;
asm("nop");
RA0=0
そうか、LATレジスタか。
>まず,event の変数は,mach からの信号で,信号が入るとLEDを点滅させる,というような動作のプログラムでしょうか。
mach→RA6
RB3→LED
でしょうか。
そうです。
>コメントには,スイッチの記載もあるようで,スイッチがONで,
machからの信号があった時だけ,LEDを5秒点灯でしょうか。
フライス盤のプローブ信号をmach(probeの設定端子 たしか、入力だったと思います。)送るです。
この流れを今回にあてあはめると。
RA6(SW=モーメンタリSW)→RB3(LED)です。
SW ON の時、LED発光する これだけです。
今のプログラムにはLEDが5秒点灯はないです。以下に至る途中は5秒点灯がありました。
>RB4=1;
RB6=0;
RB7=0;
RA0=0;
これは,うまく動作しませんでした。対策はLATレジスタを使うか,間に,次のようになにもしない命令をいれるかでした。
RB4=1;
asm("nop");→何もしない休みの時間です。
RB6=0;
asm("nop");
RB7=0;
asm("nop");
RA0=0
そうか、LATレジスタか。
Re: TRISAとTRISB
猛牛ロックさん、レスありがとうございます。
F1827の場合、猛牛ロックさんの言われたとおり、TRIS AとBを入れ替えると、
デジタル制御にしなければいけないんですね。
デジタル制御のプログラムを目にはしていたのですが、
F627Aで覚えた流儀でどこまでできるのかと思ってやっていました。
以後注意したいと思います。
タイマー0割込みで、フラグ操作をしました。
使い方としては、
割込みのきっかけを
RB3 == 0 && event == 0 //もしRA6が押されていて、イベントが起きていなかったら
としましたが、
event=RB3として、//SWが押された値がeventとしてフラグ操作をした方がいいのでしょうか?
それと、よく初期値で
端子の設定をALL0にしたりALL1にしたりありますが、
今回は、LATA = 0; //ポートAはLOW出力としましたが、
一般的には、初期値としては、どういった考えを持つのでしょうか?
しかし、自分の場合、F1827がいいのか、F627Aがいいのか迷います。
627Aで十分な感じがします。
627Aの時は、TRISAを入力にし、TRISBを出力にしても、今回のような問題はありませんでした。
やはり、動作速度の問題から、使い分けを考えるべきなのでしょうか?
それ以外にもあったら、簡単でいいから、例などを挙げて教えてください。
例えば、通信にはF1827とか。
追記
今F627Aデータシートを見て分かった。
F627AにはANSELレジスタがない、だからTRISAとTRISBのどちらを入力にしても出力にしても関係ないんだ。
F88は、ANSEL_REGがあったからこそ、ADCができるんだ。
そんなことを考える、F88以上かな。
// タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RB3 SW ONで点灯
// 'C' source line config statements
#include <xc.h>
// 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 = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // 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 = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // 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)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
volatile int event;
// プロトタイプ宣言
void InitInterTimer0(void);
// メイン関数
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
OPTION_REG = 0; //内部プルアップ有効
ANSELA = 0; //アナログ機能無効
ANSELB = 0;
LATA = 0; //ポートAはLOW出力
TRISA = 0x20; //RA6にLED
TRISB = 0xFF; //RB3にSW
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
event = 0; //初期値イベント無しRB3ロー
// 永久ループ
while (1) {
if (event == 0) {
LATA6 = 0;
}
if (event == 1) {
LATA6 = 1;
}
}
}
// 割込みサービスルーチン
static void interrupt isr() {
if ( RB3 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
event = 1;
}
if(RB3 ==1 && event==1){//もしRA6が放されていて、イベントがまだやっていたら、enentフラグを0にする
event=0;
} // タイマ0割込みフラグをクリア
T0IF = 0;
}
// タイマ0割込み設定関数
void InitInterTimer0(void) {
OPTION_REG = 0b000000000; //プリスケラ000 5ビット=0内部クロック使用 WDTは使わない
TMR0 = 0x00;
INTCONbits.TMR0IF = 0; //TMR0フラグクリアー
INTCONbits.TMR0IE = 1; //TMR0割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
}
F1827の場合、猛牛ロックさんの言われたとおり、TRIS AとBを入れ替えると、
デジタル制御にしなければいけないんですね。
デジタル制御のプログラムを目にはしていたのですが、
F627Aで覚えた流儀でどこまでできるのかと思ってやっていました。
以後注意したいと思います。
タイマー0割込みで、フラグ操作をしました。
使い方としては、
割込みのきっかけを
RB3 == 0 && event == 0 //もしRA6が押されていて、イベントが起きていなかったら
としましたが、
event=RB3として、//SWが押された値がeventとしてフラグ操作をした方がいいのでしょうか?
それと、よく初期値で
端子の設定をALL0にしたりALL1にしたりありますが、
今回は、LATA = 0; //ポートAはLOW出力としましたが、
一般的には、初期値としては、どういった考えを持つのでしょうか?
しかし、自分の場合、F1827がいいのか、F627Aがいいのか迷います。
627Aで十分な感じがします。
627Aの時は、TRISAを入力にし、TRISBを出力にしても、今回のような問題はありませんでした。
やはり、動作速度の問題から、使い分けを考えるべきなのでしょうか?
それ以外にもあったら、簡単でいいから、例などを挙げて教えてください。
例えば、通信にはF1827とか。
追記
今F627Aデータシートを見て分かった。
F627AにはANSELレジスタがない、だからTRISAとTRISBのどちらを入力にしても出力にしても関係ないんだ。
F88は、ANSEL_REGがあったからこそ、ADCができるんだ。
そんなことを考える、F88以上かな。
// タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RB3 SW ONで点灯
// 'C' source line config statements
#include <xc.h>
// 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 = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // 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 = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = HI // 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)
// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 1000000
#define On 1
#define Off 0
volatile int event;
// プロトタイプ宣言
void InitInterTimer0(void);
// メイン関数
void main(void) {
OSCCON = 0b01011010; // 内部クロック周波数を1MHzに設定
OPTION_REG = 0; //内部プルアップ有効
ANSELA = 0; //アナログ機能無効
ANSELB = 0;
LATA = 0; //ポートAはLOW出力
TRISA = 0x20; //RA6にLED
TRISB = 0xFF; //RB3にSW
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;
event = 0; //初期値イベント無しRB3ロー
// 永久ループ
while (1) {
if (event == 0) {
LATA6 = 0;
}
if (event == 1) {
LATA6 = 1;
}
}
}
// 割込みサービスルーチン
static void interrupt isr() {
if ( RB3 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
event = 1;
}
if(RB3 ==1 && event==1){//もしRA6が放されていて、イベントがまだやっていたら、enentフラグを0にする
event=0;
} // タイマ0割込みフラグをクリア
T0IF = 0;
}
// タイマ0割込み設定関数
void InitInterTimer0(void) {
OPTION_REG = 0b000000000; //プリスケラ000 5ビット=0内部クロック使用 WDTは使わない
TMR0 = 0x00;
INTCONbits.TMR0IF = 0; //TMR0フラグクリアー
INTCONbits.TMR0IE = 1; //TMR0割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
}
Re: TRISAとTRISB
> SWが押された値がeventとしてフラグ操作をした方がいいのでしょうか?
フラグ操作は「必要に応じて」です。必要以上なら無駄で見通しも悪くなります。
int a=RA0;
int b=!a;
RA1=b;
としても、
RA1=!RA0;
でも同じことです。
if(RB3 == 0 && event == 0)event = 1;
if(RB3 ==1 && event==1)event=0;
こういった処理も意味がある場合と無い場合があります。
if(RB3 == 0 && event == 0){
event = 1;
LAT6=1;
__delay_ms(300);
LAT6=0;
}
if(RB3 ==1)event=0;
のような処理です。これは押されたら1パルス信号を送る(1回光らせる)例です。
例えば、
@SWを押した間は点灯、離したら消灯
ASWを押す度に点灯、消灯切り替え
BSWを押したら秒間点灯(ワンショット)
CSWを押した回数をカウント
で、対処も変わります。
フラグはその形跡が無くなって判断が付かない場合に、自分で印を残します。
@の場合はフラグが無い方が良いです。
A以降はフラグを残さないと判断が付きません。
> 一般的には、初期値としては、どういった考えを持つのでしょうか?
当然使うピンは使う設定にします。使わないピンはプルアップ無しの入力(HI-Z)が良いと思います。
でも、PIC流なら、初期値のアナログ入力、という事かもしれません。
出力にするのは何かとショートさせる危険性もありますからお勧めできません。
> 動作速度の問題から、使い分けを考えるべきなのでしょうか?
いいえ、今ならF1827一択です。
その質問は「WINDOWS 7のPCを買うか、WINDOWS8のPCを買うか?」という質問と似ています。
慣れの問題はありますけど、F1827の方が、価格、性能全てに上回っています。
(凡そ、どのマイコンでも出来ることはそれほど変わりませんけど、ADCの無いマイコンは論外です。
外付けにすれば、より難しくなります。
また、メモリも少なすぎます。まともなプログラムを組めるほどのメモリがありません。)
唯一、薦めるのは、使っていたマイコン(627A)が壊れて、そのプログラムが手元にある場合です。
F1827に慣れればF627Aは全く出番はありません。
更に言えば、F1827も決して新しいマイコンではありません。寧ろベテランの域です。
何か作るものを決めて、進めていった方が良いような気がします。
フラグ操作は「必要に応じて」です。必要以上なら無駄で見通しも悪くなります。
int a=RA0;
int b=!a;
RA1=b;
としても、
RA1=!RA0;
でも同じことです。
if(RB3 == 0 && event == 0)event = 1;
if(RB3 ==1 && event==1)event=0;
こういった処理も意味がある場合と無い場合があります。
if(RB3 == 0 && event == 0){
event = 1;
LAT6=1;
__delay_ms(300);
LAT6=0;
}
if(RB3 ==1)event=0;
のような処理です。これは押されたら1パルス信号を送る(1回光らせる)例です。
例えば、
@SWを押した間は点灯、離したら消灯
ASWを押す度に点灯、消灯切り替え
BSWを押したら秒間点灯(ワンショット)
CSWを押した回数をカウント
で、対処も変わります。
フラグはその形跡が無くなって判断が付かない場合に、自分で印を残します。
@の場合はフラグが無い方が良いです。
A以降はフラグを残さないと判断が付きません。
> 一般的には、初期値としては、どういった考えを持つのでしょうか?
当然使うピンは使う設定にします。使わないピンはプルアップ無しの入力(HI-Z)が良いと思います。
でも、PIC流なら、初期値のアナログ入力、という事かもしれません。
出力にするのは何かとショートさせる危険性もありますからお勧めできません。
> 動作速度の問題から、使い分けを考えるべきなのでしょうか?
いいえ、今ならF1827一択です。
その質問は「WINDOWS 7のPCを買うか、WINDOWS8のPCを買うか?」という質問と似ています。
慣れの問題はありますけど、F1827の方が、価格、性能全てに上回っています。
(凡そ、どのマイコンでも出来ることはそれほど変わりませんけど、ADCの無いマイコンは論外です。
外付けにすれば、より難しくなります。
また、メモリも少なすぎます。まともなプログラムを組めるほどのメモリがありません。)
唯一、薦めるのは、使っていたマイコン(627A)が壊れて、そのプログラムが手元にある場合です。
F1827に慣れればF627Aは全く出番はありません。
更に言えば、F1827も決して新しいマイコンではありません。寧ろベテランの域です。
何か作るものを決めて、進めていった方が良いような気がします。
- JoyfulNote v6.02 -
++ Edited by Hamel ++