[Homepage][BBS][Blog][YouTube][asablo]

エアーバリアブルBBS
新エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
PIC16F886の自作間欠タイマ回路のプログラムのご質問
エアーバリアブル 様
 御著書(トランジスタ技術誌)おめでとうございます.

 しばらく購入していなかったトラ技(7月号)を購入したいと思います.


さて,C言語の達人諸兄にお聞きします.
簡単な変換だと思いますが,中々良いアイデアが思いつきませんので,
アドバイスを頂ければ幸いです.

<PIC16F886-I/SPと10進ロータリーコードスイッチA6A-10RWを4個RA-Port及びRC-Portに接続>
・第1組のスイッチの下位桁のそれはRA0-RA3に接続し,上位桁のそれはRA4-RA7に接続します.
・第2組のスイッチの下位桁のそれはRC0-RC3に接続し,上位桁のそれはRC4-RC7に接続します.

 分かり難いかも知れませんが具体的な接続は以下の通りです.

 A6A-10RS(1);SW1-1 SW1-2 SW1-4 SW1-8  SW2-1 SW2-2 SW2-4 SW2-8
 PIC16F886 ; RA4 RA5 RA6 RA7 RA0 RA1 RA2 RA3

 A6A-10RS(2);SW3-1 SW3-2 SW3-4 SW3-8  SW4-1 SW4-2 SW4-4 SW4-8
 PIC16F886 ; RC4 RC5 RC6 RC7 RC0 RC1 RC2 RC3

<動作例>
 第1組目のスイッチに55をセット,第2組目のスイッチに40をセットしたときの動作は
 5.5間出力をONして,その後4.0秒間出力をOFFし,それを繰り返します.
 取り敢えず,delay_ms(100);関数をぐるぐる回す予定です.

 よって,お聞きしたいのはSW1-SW2及びSW3-SW4のそれぞれの数値を
 たとえば変数 dec1,及び dec2 に格納したいのです.

 第1組目のスイッチに55をセット,第2組目のスイッチに40をセットすると,
RAは0x55(0d85,0b01010101),RBは0x40(0d64,0b01000000)

<A6A-10RWの配置>
添付の画像をご覧になってください.

※長文失礼しました.
 定年退職してから約5年になる,おじんです.

  • hayabusa
  • 2017/06/05 (Mon) 17:13:28
投稿の削除方法についてお聞きします.
申し訳ありませんが,先ほどの投稿ですが件名を書き忘れました.
よって,一旦削除してからさい投稿しようと思いましたが,削除の方法が分かりませんのでお教えくだされば幸いです.
  • hayabusa
  • 2017/06/05 (Mon) 17:18:50
記事のタイトルをつけ加えました
hayabusaさん
祝辞ありがとうございます。

書き込んだ内容は、左側にある編集、削除で行うことができます。その時、書き込んだ時に自分で設定したパスワードが必要となります。

投稿した記事ですが、長文を再度アップするのは大変ですので、こちらで適当に書き込みました。
消去がうまくいかない、もしくはタイトルが編集できないなどがあれば、これに返信いただければ結構です。

  • airvariable
  • 2017/06/06 (Tue) 22:34:34
Re: PIC16F886の自作間欠タイマ回路のプログラムのご質問
hayabusaさん、
ご質問の件は取り込んだバイナリデータをそのまま10進として利用したいという事ですね。
まずは設定時間を整数化する方法を考えると良いと思います。


RA0~3とRA4 ~7の2つに分けて別のレジスタに格納しておきます。

ここではTimeWorkL、TimeWorkHとしました
ex.
TimeWorkL = PORTA & 0x0f;//下位4ビット抽出
TimeWorkH = PORTA & 0xf0;//上位4ビット抽出
TimeWorkH = TimeWorkH >> 4 ;//上位4ビットを右シフト

ここで、2つのレジスタが9を超えた時の処理を入れます。
if文で簡単にできると思います。

if (TimeWorkL >9 ) TimeWorkL = 9;
if (TimeWorkH >9 ) TimeWorkH = 9;

最後に TimeWork という変数に計算結果を入れます。TimeWorkHは単純に10倍すればよいだけですので簡単です。

TimeWork = TimeWorkH * 10 + TimeWorkL;

これで0~99までの10進数の数が入ると思います。

他にもやり方がありますので、「16進 10進 変換 c言語」などと検索してみるとよいと思います。

宜しくお願いします。
  • airvariable
  • 2017/06/06 (Tue) 22:57:34
Re: PIC16F886の自作間欠タイマ回路のプログラムのご質問
アセンブラ的発想ですが、BCD上位桁を取込時に10/16倍、約分して5/8倍する。

BIN=PORTA
A=(((BIN & 0XF0)*5)/8)+(BIN & 0XF)

※ポート番号を引数で渡して、関数化する。

ついでにアセンブラでやるなら5/8=1/2+1/8
3回のシフトと足算でできます。
  • 老技師
  • 2017/07/15 (Sat) 08:25:05
Re: PIC16F886の自作間欠タイマ回路のプログラムのご質問
老技師さん、こんにちは。
これは、メモリーが高価だった時代のスーパーテクニックですね。
目から鱗です。
私も参考にさせていただきます。
ありがとうございました。
  • airvariable
  • 2017/07/16 (Sun) 10:29:06
Re: PIC16F886の自作間欠タイマ回路のプログラムのご質問
アセンブラで1命令単位で削るのは楽しいですね。
恐らく以下の方が速いと思います。

A = BIN - (BIN & 0xF0)*3/8
  • 雷更新世
  • 2017/07/16 (Sun) 13:17:58
Re: PIC16F886の自作間欠タイマ回路のプログラムのご質問
雷更新世さん、こんにちは。
なるほど、こういうテクもあるんですね。

今は64GBのSDカードが1000円も出すと買えますし、CPUのクロックも100円マイコンでも20MHzで動く時代で、
4ビット、8ビットマイコン世代でなければ、このアルゴリズムを理解する方達はもういないのかもしれません。

情報ありがとうございました。
  • airvariable
  • 2017/07/17 (Mon) 11:51:48

返信フォーム






プレビュー (投稿前に内容を確認)