トピック関連記事
48時間以内の記事は New Mark で表示されます
無題ー1
前スレの続きです。

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

便利な機能があるんですね。自動で,インデントがつけられるんですね。

こうするとバグも見つけやすくなりますかね。

TRさん,私も初めてわかりました。下記に記事があります。

https://picalittle.blog.fc2.com/blog-entry-25.html
mabo 2018/12/01(Sat) 21:46 No.1283
Re: 無題ー1
皆さん いろいろとありがとうございます」。
mainn関数内に以下を足したら、
動作しました。

__delay_ms(5000);//5秒まつ
RB3=0;
event=0;

event=0をつけて、eventが0~1~0と回るようにしたら、
SWとRB3がつながりました。
やった〜


22:23追記

押している間だけ点灯させるには、
main関数内の最後に以下を足せば、SW ONの間だけ
RB3が点灯します。
これで、さっぱりとしました。

if (event == 1&& RA6 == 1) {
RB3 = 0;
event = 0;
TR   2018/12/01(Sat) 21:52 No.1284
Re: 無題ー1
タイマー割り込みですけど、この機種だとタイマー2,4,6あたりを使うのが良いです。
まぁ、取りあえず、タイマー0と言う事で書きます。

マイコンのクロック周波数が4MHzだとします。で、タイマーのクロック元は1/4クロック=1サイクルを選択します。
つまり、1MHz=1usです。
次に割り込み間隔を1msにします。この辺りが標準的だと思います。SWの読み取りやダイナミック点灯など、大体これでいけます。
となると、カウント値1000になるので、そのままだと8ビットカウンタがオーバーします。なのでプリスケーラの出番です。
1:4を選択すれば、250カウントで1ms、1:8なら125カウントで1msです。

で、タイマー0だと、比較一致が無く、オーバーフロー(カウンタ溢れ)しかありません。なので自分で設定します。
割り込みの最初でTMR0=156;とすれば、156から数え始め、100カウント目の256の時に再び割り込みに入ります。
なので、1:4ならTMR0=6;(256-250)、1:8ならTMR0=131;(256-125)にする事になります。
ただ、ちょっと解りずらいので、マイナスの数を使うのが良いです。つまり、TMR0=-250;です。
マイナスは「あと250カウントしたら0になる」という意味です。時計の「○分前」というのと同じです。

具体的には下のような感じです。何回割り込みに入ったかで正確な時間を測ります。

//上部略

// タイマ0割込み設定関数
void InitInterTimer0(void) {
//割り込み設定
OPTION_REG = 1; //1:4
TMR0IE = 1; //TMR0割り込み許可
GIE = 1; //全体割り込み許可
}

//TMR0の割り込み1ms
void interrupt isr() {
TMR0=-250;//直ぐにセットする
T0IF = 0;
static unsigned int ms=0;

if(ms<3000)LATB3=1;
else LATB3=0;

ms=(ms+1)%6000;//カウントアップ、6s(6000)でリセット
}

// メイン関数
void main(void) {
OSCCON = 0b01101010; //内蔵発振器 4MHz使用に設定

//ピン初期設定
LATB = 1<<3;
TRISB = 0;

InitInterTimer0();

while (1) {}
}


ただし、正確に言えば、TMR=-250;とした時にプリスケーラもリセットされます。
なので、その分完璧ではありません。256でオーバーフローさせて、それを数えて算出すれば完璧です。
けれども、その誤差よりも、内蔵クロックの誤差の方が大きいのであまり問題にはなりません。

で、タイマー2,4,6は比較器が付いています。この間やったPWMの周期を決めるPR2と全くおなじです。
それで上限を249とすることで、TMRレジスタを直接操作することなく、1msにすることが出来ます。


あれ?書き込み器は直ったのですか?

動いたのは良かったですけど、押している間なら
while(1){
LATB3=!RA6;
}
で済むと思うんだけど…
でも、そういった事を多くするのが重要です。


>SOURCE→FORMAT
そのまま上部のメニューからの操作です。


※今日は土曜出勤でした。
猛牛ロック   2018/12/01(Sat) 22:57 No.1285
Re: 無題ー1
猛牛ロックさんこんにちは。
自作書き込み基板は、1827用に、以下の内容で再作成します。
コメお願いします。

方針
PORTA
 出力端子
つなぎ方
 PICの端子〜LED〜抵抗〜GND

PORTB
 入力端子(全ビットプルアップ)
つなぎ方
 DC5V〜抵抗〜LED〜PICの端子〜SW〜なし


それと、猛牛ロックさんプログラムを拝見させていただきました。
有難うございます。

聞きたい点を ← の後に羅列しましたので、ご教授願います。
/上部略

// タイマ0割込み設定関数
void InitInterTimer0(void) {
//割り込み設定
OPTION_REG = 1; //1:4 ←端折っていますか?OPTIN_REG=00000001では?
TMR0IE = 1; //TMR0割り込み許可
GIE = 1; //全体割り込み許可
}

//TMR0の割り込み1ms
void interrupt isr() {
TMR0=-250;//直ぐにセットする
T0IF = 0;←タイマー0が入ると1が立つので、ここで初期化する
static unsigned int ms=0; ← static静的なという意味があるようですが、どういった意味合いになりますか?

if(ms<3000)LATB3=1;
else LATB3=0;

ms=(ms+1)%6000;//カウントアップ、6s(6000)でリセット ←ふつうは割込み作業を終えたら、ここで、T0IF=0;//タイマ0による割り込みフラグリセットと記述すると思いますが、この行の意味は何ですか?
}

// メイン関数
void main(void) {
OSCCON = 0b01101010; //内蔵発振器 4MHz使用に設定

//ピン初期設定
LATB = 1<<3;←1のbit列を3bit左にシフトという意味と思いますが何故こういったことをするのですか?
TRISB = 0;

InitInterTimer0();

while (1) {}


追記
PORTBは、PIC内部でプルアップです。

TR   2018/12/02(Sun) 19:00 No.1286
Re: 無題ー1
猛牛ロックさん,TRさん,こんばんは,

猛牛ロックさんのプログラムは,いつもながら感心させられます。

TRさんの疑問点ですが,分かる範囲で書きます。

詳しくは猛牛ロックさんがコメントくださると思います。

まず,

ms=(ms+1)%6000

は,msをプラス1して6000で割ったあまりをmsに入れてますので,

if(ms<6000){ms++;}
else{ms=0;}

と同じ意味だと思います。こうすれば,msのオーバーフローを気にしなくていいので,いい方法だと思います。

割り込みに入ってくる回数をカウントして,6秒を作ってます。


それから,

LATB = 1<<3

ですが,クロック数が多くとれるPICでは,レジスタの操作が思うようにできないことがあります。

これを解決するために作られたのがLATレジスタです。

私も以前,これ使ったことあります。3ビット分シフトするので,

LATB.B3=1

と同じ意味だと思います。

働き的には,

RB3=1

としてもいいのですが,RB3とかのレジスタの操作を続けて行うと,思った動作をしなくなります。

こんな時にLATレジスタを使うと大丈夫なようです。

下記に記載があります。

http://www.microtechnica.tv/faq/faq.cgi?kate=mikroC&faq=16

間違ってるかもしれませんが,間違いは,多分,猛牛ロックだんがコメントくださると思います。
mabo   2018/12/02(Sun) 20:50 No.1287
Re: 無題ー1
maboさん、拙い質問ですみません。

8ビットなので、レジスタに1ずつ加算されていき8ビットの最大値(255)を超えたとき(256になった時)に割り込みが発生します。

とよく目にします。


このことと関係があります。

1MHzの動作速度だと、1/1Mzで1μs/回
1回の振動の時間が1μsだと思います。
この1μsの時間で、1回のカウントができると考えてよろしいのでしょうか?
255というのは、255μsかかるのでしょうか?
TR   2018/12/02(Sun) 22:17 No.1288
Re: 無題ー1
> OPTION_REG = 1; //1:4 ←端折っていますか?OPTIN_REG=00000001では?

同じです。「1」も「0b00001」も「0x000001」でもどれも整数の1です。
この辺りは全然気を使っていません。データシートみて端だけ1だったのでそうしただけです。


> T0IF = 0;←タイマー0が入ると1が立つので、ここで初期化する

現実的には割り込み内に全部の事が終わっていれば割り込み最後でも同じ事です。
私は最初にクリアするのが好みです。
で、「タイマー0が入ると」とは「タイマー0割り込みに入ると」ということですよね?
最初はタイマーが0になると、という意味かと思いました。


> static unsigned int ms=0; ← static静的なという

前にも説明したと思いますけど、これは重要です。
staticが無ければこの関数に入ると毎回ms=0;が実行されます。つまりカウントアップできません。
staticをつけると継続されます。下の方でカウントアップしていますけど、その数値が維持されます。
つまり、「ms=0」は初回のみ行われます。


> ms=(ms+1)%6000;//カウントアップ、6s(6000)でリセット ←ふつうは
コメント通りですけど。
2行に分けます。
ms=ms+1; //カウントアップです。毎回、自分(ms)に1を加えたものを、代入します
ms=ms%6000; //「%」は割った余りのことです。今回はif(ms>=6000)ms=ms-6000;と同じ意味です。
この辺りも好きに書けば良い事です。自分の好みで書いてください。


> LATB = 1<<3;←1のbit列を3bit左にシフトという意味と思いますが何故こういったことをするのですか?
特別な意味はありません。何となくそう手が動いただけです。8でも0b1000でも0x8でも良いです。
重要なのはLATB3だけ1、残りを0、にすることです。


> PORTBは、PIC内部でプルアップです。
ホントだ。OPTION_REG間違いましたね。
OPTION_REG=0x81;
でした。
デフォルトで、全部1で、内部プルアップも1で無効なんですね。
この辺りも判り難いですね。まぁデータシートで確認するだけですけど。
<<追記>>
データシートのプルアップの欄で

2: The weak pull-up device is automatically disabled if the pin is in configured as an output.

と、出力設定時には自動で内部プルアップは無効になる、と書いてあります。
なので、今回は
OPTION_REG = 1;
でも出力にしているので、内部プルアップは無効です。まぁ、使わない場合は
OPTION_REG |=0x80;
とした方が良いでしょうけど。


> 1MHzの動作速度だと、1/1Mzで1μs/回
> 1回の振動の時間が1μsだと思います。
> この1μsの時間で、1回のカウントができると考えてよろしいのでしょうか?
> 255というのは、255μsかかるのでしょうか?

4MHzクロック=1MHzサイクルの場合に
・クロック源を1/4駆動クロック(つまり1サイクル)を選択
・プリスケーラを無効
にした場合は1MHz=1usでタイマーがカウントアップされます。
0から255までなら255usですけど、1回転なら更に1カウントした時です。
0b11111111(255)から1を足すと0b100000000(256)です。一番左の1は8ビットのカウント外ですから消えます。
(割り込みを有効にしていれば、その消える1が利用されて割り込みになります)
※言っている事に間違いはありません


<追記>
書き込み器の回路を見ました。

RA5は入力のみです。そして、LEDを付けてプルダウンさせればリセットしっ放しになります。

RB6、RB7にLEDを付けて正常に書き込みできるかは判りません。
ブレッドボードで試してからにした方が良いです。
※無難なのはスイッチのみを付ける事です
猛牛ロック   2018/12/03(Mon) 00:04 No.1289
Re: 無題ー1
//TMR0の割り込み1ms
void interrupt isr() {
TMR0=-250;//直ぐにセットする
T0IF = 0;
static unsigned int ms=0;←msの初期値=0

if(ms<3000)LATB3=1;←3秒間LATB3が点灯
else LATB3=0; ←3秒を超えたらLATB3が消灯

ms=(ms+1)%6000;//カウントアップ、6s(6000)でリセット ←は,ms初期値0に1msを足し、6000で割ったあまりを更に最初のmsを捨てて、新たなmsに1を足して、また6000で割った値を、、、
これを6000msまでつづけるとすると、一つ上の行は3秒間LATB3が点灯となっているので、3秒間点灯後の残り3秒は、LATB3がoffとなり、その後また、main関数に戻るということですか?
、、、、と考えると意味が分かりません。
もう少し詳しく教えてください。


RB6、RB7にLEDを付けて正常に書き込みできるかは判りません。
ブレッドボードで試してからにした方が良いです。← 出力端子RB3に、LEDと180Ωを付け、且つプルダウン10kΩ付けながら書き込みました。
テスト結果は、RB6とRB7の両方とも点灯しました。

※無難なのはスイッチのみを付ける事です← 入力端子の設定の場合を懸念しているのかな〜?
出力端子は、ハイでもローでも電位を固定できるといわれていますが、短絡事故防止の為にプルダウン抵抗をつけた方が良いと思いますが、
出力端子の場合、書き込んでいる最中は、プルダウン抵抗をしない方が良いという意味でしょうか?



>現実的には割り込み内に全部の事が終わっていれば割り込み最後でも同じ事です。
私は最初にクリアするのが好みです。


void interrupt isr()関数で割込み作業を実施してしまえば、割込み作業の前でも後でもので良いので、
タイマー0の割込み作業実施後に立ったT0IF のフラグを0にリセットして、
次回の割込み作業に備えるってことですよね。



1827は、PORTAのRA5の為にPORTA側を一体で出力端子にできないんですね!?
ということは、IN OUTそれぞれ8ピンづつとしたい場合は、
PORBの内、1ピンだけ入力設定で使うことになるのでしょうか?


追記
1827ですが、PORTA側を入力端子に使った場合、考えられる不都合としては、
割込みの場合、IOCAN3 = 1; 割込み種類別の有効化の設定を行い  といった、作業ができないくらいでしょうか?


static 分かりました。 0にせずに、記録をとどめ、次の作業にその記録を次の機会に使える
といった意味ですね。
TR   2018/12/03(Mon) 10:51 No.1290
Re: 無題ー1
> もう少し詳しく教えてください。
変数ms自体は、最後の計算部分で1が足されます。(ms+1)つまり、カウントアップです。
更に%6000としているので、MAX6000(5999)のカウンタ/タイマーです。

> 3秒間点灯後の残り3秒は、LATB3がoffとなり、その後また、main関数に戻る
大きな勘違いをしています。毎回すぐにmain関数に戻ります。3秒も居ません。
msはタイマー0割り込みに入った回数をカウントしています。
1回入るとmsが1増えます。6000回この関数に入ると%6000の部分が効いて0になります。
毎回余りの計算はしていますけど、6000(以上)になった時だけ効果が有効になります。
タイマー割り込み関数自体は直ぐに終わるようにします。


> ※無難なのはスイッチのみを付ける事です← 入力端子の設定の場合を懸念しているのかな〜?
いいえ、単純に書き込めるかどうかです。書き込めたのなら良いです。
書き込み端子ですから、PICKIT3からの信号によって、ピン先がHIGH⇔LOWがちゃんと振れるかどうかの問題です。

> 短絡事故防止の為にプルダウン抵抗をつけた方が良いと思いますが
いいえ。短絡事故防止なら繋がないか、或いは入力にするのが一番です。プルダウン抵抗は何の役にも立ちません。電気が漏れているだけです。
付ける必要があるのはその出力先が制御端子、つまり、別のICの入力だった場合です。その時はHIGH/LOW区別するために付ける場合があります。
でもプルアップの方が多いです。

> 出力端子の場合、書き込んでいる最中は、プルダウン抵抗をしない方が良いという意味でしょうか?
書き込んでいる最中は全て入力端子です。書き込み器の出力が弱い場合は書き込み器内部抵抗と、回路に付けたプルダウン抵抗/プルアップ抵抗の
分圧した値がピン先の電圧になるので、変なものを付ければ誤動作して書き込めません。
なにも付けなければ書き込み器の電圧がそのままピン先の電圧になります。


> 1827は、PORTAのRA5の為にPORTA側を一体で出力端子にできないんですね!?
今まで使っていたPICも同様かと思いますけど、MCLRピンは出力能力が無いので出力できない、というだけの話です。
PICの場合はどれも同じ様にMCLRのピンは入力のみなんじゃないかな?


> PORTA側を入力端子に使った場合、考えられる不都合としては
ポートBなら内部プルアップがあるのでスイッチを付けるだけです。これはスイッチを押さない限りは何も接続していない、というのと同じです。
つまり、ピン先にピンヘッダでも付けておいてからスイッチに向かえばどちらにでも通用します。
ポートAは内部プルアップが無いので、外部プルアップ/ダウンが必要です。となるとSW入力に固定されます。
つまりは、外部割り込みに関わらず、SW入力以外の事は出来ない、という事になります。勿論、ジャンパーやdipスイッチ等で
切り離し可能にする方法もあります。
猛牛ロック   2018/12/03(Mon) 12:26 No.1291
Re: 無題ー1
猛牛ロックさんへ

>msが1増えます。6000回この関数に入ると%6000の部分が効いて0になります。
毎回余りの計算はしていますけど、6000(以上)になった時だけ効果が有効になります。


そうか、msは、割込み回数のカウンターで、ms関数により、msに入った値の上限を6千としたわけか、了解。
char等ビット数の関係があるからですね。


>なにも付けなければ書き込み器の電圧がそのままピン先の電圧になります。

今回、キットで遊ぼう野ボードが壊れたのを契機に、
書込みができて、且つ、テストのし易いテスト用ボード兼用を作ろうとしています。
そうなると、INもOUTもSWを付けておいて、PICとPIC3だけがつながる状態にすれば、いいですね?



自分の場合、手パ用にPIC16F627Aを使っていますが、
INとOUTそれぞれ、8ピンずつ分けています。
なので、627Aに代わるPICも8ピンずつ使えないとまずい。
1827のRA5は、入力専用ですので、RA5の1ピン分を入力側(RB0〜RB8)の中から、
出力として使える、お勧めのピンはどれですか?
お勧めがあれば、入力用のRA5に代わるピンとしたいと思います。


追記16:23
猛牛ロックさんのプログラムの動作確認

RA6はSWONで点灯
RB3は、RA6のSWに関係なく3秒間隔で点灯


//ピン初期設定
LATB = 1 << 3;
これだけで、どうしてRA6のSWに連携するのですか?
TR   2018/12/03(Mon) 13:34 No.1292
Re: 無題ー1
> char等ビット数の関係があるからですね。
今回は直接的に点滅周期の6秒です。大まかな1分、10分、1時間とかのサイクルにする場合もあります。

> 手パ用にPIC16F627Aを使っていますが
汎用ならピンフレームを付けておくだけで良いと思います。
専用ならその回路に近いものを作る事になります。けれども汎用性は失われます。


> お勧めがあれば、入力用のRA5に代わるピンとしたいと思います。
今現在思い浮かびません。TRさんが今後使いたい機能を考えて選択した方が良いです。


> LATB = 1 << 3;
> これだけで、どうしてRA6のSWに連携するのですか?
それでは連動しません。単にLATBレジスタを「8」にしただけです。
私が言ったのは

> while(1){
> LATB3=!RA6;
> }
です。タイマー割り込み関数でも、メインループでも、
LATB3=!RA6;
を入れて、あと何もしなければ連動します。
意味はRA6の内容を反転(論理否定)させたものをLATB3に代入します。
つまり、RA6が1ならLATB3を0にする。RA6が0ならLATB3を1にする。
猛牛ロック   2018/12/03(Mon) 18:26 No.1293
Re: 無題ー1
猛牛ロックさん 、レスありがとうございます。


プログラムを以下の通り整理ました。
動作は、
RA6 SW ONの間中RB3 点灯、 RA6 SW offでRB3 3秒間点滅

今回も色々と有難うございます。
タイマー0割込みについて、理解を深められました。
特に、SW ONの場合、必要な割込み間隔から、TM0の初期値を決める です。
キットで遊ぼうの教科書にはない事です。
薫陶として、保存しておきます。


LATB3 = !RA6;
この話は、以前「=」と「==」の違いを教えられていたので、話を聞いているうちにわかっていました。
同様のことで
RB3=~RB3もありますね。


RA5の代わりのピンは、おいおい考えるにしても、とりあえず、写真を見ると、
PIC3の書き込み時に使用するRB7をRA5の代わりとして入力用に使います。




// 花丸 タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RA6 SW ONの間中RB3 点灯、 RA6 SW offでRB3 点滅
// 'C' source line config statements
#include <xc.h>
// CONFIG1


// __delay_ms(), __delay_us()関数が使用する
#define _XTAL_FREQ 4000000
#define On 1
#define Off 0
volatile int event;
// プロトタイプ宣言
void InitInterTimer0(void);
// メイン関数

void main(void) {
OSCCON = 0b01101010; // 内部クロック周波数を4MHzに設定
// 電圧レベルの初期設定
PORTA = 0x00;
PORTB = 0x00;
// 入出力設定
TRISA = 0b01000000;
TRISB = 0x00;
// タイマ0割込み設定関数の呼び出し
InitInterTimer0();
// 割込み全体の許可
GIE = 1;

// 永久ループ

while (1) {
LATB3 = !RA6;
}

}


// 割込みサービスルーチン

static void interrupt isr() {
static unsigned int ms = 0;
if (ms < 3000)LATB3 = 1;
else LATB3 = 0;
ms = (ms + 1) % 6000; //カウントアップ、6s(6000)でリセット
// タイマ0割込みフラグをクリア
T0IF = 0;
}

// タイマ0割込み設定関数

void InitInterTimer0(void) {
OPTION_REG = 0b000000000; //プリスケラ000  5ビット=0内部クロック使用 WDTは使わない
TMR0 = -250; //直ぐにセットする
INTCONbits.TMR0IF = 0; //TMR0フラグクリアー
INTCONbits.TMR0IE = 1; //TMR0割り込み許可
INTCONbits.GIE = 1; //全体割り込み許可
}

TR   2018/12/03(Mon) 20:26 No.1294
Re: 無題ー1
maboさんこんばんは。

No1287について

>ms=(ms+1)%6000

は,msをプラス1して6000で割ったあまりをmsに入れてますので,

if(ms<6000){ms++;}
else{ms=0;}


この方が分かりやすいですね。

msの初期化だったんですね。
有難うございました。


追記
大分以前、猛牛ロックさんが、下記のことを言っていました。
今やっとその意味を深く理解できました。
当時はいっぱい、いっぱいでしたよ。

イコンの動作として説明してください。
つまり、「エンドミルがタッチプローブに接触したら」→「入力ピンがLになったら」です。
それが出来るようになったら、次にその動作がプログラムでどう配置すれば実現できるか
考えてください。
TR   2018/12/03(Mon) 21:25 No.1295
Re: 無題ー1
> if(ms<6000){ms++;}
> else{ms=0;}

意味合いはあっていますけど、実際にはちょっと違います。置き換えるなら

ms++;
if(ms==6000) ms=0;

や、

ms+;
if(ms>=6000)ms-=6000;

とかです。
前者は5999でやってきた時に6000です。
6000でやってきた時に0です。(ms++はされずにms=0だけ実行される)
つまり、6001でループします。
時計の一番上(12時、24時、60分)に来たときは、その時点で0時や0分に置き換わらなければいけません。
必ずインクリメントしなければならない部分は無条件でms++;、そして、6000だったら0です。
一行で書けば
if(++ms==6000)ms=0;//或いはif(++ms>=6000)ms=0;
です。ただし、場合によっては4ms毎に割り込みに入る場合もあります。また0スタートでは無い場合もあります。
そして、誤って、別の場所で6000を超えた場合(例えば時計の時刻合わせをしようとしてこの変数を弄ったり)や、初期化忘れ等に
大きな不具合に繋がります。
そう言った事を
ms=(ms+4)%6000;
のように書く方が、安全性が高いような気がします。
考え方は変数の型と同じです。%6000で、6000でループするカウンタ(範囲が0〜5999の変数)です。
繰り上がり(桁あふれ)の分は消えます。

但しデクリメントは注意が必要です。
ms=(ms-1)%6000;
ではなく
ms=(ms+5999)%6000;
みたいな処理です。ちょっと見通しが悪いです。
猛牛ロック   2018/12/04(Tue) 09:37 No.1296
Re: 無題ー1
猛牛ロックさんこんばんは。
丁寧にも説明してくださってありがとうございます。

>ms++;
if(ms==6000) ms=0;

この式もようやく見慣れてきました。
{}を端折っているんですよね。
キットで遊ぼうの教科書にはないので、端折っていると感じます。
実際は、端折っても正解なんでしょうけど。



そして、ようやく分かってきた事で、
ハイインピーダンス状態ってありますね。

写真のやつ。

よく見てやっとわかりました。
マイコンのi/oて、電源ONの直後は、一斉に入力端子になるそうですね!
だから、プルアップかプルダウンの抵抗を付けて
安定させるわけですね。

ハイインピーダンスって言葉を調べると、1でも0でもない状態なんだそうです。
どっちつかずで、不安定状態をいうようですね。
テスターの検知棒が何も触れていない状態と同じなんだそうです。


それと、猛牛ロックさんが、過日言っていた中に、16F627Aの端子の説明をしていました。
F627AもF1827と端子の使われ方が同じですということ、
具体的には、PORTAが出力端子、PORTBが入力端子でした。

そこでなんですが、自分の今のフライス盤制御のレベルなら、PORTAを全て入力とし、
PORTBを全て出力としても問題ないように思えます。
実際、素人の自分は、PORTAを全て入力とし、PORTBを全て出力とした方が分かりやすいんですよね。
現況を踏まえて、このような使い方をしてもいいでしょうかね〜?

TR   2018/12/04(Tue) 20:25 No.1297
Re: 無題ー1
猛牛ロックさん,TRさん,こんばんは。

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

結構プログラム作ってたので,表現された式が,

どんな意味なのかわなんとなく理解できます。

でも,自分で作るとなると,やはり,細かい部分で,?

なことがいっぱいです。

特にループ等では,境界値?の付近の理解がいまいちで,

1回余計に数えたり,少なかったりというミスをよくします。

その点猛牛ロックさんは,私にいわせれば,場数をふんでらヤルのでしょうね。

いつも感心させられます。


TRさんは,何か目的がありになってのプログラムでしょうか。

CNCの周辺機器でもお作りでしょうか。
mabo   2018/12/04(Tue) 21:23 No.1298
Re: 無題ー1
> 同様のことで
> RB3=~RB3もありますね。
ですけど、ここで、「~」で通用するかは解りません。
通用するとしても使わない方が良いです。
反転させるなら論理否定「!」が良いです。
※「!1」は0です。「!0」は厳密には「0以外の数」(真)ですが、現実には「1」です。
けれども「~0」は8ビットで処理されれば255ですし、「~1」も8ビットの処理なら254です。
!は思ったように動作するだろう確信がありますけど、~に関しては「不明」です。
場合によってはコンパイラに怒られる可能性もあります。


> 実際は、端折っても正解なんでしょうけど。
C言語は段落や改行、スペース等は自由に入れられます。全て1行で書いても良いわけです。
なので、その範囲がどこまでなのかの判断は不可欠です。
ifやelseやwhile等、どれも対象はその後の1命令です。「{}」は範囲拡張の為のものです。
また、説明時には「{}」があった方が説明し易い、という事情もあります。
不安になったら自動整形して確認して下さい。


> テスターの検知棒が何も触れていない状態と同じなんだそうです。
というよりもテスター(電圧計)の検知棒そのものです。
で、「何も触れていない状態」ではなく、触れてもその回路に何も影響を起こさない(ほど高い抵抗値)、ということです。
測ろうとして触れた途端に電圧が変わってしまえば、まともに測定できない、ということです。


> このような使い方をしてもいいでしょうかね〜?
どのように使うかは製作者の自由です。
それぞれのピンの機能等を確認して、不都合が起こらない様に配置すれば良いです。
猛牛ロック   2018/12/04(Tue) 23:06 No.1299
Re: 無題ー1
maboさん、おはようございます。

>TRさんは,何か目的がありになってのプログラムでしょうか。

CNCの周辺機器でもお作りでしょうか。


いえいえ、特に計画等はありません。
ただ、以前、教えて頂いたフライス盤プルグラムを自分のものにしなくてはいけないと思ったので、
学習しています。


PIC3書き込みボードを考え直しましたので、アップします。
今回は、PIC3からの繋ぎも反映しました。

キットで遊ぼうの配線図をもとに、プルアップ抵抗をなくしたりしています。
発光LEDとそれに係る抵抗があればいいようです。


それから、周期を求めるエクセルを作りました。



追記
入力端子(内部でプルアップ)の設定で、
SW OFFで、端子は、ハイでしょうか?



3秒間隔で点滅をするRB3は大変暗いです。
おかしいのでは??

TR   2018/12/05(Wed) 10:03 No.1300
Re: 無題ー1
F1827のデータシート(DS4139D)の371ページに5V駆動時の出力特性が載っています。添付図
その下に3.0V駆動の特性もありますけど、そうすると全然弱くなります。
で、これを見てわかるように、あまり多くの電流を流す能力はありません。
そして、このグラフの出力がヘタる分は、損失=発熱になります。
言いたいことは、もう少し抵抗を大きくした方が無難です。
状態を確認する為ですから1kΩとかが良いと思います。

また、言っている事が逆になるのですが、、このグラフから言えるのは、青色LED(VF3.0として)なら、抵抗は繋がなくても19mA程度しか流れません。
赤色(VF2.0Vとして)でも22mA程度なので抵抗は付けなくても良い事になります。

更に言えば、いままで、出力操作で
if(RA0==1)RA0=0;
else RA0=1;
のような反転させる記述をしましたけど、HIGH出力で25mA位流しているとグラフでは1V程度です。
なので、読み込みはLOWになります。、
つまり、反転はしないで、HIGH出力のままになります。
(自分の理解ではそうした仕組みになっていると思います。試したわけではありません。)

> 入力端子(内部でプルアップ)の設定で、
> SW OFFで、端子は、ハイでしょうか?
そうです。

> 3秒間隔で点滅をするRB3は大変暗いです。
> おかしいのでは??
何かがおかしいのでしょうね。エスパーすれば、出力ではなく、プルアップ入力で光らせているのでは?

猛牛ロック   2018/12/05(Wed) 13:07 No.1301
Re: 無題ー1
RB3の電圧が非常に低いです。テスターで測れません。
で、自分の以下のプログラムだとRB3に電圧は、
4.72V。こうなると、プログラムの違いといわざるをえないのでは?

// 自分作 タイマー0割込みPIC16F1827 Configuration Bit Settings
//RA6 マッハからの信号 RB3SW ONの間中、RB3点灯
// '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;
}
if (event == 1 && RA6 == 1) {//もしイベントがOnのままで、SWがOffなら、
RB3 = 0;
event = 0;
}
}
}

// 割込みサービスルーチン

static void interrupt isr() {
if (RA6 == 0 && event == 0) {//もしRA6が押されていて、イベントが起きていなかったら
event = 1;

}
// タイマ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; //全体割り込み許可
}
TR   2018/12/05(Wed) 14:43 No.1302
Re: 無題ー1
何のことを言っているのか判りませんけど、

試したプログラムと試した回路の結論が、結果として表れます。
まだ回路もプログラムも単純なものですから、よくよく観察すれば原因は判ると思います。

それともどこかに掲載されたプログラム&スケッチを試したのですか?


追記します。

PICKIT3からの電流は30mAまでに制限されています。なので、外部電源を繋いでいないのでそうなっている可能性があります。
例えば、他に赤(VF2.0V)を使っていて、RB3には白か青(VF3.0V)になっているとか。
猛牛ロック   2018/12/05(Wed) 15:38 No.1303

処理 記事No 暗証キー

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