o PIC奮闘記 (16F88 12F683 18F14K50 PIC12F1822 10F322 PIC12F1501 12C509 16F84A 18F452 XC8-AS PIC-AS等)


PICのページ Version 1.0

 ※このページはあくまで個人的な趣味によって書かれており、著者は全ての内容について、いかなる責任も負いません。

   第二章に飛びます

   第三章に飛びます

   第四章に飛びます


 ●重要なお知らせ●

  1.Windows10の対応

    MICROCHIP社の開発環境は、Windows10に対応しています。
    Cコンパイラも無償で使えます。
    MICROCHIP社の場合、古いCコンパイラもダウンロードできるのですが、Cコンパイラの最新は、XC8,XC16,XC32です。
    これから開発をする人は、XC8,XC16,XC32で開発したほうがいいと思います。
    なお、下記で紹介している秋月電子の「AKI-PIC プログラマーキット」は、Windows10では動作しないかも知れない ので注意が必要です。
    (秋月電子が、Windows10での動作を保証していません。)
    秋月電子のこのライターの動作を保証するわけではありませんし、Windows10の問題なのか調べているわけでもありませんが、
    私のWindows10(64ビット)パソコンの場合は、「AKI-PIC プログラマーV4 V6.76.1」 ※R04.06.01時点で最新 は、
    某社のUSB−シリアル変換器を使って接続した場合は、書き込みも動作も問題ありませんでしたが、オンボードのCOM1ポートでは
    書き込み中にエラーがでました。
    また、PICKITは、最新のMPLABX ※R04.06.01時点 では、PICKIT3以降でないと使えません。 
    
    これからPICを使う人は、マイクロチップ社のPICKIT3、またはPICKIT4を使ったほうがいいと思います。
    

  2.アセンブラ言語について

    最新のMPLABXでは、アセンブラのコンパイラーが、MPASMからPIC−AS(XC8−AS)に変更されています。 ※R04.06.01現在
    PIC−AS(XC8−AS)はマイクロチップ社のフリーの純正アセンブラで、MPLABXをインストールすると、自動でインストールされますが、
    このHPの中でも、MPASMアセンブラで作られているプログラムは、最新のアセンブラであるPIC−AS(XC8−AS)の記述に修正しないと
    コンパイルができません。
    ※PIC−ASは、インクルードやコンフィグ、ラベルの記述がXC8の記述に近くなっている他、ORGや数値の記述方法が変更されています。
    このHPでも、新規のアセンブラの開発は、PIC−AS(XC8−AS)を使用するようにしています。

 
PIC−AS(XC8−AS)

 
PIC12F1822の場合の変更例(MPASM ====> PIC−AS)
他にもシステムレジスタ等の宣言の一部や、MACRO定義の記述方法等も変更されているようです。
XC8の書き方を参考にするといいと思います。


    MPLABX(V6.10)※2023年08月時点の最新 で確認すると、PIC−ASはXC8をインストールしたフォルダにインストールされていました。
    XC8をデフォルトフォルダにインストールしなかった場合、これはPIC−ASに限った事ではありませんが、MPLABXのメニューバー[Tools]==>
    [options]==>[Embedded]==>[Toolchain(add)]と選択し、コンパイラーやアセンブラのインストール先をMPLABXに認識させる必要があります。

  3.ADM3202のコンデンサの接続について

    このHPのADM3202を使った回路図では、ADM3202の2ピンにつながっている0.1μFのコンデンサをGndにつないで
    実験していますが(図a)、ADM3202のデータシートでは、このコンデンサはVccにつなぐようになっています(図b)。
    実験では、このようなつなぎ方でもICのチャージポンプは正常に動作していますが、データシートでは(図b)のように記述され
    ているので、データシートの通りに(図b)のようにしたほうがいいと思います。

 




 私は、数年前まで、ある金融系会社やら研究所とやらでSEをしていた。
会社をリストラされ、やむなく某システム会社を起こした私は、暇を持て余していたが、
最近、眠っていた昔の血が騒ぎ出し、リックに半袖シャツ、短パンという姿で秋葉原に出かけては、壊れた機械を買いあさる変人である。
実は昔、趣味でZ80を使った妙な機械を作っていて、車やバイクをドレスアップしては、沿道の美女の注目を集めながら(ウソ)、
山道を豪快に飛ばしていた。
PICを使うようになったのは最近の事だが、これが面白くて、最近はPICで遊ぶ毎日である。


Z80のイメージ


秋月電子の「ROMライター」と、EP−ROM(27シリーズ)のイメージ



んで、どうするか?
数十年も経って目覚めた私は、すっかり時代遅れの人間になっていた。
使い慣れた27シリーズ用のROMライターや、開発ソフトは古すぎて、Windows XPパソコンでは動作しない。
雑誌の広告を見ると、Z80系ボードは今でも市販されているから、時間とお金をかければ動かせるのだろうが、
いまさら、そんな気はない。
そこで、Z80の代わりに使ってみたものの一つがPICだったのだが、これが思ったよりも使いやすかったという事である。


PICのイメージ


PICというと、12C509や16F84を一般的な知識としては知っていたが、メモリーが少ない制御デバイスというイメージしか持っていなかった。
だが、最近は、メモリーを128Kバイトも積んだ18F8720なんていうのが出ているし、他にも、18F452、16F88、12F683なんていう、新しいPICもある。
これは使えそうではないか。

ただ、PICでデータを扱う事には難しさを感じたが、最近は2線式や3線式のSerial EEP ROM(24, 93
シリーズ等)が安く出回っているので、これを使えば工夫できそうだし、
なにより、PICは初心者でもわかりやすい。
これは、遊びすぎて頭がボケてしまった私には、ありがたい事である。



用意した開発環境@

業務でPICを使うような本格的な人は別だが、
初めてPICを使う人には、秋葉原の秋月電子さんが出しているキットがお勧めだ。 ※注1)
このキットは、Serial EEP ROM(24、93シリーズ)を読み書きするアプリケーションも付いているので、
重宝している。
このキットを使った場合、パソコン以外でかかる費用は、合計でも一万円程度である。

・Windows XPが動くパソコン(RS232C端子付き)
 ※別途、USB=>RS232C変換モジュラーケーブル(秋月電子)を購入すれば、USB端子のみあればよい。
・AKI-PIC プログラマーキット Ver3.5(秋月電子)
・PICプログラマー Ver4バージョンアップ対応モジュールキット(秋月電子)
 ※私が主に使っている18F8720, 18F452, 16F88, 12F683はバージョンアップしないと使えない
・上記の最新版プログラム
 ※秋月電子さんのホームページより無料でダウンロードできる
・MPLABの最新バージョン
 ※マイクロチップ社さんのホームページより無料でダウンロードできる。
  (ファイルサイズが30Mバイト程度ある。)
・デバイスのマニュアル
 ※マイクロチップ社さんのホームページより無料でダウンロードできる。ただし、ここで紹介する
 デバイスの場合、日本語はほとんどない。


 ※注1)この文章を書いた時点での事です。
     今なら、AKI-PIC プログラマーキットより、マイクロチップ社のPICKIT3やPICKIT4のほうがいいと思います。
     但し、PICKIT3やPICKIT4は、現時点ではワンタイム品種(型番がPIC*****で、このHPで扱っているPICでは、
     PIC12C509等が該当)には対応していません。
     ワンタイム品のPICも使う場合は、この類のライターは必要になります。
     

秋月電子のPICプログラマーキットにバージョンアップキットを装着したイメージ
注)このライターは、Windows10パソコンでは動作しないかも知れないので注意が必要です。
(秋月電子が、Windows10での動作を保証していません。)

上記、「PICプログラマーキット」用の「USBシリアル変換ケーブル」

私の購入したバージョンでは、写真のAネジ(左右2本)がプログラマーキット基板上のDサブコネクタの
ネジにぶつかるので、基板との接続用に、キットにはDサブストレートケーブルが付属しています。
付属ケーブルの長さが邪魔になる場合、写真のような簡単なアダプタを作ってもいいと思います。

バージョンアップキットには、「Serial EEP ROM (24、93シリーズ)」ライターもついている


AKI−PICマイコンモジュールキットのイメージ
※シールがAKIPIC18になっていますが、デモプログラム書き込み済みのPIC16F84です。
PIC18シリーズではありません。

秋月電子では、PICとRS232ドライバーやOSC、三端子レギュレタを一枚の基板上に
まとめたモジュールも販売していて、「PICプログラマーキット」では、このモジュールに
そのまま書き込みができる(PICKIT2,3でも書き込みできますが)ようになっています。

なお、このマイコンモジュールを使った事例は、このHPが大きくなりすぎた都合で
ジャンクではありませんが、「(別室)ジャンクボードを活用しよう」 のページで
取り上げています。





用意した開発環境A

フリーのCコンパイラーも使用してみた。アセンブラで作成するだけなら、Cコンパイラーは不要です。

 ・HI−TECH PICC 

   PIC10Fシリーズ、12Fシリーズ、16Fシリーズで使用できるCコンパイラーです。
   Lite Editionが無償で使用できます。
   もともとは、HI−TECH社のCコンパイラーですが、現在は、マイクロチップ社のフリーのCコンパイラー
   として、デフォルトでは、MPLABをインストールすると、同時にインストールされます。
   古いバージョンでは、一部のPICにしか対応していませんでしたが、現在の最新バージョンでは、
   無償バージョンでも、ほとんどのPICに対応しています。

   HI−TECH PICCに限った問題ではありませんし、まれにアセンブラのプログラムでもある事ですが、
   使用するコンパイラーのバージョンによっては、インクルードファイルの記述が異なる事があるため、
   コンフィグワードの記述を修正しないと、プログラムのコンパイルが通らない場合があります。


 ・SDCC:Small Device C Compiler

   ※詳細は、 「(別室)Cygwinのページ」 を参照。


 ・MPLAB C32

   マイクロチップ社純正の32ビットマイコン用のCコンパイラーで、Lite Editionが無償で使用できます。
   有償のEditionとの違いは、オプティマイズレベルの違い等なので、趣味で使用するレベルの開発なら
   問題ありません。
   「第三章 32ビットPICを使ってみる」で使用する。

 ・MPLAB C30

   マイクロチップ社純正の16ビットマイコン用のCコンパイラーで、Lite Editionが無償で使用できます。
   有償のEditionとの違いは、オプティマイズレベルの違い等なので、趣味で使用するレベルの開発なら
   問題ありません。
   「第二章 16ビットPICを使ってみる」で使用する。


 ・MPLAB C18

   マイクロチップ社純正の18シリーズ用のCコンパイラーで、Lite Editionが無償で使用できます。
   有償のEditionとの違いは、オプティマイズレベルの違い等なので、趣味で使用するレベルの開発なら
   問題ありません。
   「第一章 USB PICを使ってみる」の開発では必須となるCコンパイラーです。


C18に限った事ではありませんが、
MPLABから使用する場合、プロジェクト毎に「Project」=>「Build options」=>「Project」で、各ライブラリのPathを指定しないとビルドできません。
 フォルダの右ボタンを押すと、最初にデフォルトのフォルダが設定される(通常はデフォルトでよい)ので、操作は簡単です 
    ※写真は、MPLAB IDE v8.53の例


C言語コンパイラーのオプティマイズレベルと、コードサイズの関係 ※マイクロチップ社のHPより抜粋
デバイスの性能をフルに活かす業務で使うようなプログラムでなければ、無償バージョン(Lite)でもあまり問題はないと思います。




 ・USBフレームワーク

   マイクロチップ社が提供しているUSBファームウエア。
   USB PICを使う場合、ユーザーはこのソフトウエアを使う事で、USBの仕様の詳細を知らなくても、
   簡単にUSBプログラムを開発する事が出来る。
   目的に応じて、下記の5種類のサンプルが提供されている。
    ・CDCクラス
    ・HIDクラス
    ・BOOTクラス
    ・Genericクラス
    ・Storageクラス
   開発には、上記の「MPLAB C18」が必須になる。
   「第三章 USB PICを使ってみる」の開発では必須となります。


 ・XC8,XC16,XC32

   R04.04.01現在、マイクロチップ社の最新のCコンパイラーで、無償で使用できます。
   インクルードファイルの定義を、#include <xc.h>に変更すれば、過去のCプログラムは簡単な修正で使用できるようです。


用意した開発環境B

 ・PICKIT2PICKIT3

   マイクロチップ社の提供する低価格のPICマイコンライター。
   最新のほとんどのPICマイコンにも対応していて、MPLABから直接ICSPで書き込みができるほか、
   (開発でコネクタの抜き差しは不要です)オンラインでデバッグもできる。
   今なら、AKI-PIC プログラマーキットより、こちらのライターがお勧めです。
   例えば秋月電子では、PICKIT2は3500円、PICKIT3は4500円、(H22.8現在)で購入できます。

   注)R04.04.01現在、PICKIT2は最新のMPLAB-Xに対応していません。PICKIT3かPICKIT4が必要です。

PICKIT2とPICKIT3の写真(PICKIT3になって、ケースのデザインがスケルトンに変更された)

PICKIT2、PICKIT3のコネクタピンレイアウト図(マイクロチップ社さんのマニュアルより抜粋)
ピン1〜5までを使用するデバイスのピンレイアウト図の通りに接続する(6:LVPは通常は使用しません)

PICKIT2とPICKIT3ではデバイスへの電源供給方法が異なります。
例えば、MPLAB V8.53(H22.8現在の最新)で、PICKIT3から回路に電源を供給するような場合、    
「Programer」=>「Settings」で、「Power target circuit from PICkit3」をチェックしないとデバイスに電源が供給されず、
デバイスを認識できません。 ※PICKIT2を使っている場合は、外部から供給されている電源電圧を自動で検地し、
電源をPICKIT2から自動で供給するので、電源をライターから供給するなら、PICKIT2のほうが使いやすいかも知れ
ません。PICKIT3は、回路に合った電源を外部から供給するような使い方のほうが使いやすいようです。

PICKIT2の写真(こんなアダプタを作っておくと便利だ)
※注)このアダプタで基盤上のPICに直接プログラムを書き込む場合は、基板の回路に工夫が必要です。

PICKIT2は、付属の書き込みツールを使うより、MPLABから使用したほうが操作が簡単だ  ※注)画面はMPLAB v8.10
※PICKIT2はUSB仕様なので、簡単な回路の実験なら電源は不要だ(PICKIT2からデバイスに応じた電圧が自動で供給される)
※MPLABのバージョンによっては、オペレーションや動作が異なる場合があります。

PICKIT2は、オンラインのデバッグも簡単だ(画面は、MPLABから24FJ64GA002をデバッグする例)  ※注)画面はMPLAB v8.10
※MPLABのバージョンによっては、オペレーションや動作が異なる場合があります。

PICKIT2やPICKIT3で、いきなりこんなメッセージが出た場合、付属のUSBケーブルが壊れている可能性があります。
「USB(A−miniB)」ケーブルは、ダイソーで100円で購入できるので、消耗品としてスペアを何本か用意しておくといいかも知れません。
付属の赤いケーブルは、コードを丸めて片付けたりすると、特に壊れやすいようです。



 ・J−LINK

   PICは、J−LINKで書き込むこともできます(他に「j-link microchip adapter」があると便利です)。
   現時点(R04.4.1現在)では、PIC32MX、PIC32MZ(MIPS系のMPU)のみ対応しています。
   J−LINKは、PIC以外の多くのMPUにも対応した書き込み器で、私は主にARM系のマイコンの開発で使用していますが、
   いろいろなツールが用意されていて多機能です。
   「j-link microchip adapter」は、コネクタの変換をしているだけですが、意外に高いので(5000円以上はする)、回路図も入手できるので、
   自分で作ってしまったほうがいいと思います。
   自分で作った場合、費用は200円位で30分もあれば作れると思います。
   
   私は、PICの書き込みにJ−LINKは使用しませんが、J−LINKを使用してARMマイコンに書き込む事例は、
    「(別室)ARMマイコンで遊ぼう」で紹介しています。

JLINKのイメージ






第一章 8ビットPIC(PIC10F/12F/16F/18F)を使ってみる

 6ピンPIC PIC10F200/PIC10F322を使ってみる


●電子じゃんけん(10F200/10F322)

10F200を使った簡単なサンプルだ。
このCPUは、SOT版は形状が6ピンの米粒大と超小型(DIP版は8ピンだが、うち2ピンは未使用)で、価格も安いので、
簡単な回路の置き換えに最適だ。 秋月電子のライターの書き込みにも対応している。
サンプルは、プッシュSWを押すと派手にLEDが点灯し、乱数でグー・チョキー・パーのいずれかのLEDで表示が止まるものだ。

このCPUは、他のPICに比べて機能が絞られているので、初めてPICを使う人でも簡単に扱えるCPUだと思うが、
GP2を汎用ポートとして使う場合は、OPTIONレジスタと、OSCCALレジスタのFOSC4ビットの設定が必要(詳細はプログラム
ソースを参照)なので注意が必要だ。また、VPP機能のあるGP3ピンは入力専用端子だ。  ・・・・サンプル@

サンプルAは、サンプル@を10F322に置き換えたものだ。
10F322は、CPUの構造が10F200とはかなり異なっているので、置き換えには注意が必要だ。

サンプルB〜Dは、サンプル@をHIーTECH C言語に置き換えたものだ。

 

基板の写真(表/裏) 

回路図 (DIP版の場合)

s10f200-0001.asm

サンプル@ プログラムソース(MPLAB用/10F200/MPASM アセンブラプログラム)

s10f322-0001.asm

サンプルA プログラムソース(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f200-0001.c

サンプルB プログラムソース(MPLAB用/10F200/HI-TECH(Version9.70) C言語プログラム)

s10f200-0002.c

サンプルC プログラムソース(MPLAB用/10F200/HI-TECH(Version9.83) C言語プログラム)

s10f322-0001.c

サンプルD プログラムソース(MPLAB用/10F322/HI-TECH(Version9.83) C言語プログラム)










●実験ボード タイプ1(10F322)

10F322を使った簡単な実験ボードを作ってみた。
このCPUは、NCOやCLC等、特徴のあるモジュールを内蔵しているCPUだ。

 

基板の写真(表/裏)/回路図 


 (1)NCO機能を使ってみる(その1)   (10F322)

  10F322に内蔵されているNCO機能を使って、100KHzと1KHzを出力するサンプルを作ってみた。
  この機能を使うと、任意の周波数のパルスを簡単なプログラムで出力する事ができるので、オシレータとして使うには最適だ。

 

写真/回路図 

 

オシロスコープの出力イメージ(100KHzのサンプル) 

s10f322-0001.asm

サンプル@ プログラムソース 1KHz(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0002.asm

サンプルA プログラムソース 100KHz(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0003.c

サンプルB プログラムソース 100KHz(MPLAB用/10F322/HI-TECH(Version9.83) C言語プログラム)









 (2)NCO機能を使ってみる(その2)   (10F322)

  水晶発振器とNCO機能を使って、精度の高いオシレータを作ってみた。
  サンプル@は、12.80000MHzの水晶発振器を2^7分周しているもので、精度の高い100KHzを出力し、サンプルAは、
  2^8分周して、精度の高い50KHzを出力する。
  12.80000MHzの水晶発振器を使ったのは、手持ちの部品の都合からですが(秋月電子の50Hzタイムベースキットで
  使っていた部品です)、NCOで精度の高い周波数を出力をするには、水晶の周波数は、出力する周波数に対して
  1/(2^n)になるように選んでやる必要があります。

 

アダプタ基板/アダプタ基板を10F322の実験ボードに取り付けたイメージ/回路図
使用したオシレータはAC出力なので、出力に10KΩ*2がないと正常に動作しません(回路はオシレータの種類により異なります)。
動作させる時はPICKIT3は外してやる必要があります(外さないと中点がずれて、このオシレータの回路では動作しません)。
10KΩの抵抗、及び0.1μFのコンデンサは、基板銅箔面に取り付けているチップ部品です 

 

オシロスコープ、周波数カウンタで測定した出力イメージ(100KHzのサンプル) 

s10f322-0001.asm

サンプル@ プログラムソース 100KHz(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0002.asm

サンプルA プログラムソース 50KHz(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0003.c

サンプルB プログラムソース 100KHz(MPLAB用/10F322/HI-TECH(Version9.83) C言語プログラム)









 (3)CLC機能を使ってみる   (10F322)

  CLC機能を使って、簡単なサンプルを作ってみた。
  サンプル@は、SW1を押すと、NCO機能で発生させた1KHzを出力するもので、
  ORとインバータを組み合わせたものです。
  なお、マイクロチップ社では、CLC機能の設計を支援するGUIツール(CLC Designer)を無償で提供しており、
  CLCのレジスタの設定は、このツールを使って記述する事もできます(アセンブラ・C言語に対応しています)。
  
  サンプルAは、サンプル@をHI−TECHのC言語に置き換えたものです。

  サンプルBは、SW1を押すと、PWM(1KHz、デューティ25%)とNCO(10KHz)を合成したパルスを出力する
  ものです。
  
  サンプルCは、サンプルBをHI−TECHのC言語に置き換えたものです。

 

アダプタ基板/アダプタ基板を10F322の実験ボードに取り付けたイメージ/回路図

 

サンプル@のロジックイメージ(概略)とオシロスコープによる出力イメージ 

 

サンプルBのロジックイメージ(概略)とオシロスコープによる出力イメージ 

 

CLC Designerを使った場合の、CLCの設計イメージ
このツールは、使い方が簡単で使いやすいです(このツールを使うと、CLC部分の設定が簡単になります)

s10f322-0031.asm

サンプル@ プログラムソース(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0032.c

サンプルA プログラムソース(MPLAB用/10F322/HI-TECH PICC(Version9.83) C言語プログラム)

s10f322-0033.asm

サンプルB プログラムソース(MPLAB用/10F322/MPASM アセンブラプログラム)

s10f322-0034.c

サンプルC プログラムソース(MPLAB用/10F322/HI-TECH PICC(Version9.83) C言語プログラム)









 (4)オルゴールをAMラジオに飛ばしてみる   (10F322)

  CLC機能を使って、メロディー(ドレミファ〜)をAMラジオの1MHzに飛ばしてみました。
  Fosc(1MHz)と、NCOで作ったメロディーを、CLCで合成しているものです。

  この周波数は、他の放送局と重なりますし、電波法の問題もあるので、アンテナは1mHのインダクター(ソレノイドタイプ)で代用し、
  出力はごく微小にしてあります(ラジオはギリギリまで近づけないと何も聞こえません。電波で飛ばすというより、ラジオを近づけて
  モニタスピーカーの代わりに使っているイメージです)。
  インダクターは、トロイダルコアタイプでは、おそらく出力が小さくなりすぎて使えません(テストはしていません)。
  
  サンプルAは、サンプル@のアセンブラバージョンです。

 

写真/アダプタ基板/回路図
クロックに内臓オシレータを使っているので、出力周波数の精度は、1000KHzピッタリなわけではありません。
高性能なデジタル周波数選局のラジオで1000KHzをデジタル設定した場合、受信できないかも知れません。
精度を高くするなら、オシレータは水晶を使う必要があります。

 

CLCの設定イメージ 


s10f322.c

サンプル@ プログラムソース(MPLAB用/10F322/HI-TECH PICC(Version9.83) C言語プログラム)

s10f322.asm

サンプルA プログラムソース(MPLAB用/10F322/MPASM アセンブラプログラム)


  









8ピンPIC PIC12F683/PIC12F1822/PIC12F1501 を使ってみる


PIC12F683のピンレイアウト


PIC12F1822のピンレイアウト


PIC12F1501のピンレイアウト


PIC12F683/PIC12F1822/PIC12F1501の機能比較


●ドット表示式 2桁電子サイコロ(12F683,12C509A)

初めて作ったおもちゃだが、気に入っている。
LEDを光らせるだけなので、部品が少なく、作るのは簡単だ。


点灯イメージ


動作イメージ


・8ピンDIP型の12F683には、PORTが6ビット(出力として使えるのは5ビット)で、2桁のサイコロ(14個のLED)
を制御するので、ダイナミック方式にしている。これは、表示を高速で切り替える事で人間の目には
両方のサイコロが点燈しているように見せるもので、表示器ではお馴染みだ。
・2つの乱数は、ボタンを離している時と、押している時に、変数を高速でカウントする事で作っている。この状態でボタンを離すと6進アップ・ダウンカウンタによりサイコロが動き出す。
・ドライバーを省いているから、電源を3V以上にしたり、抵抗を小さくしてLEDを明るくしたりするとPICが壊れてしまう。
・実験なので、コメント行を変えれば12C509Aでも使えるが、12C509Aはワンタイム品である。
100,000回程度の書き換えが可能で値段もあまり変わらない12F683を使うべきだろう。
12C509Aは、12F683に比較していろいろと制約も多い。例えば、
 @スタックの制約で、CALLが2段階までしか使えない(12F683は8段階まで可能)
 A内部クロックを使用する場合、4MHzまでしか使えない(12F683は8MHzまで)
 BRETURNコマンドがない(RETLWコマンドを使用する)
 Cプログラムメモリーが1Kワードしかない(12F683は2Kワード。こんなに短いプログラムだと、関係ない話だが)
         ・・・・・その他
・RETLWのテーブル参照を使っているので、プログラムをいじると動かなくなる可能性がある。
(この方法は、PICで文字列を扱う場合によく使われるが、PCLがアドレスの下位8ビットしかアクセスしない制約がある為に、記述によってPCLが上位のアドレスをまたぐとトラブルが発生する。最初は原因がわかりにくいので、PICのバグだと思い込む人も多い。)
・(どうでもいい事だが)手書きフリーハンドのプリント基板だ。

なお、実験で同じ機能のものを、HI−TECH PLCC C言語でも作成した。(サンプルA、サンプルB)

ダイナミック方式を使った2桁電子サイコロの動作原理

 

基板の写真(表/裏) 

回路図

s11.asm

サンプル@ プログラムソース(MPLAB 12C509A/12F683用 MPASMアセンブラプログラム)

s11a.c

サンプルA プログラムソース(MPLAB 12F683用 HI-TECH PLCC C言語プログラム)

s11b.c

サンプルB プログラムソース(MPLAB 12F1822用 HI-TECH PLCC C言語プログラム)









●4入力 => PC出力 電圧測定器(12F683)

12F683には、4チャンネルの10ビットD/A Converterが内蔵されている。
このサンプルは、この機能を使って、4つの入力端子の電圧を測定し、パソコンに送信するサンプルだ。
パソコン側のアプリは作っていないので、データはWindows/XPのアクセサリについていた「ハイパー
ターミナル」で受けている。
ADM3202は、RS232Cレベルコンバーターで、信号電圧をRS232Cに変換しているだけだ。
基板にも回路図にもないが、実際には、入力側に測定する電圧に応じた分圧抵抗が必要だ (このサンプル
は、電源電圧を基準にしているので、5Vの時に1023と表示される)。
なお、入力−GNDは抵抗でプルダウンしておかないと、入力をオープンにした時にデタラメな値が表示されてしまう。

写真

回路図(電源部を除く)

ポートの設定(Windows/XP ハイパーターミナルの場合)

s21.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●2入力2出力 PCリレードライブ(12F683)

RS232Cシリアルリレードライブだ。
パソコンから、テレビや蛍光灯の電源をコントロールするために作ったものだ。
2つのリレーを制御するが、12F683のピンが余ったので、他に2つの入力端子をつけている。
パソコン側のアプリは作っていないので、コマンドは、Windows/XPの「ハイパー ターミナル」から入力する。


 ※この記事のパソコン側のアプリケーションが、 「ActiveBASICのページ」 にあります。
 写真は、ハイパーターミナルでなく、ActiveBASICを使った場合のパソコン画面イメージ


写真

回路図(電源部を除く)

ポートの設定(Windows/XP ハイパーターミナルの場合)

s81.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●EEP-ROM(AT24C256/I2C方式)、及びPIC内部のData-EEP-ROM 読み書きサンプル(12F683)

PIC12F683内部のData EEP-ROM、及びAT24C256に5バイトのデータを書き込み、 読み込む簡単なサンプルだ。
Windows/XPの「ハイパーターミナル」を使用してテストした。
24シリーズのEEP-ROMは、種類により、アドレスの設定方法が異なる(アドレス設定ピンの数が違う)ので、
注意が必要だ。

EEPの種類により、アドレスの設定が微妙に異なっている(メーカーマニュアルより抜粋)


写真

回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

s95.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●EEP-ROM(AT93C86/Microwire方式)読み書きサンプル(12F683)

AT93C86に5バイトのデータを書き込み、読み込む簡単なサンプルだ。
アトメル社のAT93C86を8ビットモードで使用し、Windows/XPの「ハイパーターミナル」を使ってテストした。
この種のEEPは、電源立ち上げ時にはEWDS(Erace/Write Disable)モードになっている。
EEPからデータを読み込む時はいいのだが、書き込む時は、EWEN(Erace/Write Enable)コマンドでプログラムモード
を変更してやらないと書き込みは出来ないので注意が必要だ。


写真

ハイパーターミナルの実行イメージ

回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

s96.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●パソコンキーボード(PS/2 106日本語キーボード)のPIC接続用アダプタ(12F683)

PICにパソコン用のキーボードを接続するアダプタだ。
キーボードで押された文字(Make)の文字コード(A-Z,0-9)を、RS232Cシリアル通信で返す。
18F8720/18F452マザーボード用に作ったものだが、使い方が簡単なので、H8等、PICに限らず使用可能だ。
PICで使う場合、通常、ADM3202は使用せず、12F683のGP4/GP5を、直接マザーボードにつないで使う(クロスさせてつなぐ)
が、ここでは説明のため、ADM3202を使ってパソコンのハイパーターミナルにつないでみた。
プッシュスイッチを大量に購入して作っても良いのだが、パソコン用のキーボードは安いので、このほうが安上がりだ。

PS/2キーボード内部には専用のワンチップCPUが使われていて、パソコンとの間は、調歩同期式シリアル通信が
行なわれている。
この間のコードは文字コードではなく、キー番号に対応したコードなのだが、このコードはキーボードにより若干異なる
ために、106日本語キーボード以外(例えば英語キーボード等)を使うなら、文字コードが正しく一致しないため、
コード変換部分の簡単な修正が必要だ。
また、英数字及びEnter以外のキーの処理はしていないが、必要なら、コード変換部分に追記するだけだ。

写真・回路図・PS/2 キーボードコネクタの接続図


18F8720/18F452マザーボードにつなぐ場合

ポートの設定(Windows/XP ハイパーターミナルの場合)

se1.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●ワイヤレス式・パソコンキーボード(PS/2 106日本語キーボード)のPIC接続用アダプタ(12F683)

テレビやビデオのリモコンで使われている、赤外線LEDと受信モジュールが秋月電子で200円程度で購入
できるので、これを使って、上記アダプタをワイヤレス式にしてみた。
数メートル程離れても確実な動作をするが、無調整で、おおざっぱなタイミング計算しかしていないためか、
文字化けがひどく、このプログラムは、お勧めできない。



写真



送信側の回路図



受信側の回路図

se5.asm

送信側プログラムソース(MPLAB用 アセンブラプログラム)

se6.asm

受信側プログラムソース(MPLAB用 アセンブラプログラム)





●PWM方式 12V小型直流モータードライブ(12F683)

PICで12V小型直流モータを動かしてみた。
マザーボードから制御してもよいのだが、鉄道模型のスピード調整用に作ったのでボリュームをつけている。
ボリュームの位置が中央で停止、左に回すほど後進でスピードが速くなり、右に回すほど前進でスピードが速く
なるようにしてある。
それだけの機能を電圧で制御するだけなら、単にトランジスタとVRだけでできてしまうのでPICなど不要だが、
ここではデューティーサイクルを変化させるPWM方式で制御してみた。
この方法は、止まりそうなくらいの低速でもモーターをスムーズに制御できるので、模型には最適だが、単に高速
回転させるだけのようなモーターに使うと、大きなノイズや雑音を発生させたり、寿命を短くする事がある。
この方式の場合、トランジスタの損失がほとんどないので、トランジスタは主に電流値を考えればよく、比較的小型
のトランジスタが使えるが、電圧を高くしたり、大きなモーターをつけたりするなら、トランジスタは大型のものに
変える必要がある。
また、鉄道模型に使うなら、電源供給側にレギュレタを入れるなど、過電流保護対策が必要だ。

写真・回路図・PWM方式

sg1.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●ACパルス発振器(12F683)

実験的な意味で、上記「PWM方式 12V小型直流モータードライブ」で作った基盤をそのまま使って、ACパルス発振器の
プログラムを作ってみた。
VRを回すと、周波数が100Hz〜25KHz程度に変化し、波形の大きさは供給する電圧を変化させる事で変える事ができる。
但し、A/D ConverterがVRの設定値を読み込む時間が必要なので、この回路では、周波数をあまり高くできない。
また、実際に波形を見てみると、かなりノイズを発生していて波形も安定していないので、このままではお勧めはできない。

回路図

sg2.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●3V1A スイッチングレギュレタ(12F683)

チョッパー型スイッチングレギュレタを作ってみた。
入力に8〜15V程度の電圧をかけると、3Vの電圧を出力する。
プログラム中の電圧パラメータを変える事で、出力電圧は変更する事ができる。
特殊な部品は使っていない。コイルは一般に市販されているものだ。
コイルにつながっているダイオードは、一般的なシリコンダイオードでは駄目で、ショットキーや、ファーストリカバリー
等のダイオードを使う必要がある。
出力の1000μFの平滑コンデンサは、容量をあまり変えると動かなくなる可能性がある。

写真


回路図

si1.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●0〜99999Hz 周波数カウンタ(12F683)

12F683のTIMER1-MODULEを使って、5桁の周波数カウンタを作ってみた。
12F683には、タイマーモジュールが3つあり、それぞれの機能も、16F84等に比較して、かなり充実している。
パソコン側のアプリケーションは用意していないので、測定結果はハイパーターミナルに出力する。
32.768KHzの水晶を分周して1Hzのタイマー割り込みを行なっているが、精度を要求されないカウンタ
の処理は、なるべく高速にするため、内部の8MHzOSCを使用している。
この水晶は、時計などでよく使われている一般的なもので、秋葉原の千石電子で、シチズン社製のもの
を100円程度で購入した。
入力用のアンプは作らなかったので、この周波数カウンタの入力電圧はTTLだ。

写真


回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

sl1.asm

プログラムソース(MPLAB用 アセンブラプログラム)





基盤の隅が余るので、アンプを追加してみた。
周波数が低いので、単電源汎用オペアンプ(LM358)を使っている。
それ以外は、上記と全く同じだ。

 ※この記事のパソコン側のアプリケーションが、 「ActiveBASICのページ」 にあります。


写真


回路図

sl1.asm

プログラムソース(MPLAB用 アセンブラプログラム)









●風速計(12F683)

ダイソーで購入したガーデニング用の風車に、フォトトランジスタを2つ取り付けて、風速計にしてみた。
外光を常に受けるフォトトランジスタと、外光を受けたり風車で遮られたりするフォトトランジスタの
2つの電圧の差をカウントして、風車の回転数を検知する。
測定結果はシリアル通信でパソコンに連動する。
風車に2つのフォトトランジスタを取り付けるだけなので、木工工作は簡単だ。
なお、風車は太陽光の方向に向けるか、風車に電球等の光を当ててやる必要がある。

写真


仕組み


実行イメージ(ハイパーターミナル)


回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

sp1.asm

プログラムソース(MPLAB用 アセンブラプログラム)









●睡眠器(12F683)

睡眠効果が本当にあるのかどうかは疑問だが、昔、睡眠器として購入したものをPICで再現してみた。
内容は、時間の経過に連れて、光と音の点燈間隔が広くなっていき最後は止まる、単なる間欠発信器だ。
それだけだと作るにはあまりにも単純なので、下記で紹介している「電子オルガン(16F88、16F819、16F84A、12F683)」
を一曲鳴らしてから、プログラムがスタートするようにしてある。
外部端子は拡張用に付けたもので、このサンプルでは使っていない。
青・黄・赤の豆球は、LEDと違って、暗闇では目が眩むほどまぶしいが、1個で0.3Aも消費するので、1Aが余裕で取れる3.3Vの電源が必要だ。
容量が小さな電源では、急な電圧降下でPICが誤動作してしまって正常に動作しない。

写真


回路図

pp0003.asm

プログラムソース(12F683バージョン MPLAB用 アセンブラプログラム)

pp0003_2.asm

プログラムソース(12F629バージョン MPLAB用 アセンブラプログラム)







●モールス信号発生器(12F683)

電源を入れると、「A−Z」、「0−9」のモールス信号を出力する。
16F88で作った「モールス信号発生器@」を、12F683用のSDCCのサンプルを作って見るために、移植してみただけだ。
コンパイルは、sdcc  -mpic14  -p12f683  [プログラム名] で行なう。 (サンプル@)

また、サンプル@と同じものをHI−TECHでも作成した。(サンプルA、B)


写真


回路図



sac21a.c

プログラムソースサンプル@(12F683 SDCC用 C言語プログラム)

sac21b.c

プログラムソースサンプルA(12F683 HI-TECH PICC(Version9.83) C言語プログラム)

sac21c.c

プログラムソースサンプルB(12F1822 HI-TECH PICC(Version9.83) C言語プログラム)









●PWM方式 DC12V用 調光器(12F683)

カーアクセサリー用に作った調光器だ。
このような用途には、例えば、0Vから可変の電源器を作ってやると、回路は簡単なのだが、
車用のランプは大型のものが多くて、ドライバーに大型の放熱器が必要になるので、PICでPWM制御したほうが、
簡単で、小型化する事ができるようだ。
電圧可変型の調光器については、 「(別室)レトロのページ」 で紹介している。

入力にDC12V(8〜16V程度まで可能)をつないで、出力に、ランプやモーターを接続して使用する。
プログラムは、12F683に内蔵されているA/Dコンバーターと、CCPモジュールを組み合わせただけのものだ。
使用したMOS−FET(μPA2753GR)は、秋月電子で4個100円程度で購入できるチップ形状の安価なものだ。
なお、この回路は、無負荷だと正常に動作しない。
出力に何もつながない可能性があるなら、回路図にある2KΩ(値は特にこだわらない)は必須だ。
このMOS−FETは、形状は小さいが、カタログ上の最大値は8A(実際はそんなに流せないが)だ。

簡単なアセンブラのプログラムだが、実験で、C言語(SDCC)にも移植してみた。


写真


回路図



sad01.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)

sad02.c

プログラムソースサンプル(12F683 SDCC用 C言語プログラム)








●入力;DC5V 出力;正負3.4V チャージポンプ方式 昇圧型レギュレタ(12F683)

オペアンプの電源用に作った昇圧型レギュレタだ。
DC5Vを入力すると、正負3.4Vの電圧を得る事ができる。
このような昇圧レギュレタは、コイルを使ったスイッチング方式が一般的だが、チャージポンプ方式のほうが、
ノイズが少なく、簡単で、効率が高く、動作が確実等、メリットが多いようだ。
また、この方式は、昇圧部分を重ねていく事で、電源電圧のn倍の出力を得るような使い方もできる。
ショットキーを使って周波数を上げてやれば、小型化することも可能だ。

※注1)コンデンサのチャージが完全に抜けていない状態で電源を再投入すると、PICが正常に起動しません。
回路図中にある+5Vの470Ωは、コンデンサのチャージを抜くために必要です。
※注2)MOS−FETでは、正常に動作しない可能性があります。
※注3)12C509Aバージョンは、私が在庫を大量に持っているので作っただけです。


写真


回路図



sag01.asm

プログラムソースサンプル(12F683 MPLAB用 アセンブラプログラム)

sag02.asm

プログラムソースサンプル(12C509A MPLAB用 アセンブラプログラム)








●トライアック方式 AC100V 50Hz用 調光器(12F683)

トライアックを使って、白熱電球用の調光器を作ってみた。
ボタン@(ポート0)を押すと白熱電球が徐々に明るくなり、ボタンA(ポート1)を押すと徐々に暗くなり、ボタンB(ポート2)を
押すと一気に暗くなる。
トライアックは、PICとトランジスタで直接ドライブする事もできるのだが、大変危険であるし、フォトトライアックが
100円程度(秋月電子では、数個で100円程度)で買えるので、これを使ってACラインと絶縁した。
なを、調光器として使用する場合には、フォトトライアックは、非ゼロクロスタイプを選択する必要がある。

トライアックは、ほとんどのものが使用可能だと思うが、ここでは小型の12Aのものに、小型の放熱器を使用した。
普通の白熱電球は200W程度くらいまでしかないと思うので、12Aのトライアックでも、充分すぎるくらいだ。


写真


回路図



sag11.asm

プログラムソースサンプル(12F683 50Hz用 MPLAB用 アセンブラプログラム)








●赤外線リモコン解析器(12F683)

赤外線リモコンの解析器を作ってみた。
古くて使わなくなったテレビやAV機器のリモコンを、PICで活用しようというものだ。
リモコンを赤外線受信モジュールに向けて、リモコンのボタンを押すと、送信されたリモコンのコードを解析して、
ハイパーターミナルに表示する。
本来は、マザーボードにつないでコードを送信し、マザーボードをリモコンで制御するために作ったものだ。
※このような使い方をする場合は、DATOUT関数中の、「CALL DEBNUM4」の行のコメントをはずす。

リモコンの仕様は各社バラバラであるし、変調方式も一様ではないので、全てに正確に対応しているわけではないが、
多くのリモコンは、PPM方式(Pulse Position Modulation)であるようなので、実験したテレビやAV機器のリモコンでは、
全て解析可能だった。


写真


ハイパーターミナルのイメージ


コードの簡単な解析イメージ(例)  ※注)コードはメーカにより異なる

ポートの設定(Windows/XP ハイパーターミナルの場合)


回路図



sag21.asm

プログラムソースサンプル(12F683 MPLAB用 アセンブラプログラム)








●自転車用ヘッドライト(12F683)

ライトの点滅で、モールス信号のメッセージを送るヘッドライトだ。
電源を入れると、A〜Z、0〜9の文字を、モールス信号で出力する。
ランプ点滅の応答速度は遅いので、この程度の点滅速度が限界のようだ。
ダイソーで購入した自転車用ヘッドライトにPICを組み込んだもので、 プログラムは、フリーのSDCCを使ったC言語の
プログラムだ。 ※上記の「モールス信号発生器」のプログラムに、簡単な修正をしただけのものだ。

コンパイルは、sdcc  -mpic14  -p12f683  [プログラム名] で行なう。


写真@


写真A 乾電池では1時間位しかもたないので、6V小型バッテリーと、5V低損失レギュレタを追加してみた


回路図



sag31.c

プログラムソースサンプル(12F683 SDCC用 C言語プログラム)








●100円オルゴール(12F509/12F629/12F683)

12F509を使ったオルゴールだ。
このマイコンは、スタックが2段しかなく、メモリーも少ないなど性能的には12F683に劣るが、
秋月電子では60円(12F683の半額もしない)で購入できるので、圧電ブザー(30円)、コンデンサ(10円)と合わせても、
簡単なオルゴールが100円で出来てしまう。

サンプル@は、懐かしい童謡を一曲入れてある。
12F629、12F683バージョンも作ってみたが、これは12F509バージョンをそのまま移植したものだ。
こちらのマイコンは、スタックが8段あるので、もう少しきれいなプログラムにもできるのだが。


写真
注1)基板についているシリコンダイオードは、電源の逆接続防止用に入れているもので通常不要です        
注2)マイコンの下にある未使用の3Pコネクタは、サーボモータをつなぐためのもので、この記事とは関係ありません


回路図



pag0141.asm

プログラムソース サンプル@(12F509用 MPLAB/MPASM アセンブラプログラム)

pag0141b.asm

プログラムソース サンプル@(12F629用 MPLAB/MPASM アセンブラプログラム)

pag0141c.asm

プログラムソース サンプル@(12F683用 MPLAB/MPASM アセンブラプログラム)








●模型用サーボモータサンプル(12F683/12F509)

模型用サーボモータを動かす簡単なサンプルだ。
16F88用に作ったサンプルを12F683用に作り直したものだ。
使用したサーボモータは、GWS製のS03N/2BBMG/F(フタバ)で、秋月電子で1000円程度で購入できるものだ。

サンプル@は、12F683のCCPモジュールとTIMER1を組み合わせたもので、 -60°==> 中央 ==> +60°==> 中央 という動きを繰り返す。
サンプルAは、サンプル@をC言語(SDCC)、XC8で書き直したものだ。
       SDCCのコンパイルは、sdcc  -mpic14  -p12f683  [プログラム名] で行なう。
       XC8バージョンは、SDCCバージョンとConfigワードの記述が違っているだけで、他は同じです。
サンプルBは、12F509バージョンだ。12F509にCCPモジュールは内蔵されていないので、プログラムによるループ方式だ。


写真/回路図/サーボモータの制御方法

pag0160.asm

プログラムソース サンプル@(PIC12F683用 MPLAB/MPASM アセンブラプログラム)

pag0160.c

プログラムソース サンプルA(PIC12F683用 SDCC C言語プログラム)

pag0160.c

プログラムソース サンプルA(PIC12F683用 XC8 C言語プログラム)

pag0160b.c

プログラムソース サンプルB(PIC12F509用 MPLAB/MPASM アセンブラプログラム)








●シリアル入力・サーボモータ(12F683)

外部からシリアル通信で角度(-60°〜+60°)を入力し、サーボモータを動かす簡単なサンプルだ。
説明のために、パソコンのハイパーターミナルにつないで角度を入力するプログラムにしてあるが、本当はマザーボードにつないで
マザーボードから複数のサーボモータを動かすような使い方を想定している。

サンプル@は、12F683のCCPモジュールとTIMERを組み合わせたものだ。
システムクロックを内部500KHzで動かしている(内部8MHzにもできるのだが、CCPモジュールのプログラムを簡略化するため
このような使い方をしている)ので、ハイパーターミナルの通信速度は1200BPS(他の通信パラメータは上記と同じ)にしてある。
なお、簡単なエラーハンドリングが入っているので、誤ったフォーマットではキー入力できない。


写真/回路図/使い方

pag0161.asm

プログラムソース サンプル@(PIC12F683用 MPLAB/MPASM アセンブラプログラム)








●シリアル入力・サーボモータA(12F683)

外部からシリアル通信で角度(-60°〜+60°)を与えて、サーボモータを動かすサンプルだ。
模型工作等で、マザーボードから複数のサーボモータを動かすような使い方を想定している。
(たくさんのサーボモータを動かすなら、I2Cにした方がいいと思う。) ※「(別室)インターフェースのページ」 を参照。
このようなサンプルの場合、データ形式はキャラクターよりバイナリー形式のほうがマザーボードの処理が簡単なので、
角度データ(-60°〜+60°)を、0〜120(Hex Decimal)の1バイトバイナリー形式で与えるようにしてある。
正常なデータ形式ならエコーバックし、誤りがあればFF(Hex)を返すので、簡単なエラーハンドリングも可能だ。

マザーボードは、簡単な通信プログラムがあれば何でも良いのだが、ここでは説明を簡単にするために、
16F88の実験ボードを使用した。

 サンプル@は、16F88実験ボードから、−60°==>0°==>+60°==>0°とデータを送信してサーボモータを動かすもので、
 マザーボードからはシリアル通信(1200BPS)で、0==>60==>120==>60==>0・・・のバイナリーコードを送信している。
 プログラムは、16F88内臓のタイマーモジュールと、USARTモジュールを組み合わせたものだ。


写真/回路図/使い方/通信設定

pag0171.asm

プログラムソース サンプル@ クライアント側(PIC12F683用 MPLAB/MPASM アセンブラプログラム)

pag0172.asm

プログラムソース サンプル@ マザーボード側(PIC16F88用 MPLAB/MPASM アセンブラプログラム)








●Sin波発生器(12F683)

12F683に内蔵されているVOLTAGE REFERENCEは、これをDAコンバータとして出力するような使い方はできないが、
例えば内臓のコンパレータと組み合わせると、簡単に4ビットのDAコンバータの機能を作る事が出来る。
サンプルは50HzのSin波を発生するようにしたものだ。
なるべく改造しやすいように波形のデータはプログラム中にベタで書いてある。波形を変える場合は、この部分を修正するだけだ。
使用したオペアンプは単なるボルテージフォロアなので、安価な汎用オペアンプを使用した。

サンプル@はアセンブラバージョン(MPLAB/MPASM)、サンプルAは、同じものをC言語(SDCC)で作ったものです。
SDCCのコンパイルは、sdcc  -mpic14  -p12f683  [プログラム名] で行ないます。

サンプルBはHI−TECH PICCバージョンです。
周波数の精度は高くはないので、精度を高くするなら、タイマーの微調整が必要です。


写真/回路図/測定結果

prg1.asm

プログラムソース サンプル@ (PIC12F683用 MPLAB/MPASM アセンブラプログラム)

prg1.c

プログラムソース サンプルA (PIC12F683用 SDCC C言語プログラム)

prg1a.c

プログラムソース サンプルB (PIC12F683用 HI-TECH PICC(Version9.83) C言語プログラム)








●実験ボード・タイプ4A(PIC12F1822)

PIC12F1822を使った簡単な実験ボードを作ってみた。
12F1822は、「EUSART」や、「DAC」が内蔵され、クロックが最速32MHzとなり、他に「CAPACITIVE SENSING MODULE」、その他の
特徴ある機能が内蔵された、12F683の置き換えにも最適と思われるものだ。


写真/回路図



 (0)基本操作

  LEDをつないで点滅させてみました。

  サンプル@は、Timer1を使って、1秒毎にLEDを点滅させるものです
  サンプルAは、Timer1割り込みを使って、1秒毎にLEDを点滅させるものです


写真/回路図

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 Timer1) MPLAB/MPASM アセンブラバージョン

sample1.c

プログラムソース サンプル@ (PIC12F1822用 Timer1) HI-TECH PICC(Version9.83) C言語バージョン

sample1.c

プログラムソース サンプル@ (PIC12F1822用 Timer1) XC8 C言語バージョン


sample2.asm

プログラムソース サンプルA (PIC12F1822用 Timer1割り込み) MPLAB/MPASM アセンブラバージョン

sample2.c

プログラムソース サンプルA (PIC12F1822用 Timer1割り込み)  HI-TECH PICC(Version9.83) C言語バージョン



 (1)EUSARTを使ってみる

  12F1822に内蔵されたEUSARTモジュールを使って、簡単なエコープログラムを作ってみた。
  ハイパーターミナルにつないで使用する。
  
  サンプル@は16MHz、サンプルAはPLLで32MHz動作させているが、実験では32MHzで動作させた場合、
  スタート直後は数10[mS]以上のWaitを入れないと、EUSARTは安定して動作しない。

  サンプルBは、サンプル@を「HI_TECHのPICC C言語」に置き換えただけのものだ。
  このCコンパイラーは、マイクロチップ社のHPよりダウンロードできるが、バージョンによりCONFIGが異なる場合があるようなので、
  修正が必要になる可能性がある。このサンプルで使用したバージョンは、9.70だ。


写真/ハイパーターミナルのイメージ/回路図


ハイパーターミナルの設定

prg1.asm

プログラムソース サンプル@ (12F1822用 16MHz MPLAB/MPASM アセンブラプログラム)

prg2.asm

プログラムソース サンプルA (12F1822用 32MHz MPLAB/MPASM アセンブラプログラム)

prg3.c

プログラムソース サンプルB (12F1822用 16MHz HI_TECH PICC C言語プログラム)



 (2)電圧計(0〜10.23V)にしてみる

  12F1822に内蔵されたA/D Converterモジュールを使って、電圧計にしてみた。
  結果はハイパーターミナルに出力する。
  ハイパーターミナルの設定は、上記のエコーサンプルと同じにしてある。

  A/D Converterの入力が数KΩと低いので、入力にレールTOレール型の安価なCMOS OPAMPを使ったボルテージフォロアを
  使用したが、このOPAMPのOFFSETの精度は高くはないので、測定精度はあまり高くはない。
  (例えば、入力をゼロにしても、表示は完全なゼロにはならない。)
  精度を高くするなら、高精度オペアンプを使用する必要がある。
  
  「TIMER1 MODULE」を使ったサンプルとして、上記プログラムのWAIT部分を、0.1[mS]のTIMER1モジュールに置き換えた
  サンプルAも作成した。こちらは1[S]毎にデータを表示する。


写真/回路図


ハイパーターミナルのイメージ(5V、0Vを入力した場合)

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)

prg2.asm

プログラムソース サンプルA (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)



 (3)Data EEPROMを使ってみる

  12F1822に内蔵されているData EEPROMを使って簡単なプログラムを作ってみた。

  プログラムが起動すると、Data EEPROMの最初の5バイトが表示され、入力を求めてくるので、5バイトを入力すると、
  Data EEPROMの最初の5バイトが入力したデータに更新され、更新された5バイトが表示される、
  という動作を繰り返す。

  Data EEPROMをアクセスするプログラムは、マニュアルに公開されているので、このサンプルは、マニュアルのプログラムを
  使用しただけのものだ。
  ハイパーターミナルの設定は、上記サンプル、「(1)EUSARTを使ってみる」と同じにしてある。


写真/ハイパーターミナルのイメージ/回路図

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)



 (4)PWM MODULEを使ってみる(1)

  12F1822に内蔵されているPWM MODULEを使って、2.5秒周期で出力が明暗を繰り返す、簡単なプログラムを作ってみた。
  サンプルでは、出力に周波数カウンタとオシロスコープを直接つないでいるが、通常は、トランジスタやMOS−FETをつないで、
  LEDやランプの明るさを制御する。

  あまり精緻に調整する必要がないので、Duty Cycleは256ステップの8ビット(0〜255)で制御している(下位2ビットはゼロを
  代入している)が、必要なら1024ステップの10ビット(0〜1023)で制御する事も出来る。
  この場合は、下位2ビットは、CCP1CON[5:4]に代入する。


写真/回路図


オシロスコープと、周波数カウンタによる出力のイメージ

prg1.asm

プログラムソース サンプル (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)



 (5)PWM MODULEを使ってみる(2)

  12F1822に内蔵されているCCPモジュールは、12F683と比較して、Enhanced Modeが追加されている。
  サンプル@は、Half−Bridge PWM機能を使って、P1A,P1BにPWM出力をするもので、ディレイの効果を見るため、
  ディレイの有/無を2秒毎に繰り返している。


写真/回路図 (サンプル@)


デジタルオシロスコープによるサンプル@の出力のイメージ
周波数は、上記のサンプルと同じ


この機能とブリッジ回路を組み合わせる事で、ACのパルスを簡単に制御できます
図は12F1822のマニュアルより抜粋

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)


  サンプルAは、Bridge回路を実際に作って動かしてみたものです。
  ディレイを入れて、2秒毎にデューティーサイクル25%、50%、75%を繰り返します。

  但し、この回路では、サンプル@のプログラムを動かしてはいけません。
  サンプル@のプログラムを動かすと、ディレイ無しの周期でパルスがクロスする時、4つのトランジスタが同時に動作して、
  トランジスタが壊れます

  
  サンプルBは、50Hzの擬似SIN波を出力するもので、自動車用インバータへの応用を想定するものです。
  それだけだと、サンプルAの簡単な修正のみになってしまうので、こちらは、C言語バージョンも作ってあります。
  出力周波数は、必要ならInit_PWM関数の「PR2レジスタ」の値を増減するだけ(C言語バージョン)で微調整ができます。
  ※アセンブラバージョンの場合は、INITPWM関数中の「PR2レジスタ」に代入するH'9B'の値を増減する事で微調整できます。
  もともと擬似SIN波ですし、電力会社の供給するAC100Vでも、例えば東京電力で50Hz、0.4パーセント程度の精度の
  ものなのでオシレータに水晶を使う必要はないとは思いますが、
  実際にカーインバータのような高電圧、高電流のようなものを作る場合は、一瞬でもPA1とPB1が同時に動作すると
  FETやトランジスタが破壊され、車の走行中の事故につながる可能性があるため、エンジンノイズによるマイコンやFETの
  誤作動の可能性や、電源投入時の回路動作等、充分な検証と対策が必要です。
  市販されているカーインバータの出力波形については、 「(別室)カーアクセサリーのページ」のページ に載せてあります。



写真/回路図 (サンプルA、サンプルB)


デジタルオシロスコープによる出力のイメージ   サンプルA


デジタルオシロスコープによる出力のイメージ(擬似SIN波)   サンプルB

prg2.asm

プログラムソース サンプルA (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)

prg3.asm

プログラムソース サンプルB (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)

prg3.c

プログラムソース サンプルB (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)
※上記(サンプルB)のC言語バージョン



 (6)D/A Converterを使ってみる

  12F1822には、32ステップのD/A Converterが内蔵されている。
  サンプルは、D/A Converterを使ってノコギリ状の波形を生成しているものだ。
  
  注)PICKIT3をつないだまま動作させると、正常な波形にはなりません。


写真/回路図


デジタルオシロスコープによる出力のイメージ

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)



 (7)Reference Clock Moduleを使ってみる

  12F1822には、「Reference Clock Module」が追加され、OSCのクロックを分周・加工して出力できるようになった。
  このマイコンの周波数精度は悪くはないので、プログラマブルな3.3V、5V兼用のオシレータとしても重宝しそうです。
  サンプルは、この機能を使って、32MHzのベースクロックを、分周なし、1/2分周、1/128分周して、32MHz、16MHz、
  250KHzを取り出したものだ。
  分周回数は、CLKRCONレジスタの下位3ビットを操作する事で、0〜128まで指定ができる。


写真/回路図


出力周波数の測定イメージ

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM 32MHz出力 アセンブラプログラム)

prg2.asm

プログラムソース サンプルA (PIC12F1822用 MPLAB/MPASM 16MHz出力 アセンブラプログラム)

prg3.asm

プログラムソース サンプルB (PIC12F1822用 MPLAB/MPASM 250KHz出力 アセンブラプログラム)








●地震ランプ(12F683/12F1822)

暗闇で揺れを感じると、10秒程度点灯するランプを作ってみた。
揺れの検知は、安価で簡単な「傾斜センサー(傾斜スイッチ)」を使用した。

明るさの検知には、LEDの微小な起電力を測定している。
LEDは、その構造が太陽電池と同じなので、光を当てれば起電力を発生するが、その電力は太陽電池とは比較にならない微小なものなので、
PICとの接続には、ダーリントン接続のトランジスタを使用した。
明るさ検知の回路は、測定を行う時のみ電源を供給するようにしてあるが、これは消費電力を減らすという意味では、お遊び程度のものだ。
「傾斜センサー」は、揺れを感じるとONになるものでも、OFFになるものでも、どちらを使っても問題はない。


サンプル@、サンプルAは、OSCをそれぞれ8MHz/16MHz動作させているもので、待機時の消費電流が数十mAもあるので、
実験レベルのものだ。
サンプルBは、消費電力を減らすため、OSCを31KHz動作させているもので、待機時の消費電流が数mAだった。


写真/回路図
明るさの感度は、LEDの本数を変える事で調整できます。
インピダンスが充分高い状態でLEDに強い光をあてた時、LED1つあたりの起電力は1.2V程度です。

prg1.asm

プログラムソース サンプル@ (PIC12F683用 MPLAB/MPASM アセンブラプログラム)

prg2.asm

プログラムソース サンプルA (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)

prg3.asm

プログラムソース サンプルB (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)








●PS/2マウスのPIC接続アダプタ(12F1822)

パソコンのPS/2マウスをPICに接続するアダプタを作ってみた。
マウスからの情報をRS232シリアル通信で返す。
本来は、PICや他のマイコンのUARTに直接つないで使うような事を考えているものだが、
このサンプルでは説明を簡単にするため、パソコンのハイパーターミナルに接続し、マウスの移動方向と、ボタンの状態を
表示するようにしている。(サンプル@)

PS/2マウスは、マウスの移動やボタン操作といったイベントが発生すると、3バイトのストリーミングデータを送信する。
このデータのなかには、マウスの移動量等の有益な情報も含まれており、これらを使ったアプリケーションも考えられるので、
3バイトのストリーミングデータを出力するバージョン(サンプルA)も作成した。
但し、マウスのボールの回転は気まぐれで、精緻に動くものではないので、本格的なアプリケーションを作るなら、
なんらかのプログラムの工夫が必要だ。


写真/回路図


ハイパーターミナルのイメージ サンプル@


ハイパーターミナルのイメージ サンプルA


ハイパーターミナルの設定

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)

prg2.asm

プログラムソース サンプルA (PIC12F1822用 MPLAB/MPASM アセンブラプログラム) 








●昇圧型スイッチングレギュレタ[入力:DC5V、出力:DC12V・0.1A](12F1822)

チョッパー型の昇圧スイッチングレギュレタを作ってみた。
DC5Vを入力し、DC12V(0.1A程度)を出力する。
プログラムは、12F1822に内蔵されているComparator Moduleと、Fixed Voltage Reference(2.048Vに設定)を組み合わせたものだ。
使用したショットキーダイオード(40V5A)は、大電流の表面実装タイプのものが秋月電子で安く購入できたので使っただけだ。
但し、このダイオードは、ショットキーバリアーダイオードかファーストリカバリーダイオードを使う必要があります。


注)同じような機能は、専用のスイッチングレギュレタICを使って作ることが出来ますし、似たような機能のICは、例えば秋月電子では「LT1172」を、
  300円程度 注)H23.9現在 で購入する事が出来ます。
  付属の説明書では、5A型のLT1170を使った事例(入力:DC5V、出力:DC12V・1A)が紹介されていますが、1.25A型のLT1172を使った
  場合は、出力がDC12V・0.2Aくらいの昇圧型レギュレタを作る事ができるようです。
  この事例については、 「(別室)レトロのページ」 で紹介しています。


写真/回路図


デジタルオシロスコープによる出力波形(負荷が100mAの時のAC波形
この回路に限った事ではありませんが、スイッチングレギュレタなのでスパイクノイズを発生します。
このサンプルでは、100mAの負荷の時、22KHz(プログラムのWAT関数で変更可能)でスパイクノイズは200mV程度のようです。

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)








●電子ブレーカ[DC5V・0.5A]   (12F1822)

  DC5V用の電子ブレーカを作ってみた。
  出力電流が0.5Aを越えると、出力を遮断し、2つのLEDが交互に点滅する。
  回復するには、リセットボタン(SW1)を押すか、電源を入れ直せばよい。

  このブレーカは、ヒューズや機械式ブレーカ同様、出力がショートした場合、瞬時には大電流が流れるので、機器の障害を完全に防げるものではありません。
  また、確実に動作する保障もない(急激な電流の変動では、動作しない事もある)ので、ヒューズ等の保護も必要です。


写真/回路図
1KΩと470Ωの間につながっている1Aのシリコンダイオードは、0.65Vの規準電圧として使っているので、ショットキーダイオードでは正常に動作しません。


ケースに入れたイメージ

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)








●バッテリーチェッカー@(12Vバッテリー用)   (12F1822)

  簡単な12Vバッテリーチェッカーを作ってみた。
  フル充電(12.8V以上)で全てのLEDが点灯し、あとは電圧によってRA0〜RA2につながっているLEDが点灯するものです。
  設定する電圧は、プログラム中のPI_VLT0〜PI_VLT3パラメータ値(0〜255)で変更できます。 
  ※注)詳細は、下記の「LEDの点灯イメージ」を参照の事。

  バッテリーチェッカーは数パーセント程度の精度が必要になるので、基準電圧に電源電圧を使っている場合は電源電圧の精度が問題に
  なる事があるのですが、
  このサンプルでは、基準電圧に12F1822に内蔵されたFVR(Fixed Voltage Reference)を使用しているので、測定精度が高く、
  無調整で使用できるようになっています。


写真/回路図


LEDの点灯イメージ

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)








●バッテリーチェッカーA(6V/12Vバッテリー用)   (12F1822)

  6V/12Vバッテリー兼用のチェッカーです。
  上記、「バッテリーチェッカー(12Vバッテリー用)」の2本の入力抵抗をショートするスイッチをつけて、6Vバッテリーでも使えるようにした
  ものですが、他にも5Vレギュレタを低損失のものに変える等の変更もあるので、ハードウエアを作り直しています。 
  プログラムは、上記のものがそのまま使用できます。
  LEDの点灯イメージは、上記と変更ありません。


写真/回路図
2本の分圧抵抗をショートすると6Vバッテリー用になります


LEDの点灯イメージ
2本の分圧抵抗をショートすると、設定される電圧は1/2(6Vバッテリー用)になります


透明アクリル付きプラスチックケースに入れたイメージ
このケースは安価で、前面が透明アクリル板になっているのでケースの加工がほとんど必要なく、使いやすいケースです。
加工は、平行コードを引き出す穴を一個開けるだけです。

prg1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)
上記と同じものです。








●レーザーポインター(その1)   (12F1822)

  PICでACP回路を作って、赤色レーザーダイオード(DL−3247)を使ってみました。
  レーザーダイオードは、抵抗一本でも点灯することは出来ますが、温度変化に敏感なため、ACP回路を使わないと、単なるLEDのような光り方に
  なってしまって、レーザー本来の強力な光を発生する事ができません。

  使用したレーザーダイオード(DL−3247)は、秋月電子で購入したもので、レーザー出力が5mWもあるものです。
  レーザーポインターの国の規制値は1mW未満ですし、レーザーポインターにするには5mWは強力なので、目に当たれば失明の危険があります。
  扱いには充分な注意が必要です。


  サンプル@は、ACP回路で単にレーザーダイオードを点灯するだけのもので、PICのコンパレータ機能を使っているものです。
  メーカーのACP回路をPICに置き換えただけのもので、これだけだと、PICを使う意味はあまりありません。
  DL−3247専用に作ってあるので、調整箇所はありません。
  なお、同じものをオペアンプで作ったバージョンを、 「(別室)レトロのページ」に載せています。


写真/回路図
この回路はDL−3247専用です(PDのImを0.2mAにしてあります。)。
他のレーザーダイオードで使う場合は、最低でも、分圧抵抗(10KΩ、500Ω、2KΩ)と、PDに並列の1KΩの調整が必要です。
DL−3247以外をつなぐ場合は、この調整をしないと、LDの定格を越える電流が流れて、レーザーダイオードが壊れる可能性があります。


光学系の加工イメージ
放熱のため、レーザーダイオードには内径4mmの金属スペーサーをかぶせています。
このレーザーダイオードは放熱が必要です(放熱しないと熱くなって、レーザーダイオードが壊れます)。
レンズは秋月電子の店頭で購入したφ14レンズで、レーザーダイオードと15mm程度離すと、ピンポイントの
レーザー光線が得られます。


点灯イメージ(発射したレーザーを、撮影のため、斜めに傾けて設置した板に照射)
ピンポイントの強力な光線を得るには、レーザーダイオードと凸レンズの焦点距離を、厚紙を挟む等の処置をして、
微妙に調整する必要があります。
写真の写りが悪いですが、実際の光線は赤色です。

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPLAB/MPASM アセンブラプログラム)








●CPLD実験ボード(その1)   (12F1822、XC9536XL-10VQG44C)

  秋月電子で110円で購入できるCPLDとPIC12F1822を使った、簡単な実験ボードを作ってみました。

  ※この記事は、 「CPLD/FPGA奮闘記」のページ にあります。


写真








●LANでパソコンとつないでみる(その1)   (12F1822、XPORT)

  XPORTを使って、LANでPICをパソコンにつなぐ事例です。
  Javaアプレットでプログラムを作ることで、XPORTをWebサーバーにして、PICをWebブラウザーから簡単にコントロールできます。

  ※この記事は、 「(別室)インターフェースのページ」のページ にあります。










●昇圧型スイッチングレギュレタ(その1)  (入力:DC5V,出力:DC8〜32V[50mA])   (12F1822)

  昇圧型のスイッチングレギュレタを作ってみました。
  DC5Vを入力し、5KΩのVRを動かす事で、DC8〜32Vの出力を得る事ができます。
  出力電流の上限は、DC12Vの時150mA、DC24Vの時100mA、DC32Vの時50mA程度です。
  昇圧が正常におこなわれて電圧が正常に出力されている時、LEDが点灯します。
  プログラムは、12F1822に内蔵されているPWM,FVR,コンパレータモジュールを組み合わせたもので、スイッチング周波数
  は100KHz付近にしてあります。
  手持ちの部品に、適当なパワーMOSFETがなかったので、トランジスタでドライブしていますが、本当は、パワーMOSFETを
  使ったほうが回路が簡単になり、損失も少なくなるのでいいと思います。
  このサンプルの場合、トランジスタに数ワット程度の損失が発生するのでトランジスタには放熱器が必要で、実験で使用した小型
  の放熱器程度では触れないくらい熱くなります(もっと大きな放熱器が必要です)

  このサンプルは、使用した部品の都合で、あまり大電流が流せるようにはしていません。
  実験では、充分な余裕のある電源器(少なくとも5Vで5アンペア以上)で電源を供給しないと、出力の設定電圧を高くした時、
  220μFの電解コンデンサをチャージするだけの力が得られず、立ち上がりませんでした。
  (例えば秋月電子の5V2.3アンペアのACアダプタでは、瞬間的な電流オーバーでACアダプタの保護回路が作動してしまう)。
  高い電圧を指定をして、電源を入れてもLEDが点灯しないような場合は、電源を入れたらVRをまわしていったん出力電圧を
  下げて、LEDが点灯してからVRをまわして電圧を上げてやれば、2アンペア程度の小型のACアダプタでも、32V程度までの
  出力ができるようです。 
  LEDが点灯していない時は正常に動作していないので、LEDが点灯していない状態のままにしないで下さい。
   
  注1)PICKIT3をISPでつないだまま動作させると、50ボルト近い出力電圧が発生する事があります。
     開発においては使用する部品の耐圧に注意が必要です。
   
  注2)電源の5Vは、5アンペア程度の大きさがないと、立ち上がらないことがあります。
    (出力電圧が30Vの場合、無負荷でも0.5アンペア程度、瞬間的には5アンペア程度の電流が流れる事があります)。
   
  注3)このスイッチングレギュレタの周波数は100KHzで、可視聴帯の周波数を越えているため、発振音が聞こえる事はありません。
     但し、出力電流を流し過ぎると、コンデンサが音を立てる事があります。
     このような状態で使用を続けると、故障の原因につながるので、これ未満の電流で使用する必要があります。
     実験では、出力電圧が12Vの場合で180mAを越えると、このような状態になりました。
   


写真


回路図
100μHのインダクターは手持ちのものですが、できれば3アンペア以上は流せるものを使ったほうがいいと思います。


出力イメージ(出力が12Vの時のAC波形)
スイッチング電源なので、原理的にスパイクノイズをなくす事はできません


使用している電源器に充分な余裕がないために起動しない場合、
VRをまわしていったん電圧を下げてLEDが点灯してから、電圧を上げる操作をすれば
2A程度の小型のACアダプタでも使用できます


この程度の小型の放熱器では、触れないくらい熱くなります


市販の5V60アンペアのACアダプタの例(TDK)

この実験では、ここまで大きなACアダプタを使う必要はありませんが、
この類の昇圧型スイッチングレギュレタは、電源投入時に数アンペア程度の電流が流れるものがあるので、
2,3アンペア程度の小型のACアダプタでは、一般的には起動しない事があります。

sample.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●DDコンバータ(その1)  (12F1822)

  ノイズフィルターをトランスにしたDDコンバータで、秋月電子で購入した一石式のDDコンバータキットをPIC12F1822に
  内蔵されているPWM(ハーフブリッジ)機能で、擬似SIN波(200KHz)に置き換えたものです。
  出力は100mA程度得る事ができます(使用したMOS−FETが熱くならない範囲)。

  高周波で使用するトランスは、入手性の問題で、趣味の工作ではコア材を購入して自作する事が多いように思いますが、
  秋月電子のこのキットでは、ノイズフィルター用のコイルの一次側にセンタータップを取り付ける加工をして、トランスとして
  使用するようになっていました。
  この類のトランスは、巻き数が少ないものが多いので、巻き数を増減した電圧の変更が容易です。
  このサンプルでは、2次側の巻き数を2倍にして、出力電圧を4倍(電圧のロスはあります)にしています。
  
  トロイダルコアを使用したDDコンバータは、電圧の変動が大きいため、これを電源として活用するなら三端子レギュレタ等
  による電圧の安定化が必要です。
  PICのFVRを使ったプログラムで定電圧化してもいいかも知れません。(FVRを使った事例は、「DDコンバータ(その2)」
  で紹介する予定です)。

  実験では、発振周波数は100KHzにした方が出力電圧が高く取れるのですが、そうすると、負荷をつないだまま電源を入れ
  た時にDDコンバータが起動しない等の問題が発生します。
  この辺りは使用するコイルの特性によるので、発振周波数は調整が必要になる可能性があります。
  但し、発振周波数をあまり低くすると大電流が流れて、MOS−FETやコイルを破壊する可能性があるので、調整する場合は
  注意が必要です。
  
  なお、P1A,P1BにDCが出力されると、MOS−FETやコイルが破壊されるので、ISPによる開発はしない方が無難です。
  開発は、PICをソケットから抜き差ししておこなったほうがいいと思います。
  


写真
基板下部には、改造のため「DDコンバータ(その2)用」のスペースを空けています


回路図
周波数が高いので、ダイオードは一般的な整流用のブリッジダイオードでは使用できません
ショットキーバリアダイオードや、ファーストリカバリーダイオード等を使う必要があります


コイルの加工イメージ(例)
1.ケースを開けて、中からコイルの本体を取り出します
2.コイルに次の加工を施します
 @1次側に中間タップを付けます
 A2次側に14回巻きのコイルを追加します


出力負荷と出力電圧(実測値)
出力電圧は、負荷により大きく変動します


出力イメージ(SW1をaにした時のAC波形)



秋月電子のオリジナルのキットのイメージ ※回路図は秋月電子の説明書より抜粋

sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●DDコンバータ(その2)  (入力:DC5V,出力:DC2〜12V[30mA])   (12F1822)

  上記の「DDコンバータ(その1)」の出力を、PICに内蔵されているFVRを使って定電圧化したものです。
  実験では10KΩのVRをまわす事で、2V〜12Vを出力する事ができます。
  出力は、3Vで50mA,5Vで50mA,10Vで50mA,12Vで30mA(実際は11.5V)程度でした。
  実際には、5Vで100mA以上取れましたが、この程度で使用しないとMOS−FETが熱くなって故障の原因になります。
  MOS−FETが発熱しない範囲で使用する必要があります
  VRを2V以下まで回転させると出力が不安定になりますが、SW1をbの位置にすると、1Vからの可変が可能です。
  但し、その場合は、上限で設定できる電圧が低くなり、出力電流も小さくなります。
 
  正常に動作しているとき、LEDが点灯します。
  LEDが点灯していない時は動作が不安定になっているので、そのままの状態にしないで下さい。

  PWMの発振周波数は200KHzにしてありますが、使用するコイルの特性によっては、発振周波数は調整が必要に
  なる可能性があります。
  また、発振周波数をあまり低くすると大電流が流れて、MOS−FETやコイルを破壊する可能性があるので、調整を
  する場合は注意が必要です。
  実験で使用したコイルの場合、20KHzより低く指定すると消費電流が多くなり、10KHzより低くするとMOS−FETが熱く
  なりました。
  
  なお、P1A,P1BにDCが出力されると、MOS−FETやコイルが破壊されるので、ISPによる開発はしない方が無難です。
  開発は、PICをソケットから抜き差ししておこなったほうがいいと思います。


写真
基板裏面についているMOSFET(2SK1172)は、次の「DDコンバータ(その3)」で使用を
予定しているもので、このサンプル(その2)では使用しないので、回路図では省略しています


回路図


出力イメージ(10Vを出力した時のAC波形)

sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●DDコンバータ(その3)  (入力:DC5V,出力:DC2〜12V[30mA])   (12F1822)

  上記の「DDコンバータ(その2)」に、過電流保護回路を追加したものです。
  出力電流が50mAを越えると、過電流保護回路が動作して出力を遮断し、LEDが高速点滅します。
  解除するには、電源を入れ直してやります。

  基板の空きスペースの都合で、最も簡単なシャント抵抗を使った保護回路にしてあるので、出力電流を限界まで
  大きくすると、出力電圧は最大で0.6V程度下がります。
  このような電圧降下が問題になる場合は、保護回路がない上記の「DDコンバータ(その2)」のほうがいいと思います。
  
  過電流保護回路については、マイコン式DDコンバータの場合、シャント抵抗は必ずしも必要ではありませんし、
  方式もいろいろあるのですが、この実験ボードには、これ以上の追加スペースがないので、
  そういうサンプルについては、他の実験ボードで紹介していく予定です。


  注意)この過電流保護回路は、出力電流が50mAを越えた時に動作する事を想定していて、一般的な保護回路のような
  出力の急激な変動(ショート等)を想定しているわけではありません。
  実験では、出力のショートでも確実に動作していましたが、急激な変動では、この保護回路は動作しない可能性もあります。


写真
上記の「DDコンバータ(その2)」についていた2SK1172は、スペースを確保するために取り除いてあります


回路図
シャント抵抗(回路図中の12Ω1W)には、出力がショートした場合に瞬間的に最大10W程度の損失が発生します。
0.00000数秒程度なので問題無いと思いますが、本当はもう少し大型の抵抗を使ったほうがいいかも知れません。

sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●乱数の発生(その1)  (PIC12F1822/4049BP)

  ゲームで使うために、乱数を発生させてみました。
  電源を入れると、0〜9の乱数を発生します。
  このようなものは、シミュレーションで使う場合は、乱数関数や計算で算出してもいいのですが、初期値が決まると
  規則性が見えてしまうので、ゲームに使うとつまらないものになってしまいます。

  サンプル@は、C−MOSインバータで300KHz程度のパルスを発生させて、このパルスが1の時、カウンタを
  アップしているものです。
  パルスをPICでカウントしているわけではないので、発振周波数を高くする事も可能で、そのほうが、よりランダム
  な数値を作り出す事ができます。
  C−MOSインバータで作った発信回路が想定以上に安定度が高く、周波数が大きく変動してくれないので、仮にCDS
  を挿入し、周波数がぶれるようにしています。
  実験では、CDSに直接一定の光りを当てると周波数の安定度が上がってしまうので、CDSは横向きに取り付けた
  ほうがいいようです。
  CDS以外にも、サーミスタ等、いろいろ使ってみるといいかも知れませんし、
  発振回路は、C−MOSインバータで作るより、もっと不安定なものを使ったほうがいいと思います。


写真
コンデンサ(0.1μF)、抵抗器(470Ω/10KΩ)は、チップを使っています
(チップ部品は、小型で、安価で、パターンの隙間にでも装着できるので、なかなか使いやすいです)


回路図
負荷が軽すぎるので、負荷に10KΩの抵抗を入れていますが、この用途では、回路はなるべく
不安定なほうがいいので、10KΩの抵抗は入れないほうがいいと思います


ハイパーターミナルの設定


ハイパーターミナルのイメージ

sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●乱数の発生(その2)  (PIC12F1822/4049BP/7400N)

  上記、「乱数の発生(その1)」発振器を、 「レトロのページ」 でも紹介した遅延型の発振器に置き換えたものです。
  実測すると、発振周波数は4049BPを使った場合で5MHz、7400Nを使った場合で31MHzです。
  この発振器は、周波数の安定度がそれほど良くなく、しかも簡単なので、乱数発生にはいいかも知れません。
  この発振器は波形の大きさが2.5Vに届かない事があるので、発振器の出力をPICに直接つないだりすると、
  乱数が全く動かない可能性があります。

  Ra0は、PICKIT3でも共通で使用しているので、このサンプルプログラムを動かす時は、PICKIT3は
  はずしてやらないと、正常に動作しません。
  また、プログラムを書き込む時は、Ra0につないでいる発振器をはずしてやらないと、PICKIT3でプログラム
  を書き込む事ができません。

  
  サンプル@は、単に乱数を発生させて表示しているもので、上記の「乱数の発生(その1)」と同じプログラムです。

  
  サンプルAは、100個の乱数を発生させて表示し、それぞれの個数を集計して表示しているものです。
  乱数の精度は、外部に接続したオシレータの周波数が高くなり、プログラムの計測時間が長くなるほど精度が
  向上しますが、計測時間が長すぎると処理に時間がかかるので、妥当な範囲を調整するために作ったものです。
  この値は、プログラム中の「PI_RAND_LOOP」で定義しているので、ばらつきが極端に偏よる場合は、数値を
  大きくしてやる調整が必要になります(但し、その場合、処理時間は長くなります)。

  
  サンプルBは、0〜999999999までの乱数を発生させているもので、結果はロング型変数「land_long」に
  収納されます。
  この値の任意の数値の余りを取る事で、任意の範囲の乱数を得る事もできます。

  
  サンプルCは、8桁の自然数n(00000000〜99999999)を入力し、0〜nまでの乱数を発生させるものです
  


4049BPの場合の、写真と回路図


7400Nの場合の、写真と回路図


ハイパーターミナルのイメージ(7400Nの場合)  サンプル@


ハイパーターミナルのイメージ(7400Nの場合)  サンプルA


ハイパーターミナルのイメージ(7400Nの場合)  サンプルB


ハイパーターミナルのイメージ(7400Nの場合)  サンプルC


sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)
上記、「乱数の発生(その1)」と同じです

sample2.c

プログラムソース サンプルA (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)

sample3.c

プログラムソース サンプルB (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)

sample4.c

プログラムソース サンプルC (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●モールス信号・ヒアリング練習器  (PIC12F1822/7400N)

  上記の「乱数の発生(その2)/7400N」を使って、A−Z,0−9のモールス信号をランダムに発生し、
  ハイパーターミナルに表示するものです。
  なるべく簡単にするため、圧電スピーカを使う事で、トランジスタ等のドライブ回路は省略しています。
  


写真


回路図


ハイパーターミナルのイメージ


sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●デジタルシリコンマイクを使ってみる(その1) 簡易バージョン  (PIC12F1822/SPM0405HD4H)

  秋月電子で購入したデジタルシリコンマイクロホン(SPM0405HD4H)を使ってみました。
  このマイクロフォンは、音声をPDM方式で出力してくれるもので、ほとんど何の処理もせずにマイコンに取り込み、出力し、
  スピーカを鳴らす事ができます。
  このマイクを使った場合、アナログマイクロフォンのようなマイクアンプやA/Dコンバータ、D/Aコンバータ等は不要です。
    
  サンプル@は、PIC12F1822でデジタルシリコンマイクロホンに必要な1〜3.25MHz(3.3V)のクロックを生成し、
  PDM方式の音声データをPIC12F1822に取り込み、何の加工もしないでそのまま出力し、あとは簡単なフィルターでデジタル
  信号をアナログ音声信号に変換してスピーカを鳴らしているものです。
  このマイクの稼動確認のために作ったサンプルです。

  この回路が簡単な回路のせいなのかも知れませんが、実験では「シー」というノイズ音が大きく、マイクの感度が著しく悪く、
  風の音にはよく反応しますが、人の声はマイクギリギリまで近づけて話さないと、ほとんど音声を拾えませんでした。
  (オシロスコープでマイクの出力波形を直接見ても、人の声程度では、ほとんど波形が変化していない)
  この辺りは、もう少し改善して「デジタルマイクを使ってみる(その2)」で紹介する予定です。
  なお、出力のフィルターは、8Ωのスピーカ用に作ってあるので、それ以外のスピーカをつなぐ場合は、インダクターや
  コンデンサの定数の変更が必要になります。
  
  このデジタルシリコンマイクの電源電圧は、1.6〜3.6Vなので、注意が必要です。
  一般的にマイクは微小なノイズの影響を大きく受けますので、電源は電池か、ノイズが充分少ないシリーズ型電源器
  使用したほうがいいと思います。
  スイッチング方式のACアダプタや電源器を使うと、ノイズが大きすぎて、充分な性能を発揮できない可能性があります。


写真
1.5Ω(2W)は、手持ちの都合で3Ω(1W)*2で代用しています
1μF16Vは、秋月電子で安価で購入できるチップ型積層セラミックコンデンサを使用しています
470μFをヘッダーピンで外付けしているのは、このアダプタを他の実験でも使用しているからです
(このアダプタは、パワーMOSFETの出力を、ヘッダーピンでそのまま取り出す事もできるように作ってあります)
使用したパワーMOSFETは、秋月電子で安価で購入したものです


デジタルシリコンマイクロホン(SPM0405HD4H)のイメージと回路図


上記回路の修正イメージ

実用的に使えるレベルまでは改善していませんが、
実験では、フィルターを人間の声の帯域に限定してしまってよければ、多少聞きやすくなります
(回路図の赤色部分の部品を、手持ちの部品の範囲で付け替えてみました)


sample1.c

プログラムソース サンプル@ (PIC12F1822用 HI-TECH PICC(Version9.83) C言語プログラム)








●ノコギリ波(100KHz)の発生  (PIC12F1822)

  PICを使って、100KHz程度のノコギリ波を発生させてみました。
  実測すると、127KHzのノコギリ波を発生していました。
  12F1822を使ったデジタルオーディオアンプのサンプリングに使うためのものですが
  (デジタルアンプでは500KHz程度が一般的なようですが)、コンデンサや定電流ダイオードを変える事で、発振周波数は
  自由に変更する事ができます。
  但し、コンデンサの容量をある程度大きくする場合は、PICで直接コントロールできなくなるので、MOS−FET等のドライバー
  を追加する必要があります。
  数百KHz程度なら大丈夫だと思いますが、また、あまり周波数を高くすると、波形に荒さが目立ってくると思います。
  このサンプルは、12F1822をPLLで32MHz高速動作させていますが、周波数をあまり高くすると、プログラムが追いつけ
  ません。
  高い周波数のノコギリ波が必要なら、安価(秋月電子で200円)で高性能なPIC32MXを使うといいと思います。
  
  デジタルオーディオアンプについては、下記で紹介を予定しています。


写真/アダプタ基板(表面/裏面)


回路図/出力波形イメージ(127KHz)

この定電流ダイオードは手持ちのものですが、秋月電子で数十円で購入する事もできます
定電流ダイオードは一般的なダイオードと異なり、間違えて逆向きに取り付けると
電流が貫通して周辺回路まで故障するので注意が必要です


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●デジタルアンプ(その1) MOS−FETバージョン  (PIC12F1822)

  12F1822を1個だけで作った、簡単なデジタルアンプです。
  簡単に作れますが、こちらのサンプルはノイズが大きく、音も歪むので、実用的には使えません。
  参考にする場合は、次の「デジタルアンプ(その2) トランジスタバージョン」にしてください。

  このサンプルは、上記「ノコギリ波(100KHz)の発生」サンプルで発生させたノコギリ波と、オーディオアナログ信号を、
  12F1822に内蔵されているコンパレータでデジタル変換し、フィルターでアナログ信号に戻してスピーカを鳴らして
  いるものです。
  P−チャンネルとN−チャンネルのMOS−FETをこのような接続(論理回路のCMOSインバータと同じですが)をして
  高速動作させた場合、クロスオーバー時に起因する大きなノイズを発生します。
  このため、電源には充分なノイズ対策のされた高速なシリーズ型電源器を使わないと、一般的なスイッチング電源器
  では電源電圧にノイズが乗って、出力がノイズだらけになる可能性があります。
  音が大きく歪む場合、オシロスコープをAC測定レンジにして、電源電圧をチェックしてみる事をお勧めします。
  
  なお、このアンプのGAINは20dB(10倍)で、最大出力は140mW程度です。


写真/アダプタ基板(表面/裏面)
写真以外のアダプタは、上記で紹介したサンプルをそのまま使っています


回路図


波形イメージ (1KHzのSIN波を入力した時の出力波形)


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●デジタルアンプ(その2) トランジスタバージョン  (PIC12F1822)

  MOS−FETを使ったサンプルが、とても実用に耐えられないようなものだったので、同じものをトランジスタで作り直して
  みました。
  手持ちの20cmのスピーカをつないだ感じでは、音量を上げるとひずみや音割れが多少目立ちますが、小型のスピーカ
  を小音量でならすなら、それなりに鳴らす事ができます。
  また、この回路はMOS−FETバージョンのようなノイズの発生はおこらないので、小型のスイッチング電源でも充分使用
  できます。

  処理は上記のサンプルと同じで、PICで発生させたノコギリ波と、オーディオアナログ信号を、12F1822に内蔵されている
  コンパレータでデジタル変換し、フィルターでアナログ信号に戻してスピーカを鳴らしているものです。
  ただし、より音の解像度を高くするために、コンデンサを330pFに変更して、サンプリング周波数を300KHz程度に高くし
  ています。
  
  なお、このアンプのGAINは8dB(2.5倍)で、最大出力は140mW程度です。


写真/アダプタ基板(表面/裏面)

写真以外のアダプタは、上記で紹介したサンプルをそのまま使っています
スピーカに並列につながっている1μF16Vは、秋月電子で購入したチップ型積層セラミックコンデンサです
1.5Ω(2W)は、3Ω(1W)を並列にして使用しています


回路図

12F1822(Ra3)につながる1KΩの隣のコンデンサを、330pFに変更して上記の「MOS−FET」の
バージョンよりサンプリング周波数を高くしています。
サンプリング周波数は、「MOS−FET」バージョンのままでも問題ありませんが、高くしたほうが音質が良くなります。
このサンプルは、8Ωのスピーカ用です。
8Ω以外のスピーカをつなぐ場合は、フィルターの定数の変更(回路図の470μF、100μH、1μF)が必要になります
バッファ回路の二つの抵抗(1S1588につながっている抵抗)を1KΩにしていますが、使用するトランジスタに
よってはHfeが不足する可能性があります。
あまり小さくするとPICが壊れますが、この場合は2つとも500Ωくらいにしたほうがいいかも知れません。
(500Ωにした時のテストはしていません)


波形イメージ (1KHzのSIN波を入力した時の出力波形)


このサンプルの入出力イメージ

ノコギリ波の周波数が高いほど、変換精度が高くなります
実際の波形は、音声周波数に対してノコギリ波の周波数が十分に高いので、出力波形はもっと細密になります
このアンプは、PK−PKで1V以上の入力をすると、ノコギリ波の波形を越えるために、音にひずみが発生します
最大出力は140mW程度なので、ボリュームは上げすぎないほうが、きれいな音楽を楽しむ事ができます


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)
※上記のサンプルと同じです








●実験ボード・タイプ4A(PIC12F1501)

 PIC12F1501を使った簡単な実験ボードを作ってみました。
 上記、12F1822の実験ボードをそのまま活用したものです。
 12F1501は、12F1822に比較して、新たに上記10F322でも紹介した「CLC」や「NCO」、その他「CWG」等が内蔵されていて、
 いろいろ面白い使い方ができそうです。



 (0)基本操作

  LEDをつないで点滅させてみました。

  サンプル@は、Timer1を使って、0.5秒毎にLEDを点滅させるものです
  サンプルAは、Timer1割り込みを使って、0.5秒毎にLEDを点滅させるものです


写真/回路図

sample1.asm

プログラムソース サンプル@ (PIC12F1501用 Timer1) MPLAB/MPASM アセンブラバージョン


sample2.asm

プログラムソース サンプルA (PIC12F1501用 Timer1割り込み) MPLAB/MPASM アセンブラバージョン




 (1)EUSARTを使ってみる

  PIC12F1501には、USARTモジュールは内蔵されていません。




 (2−1)PWM出力してみる (その1)

  PIC12F1501には、4チャンネルのPWMモジュールが内蔵されています。
  
  サンプル@は、PWMモジュールを使って、15.6KHz程度の周波数で、PWM1に10%、PWM2に25%、PWM3に50%、
  PWM4に75%のデューティサイクルのPWM出力を行なうものです。


写真/回路図


PWM3のオシロスコープによる出力イメージ(デューティサイクル:50パーセント)


PWM1〜PWM4のロジックアナライザーによる出力イメージ

sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン




 (2−2)PWM出力してみる (その2)

  PIC12F1501に内蔵されたPWMモジュールとADCモジュールを使って、モーターやランプの
  明るさを調整するサンプルです。
  サンプル@は、VRをまわすと、15.6KHz程度の周波数で、デューティーサイクルが0〜100%まで
  (実験では完全な0%、及び100%にはなりませんが)変化します。
  


写真/回路図


写真/回路図
古い原付バイクのテールランプ(6V10W)の明るさを調整してみました
ランプの電源電圧を5Vにしているのは、電源をPICと共通にしているからです
ランプやモータをつなぐ程度の用途なら何も問題はありませんが、
回路図中のショットキーバリアダイオード(周波数が高いので、一般の整流用ダイオード
では使用できません)を省略すると、負のスパイクノイズが大きくなります

sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン




 (3)DACを使ってみる(その1)

  PIC12F1501には、32ステップ(0−31)のD/Aコンバータモジュールが内蔵されています。
  
  サンプル@は、1mSステップで、D/Aコンバータに31〜0の値を出力するものです。
  DACOUT1/DACOUT2ともに出力される値は同じです。
  
  注)PICKIT3をつないだまま動作させると、正常な波形にはなりません。


写真/回路図


DACOUTのオシロスコープによる出力イメージ
(DACOUT1/DACOUT2とも出力される値は同じです)


sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン




 (4)DACを使ってみる(その2)

  PIC12F1501に内蔵されているD/Aコンバータモジュールを使って波形を生成した事例です。
  ボルテージフォロアを通し、AC波形にするためにコンデンサを通しています。
  使用したオペアンプは、秋月電子で安価で販売されているレールTOレール型のものです。
  
  注)PICKIT3をつないだまま動作させると、正常な波形にはなりません。

  
  サンプル@は、40ステップで分割した、50HzのSIN波を出力します。
  処理に必要なプログラムのステップ数があるため、実際に出力される波形は50Hzより低くなってしまうので、
  50Hzに近くなるようにタイマー1の値は実測して補正してあります。
  DACOUT1/DACOUT2に出力される値は同じです。


写真/回路図


出力イメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン




 (5−1)NCOを使ってみる(その1) オシレータにしてみる

  PIC12F1501に内蔵されているNCOを使用して、任意の周波数のオシレータにした事例です。
  PIC12F1501に内蔵されているNCOは、上記で取り上げているPIC10F322のNCOと使い方がほとんど同じです。

  
  サンプル@は、NCOモジュールを使って1KHzのパルスを出力します。
  サンプルAは、NCOモジュールを使って100KHzのパルスを出力します。


写真/回路図


出力イメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1501用 1KHz出力) MPLAB/MPASM アセンブラバージョン

sample2.asm

プログラムソース サンプルA (PIC12F1501用 100KHz出力) MPLAB/MPASM アセンブラバージョン




 (5−2)NCOを使ってみる(その2) 精度の高いオシレータにしてみる

  PIC12F1501にクリスタルオシレータをつないで、NCOで任意の周波数を出力するようにした事例です。
  上記のPIC10F322で作成したサンプルと、ほとんど同じ機能のものです。
  使用した12.8MHzのクリスタルオシレータがAC出力のタイプのものなので、2本の10KΩをつないでいますが、
  通常は、この抵抗は不要です。
  NCOで精度の高い周波数を出力をするには、水晶の周波数は、出力する周波数に対して1/(2^n)
  になるように選んでやる必要があります。

  
  サンプル@は、精度の高い100KHzを出力します。


写真/回路図
基板のスペースの都合で、2本の10KΩは、写真のようにチップ抵抗をアダプタ基板裏側に装着しています
5V出力のクリスタルオシレータを使用した場合は、この抵抗は不要です


オシロスコープによる出力イメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1501用 100KHz出力) MPLAB/MPASM アセンブラバージョン




 (5−3)NCOを使ってみる(その3) メロディーを演奏してみる

  NCOを使った演奏プログラムです。
  上記のPIC10F322で作成したサンプルと、似たような機能のものですが、
  PIC12F1501で作ったほうが、本格的なものが作れます。
  Ra1に手持ちの12mmミニスピーカ(50Ω)をつないで、10KΩのVRで音量調整するようにしていますが、
  Ra1に圧電スピーカを直接つないだほうが、回路が簡単でいいかも知れません。
  但し、圧電スピーカは起電圧を発生するので、圧電スピーカをつなぐ場合は、並列にダイオードが必要です。

  サンプル@は、「ドレミ・・・」と昔の童謡程度しか入っていませんが、プログラムメモリーには余裕があるので、
  曲は今後追加していく予定です。


写真/回路図


圧電スピーカをつないだほうが、簡単でいいかも知れません

sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン




 (5−4)NCOを使ってみる(その4) 音の強弱が表現できるメロディーを作ってみる

  NCOとDACを組み合わせて、音の強弱の表現ができるようにしたメロディーです。
  楽譜に合わせて音符に強弱をつけたり、楽器に合わせたエンベローブを作る事で、単なる演奏プログラム
  より、本格的な演奏ができます。
  
  小型にしたかったので、50Ωの特殊なスピーカを使っていますが、10KΩVR以降の回路は、例えば、
  一般的なLM386と8Ωのスピーカを組み合わせたりしてもいいと思います。
  但し、圧電スピーカでは、音の強弱の表現はできないと思うので、このサンプルは圧電スピーカではだめで、
  普通のスピーカを使う必要があります。
 
  サンプル@は、「ドレミ・・・」の演奏プログラムですが、音符が強くなったり、弱くなったりします。
  それだけだと、あまりにも簡単なので、続けて童謡も演奏しますが、こちらには強弱は入れていません。
  強弱は、プログラム中のVOLの値の大きさ(0〜31)で表現しますが、回路にダイオードやトランジスタ
  が入っているので、DACの出力は最低でも2.4V(0.6V*4)程度はないと(実験ではVOLの値の大きさは
  13〜31までの範囲にしないと)音が出ません。設定可能なVOLの値は、回路により異なります。
  また、PICKIT3をつないだまま動作させると、正常に動作しません。


写真/回路図 ※50Ωスピーカバージョン


写真/回路図 ※LM386バージョン
実験ではこちらの方が使いやすい感じです。
こちらのバージョンは、VOLの値は2〜31まで指定できました。
手持ちの部品の都合で、スピーカにつながるコンデンサは1500μFを使っていますが、
回路図のように470μF程度を使ったほうがいいと思います。


sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン


 (5−5)NCOを使ってみる(その5) VCOを作ってみる

  NCOを使ってVCOを作ってみました。
  このようなものは、アナログ回路やデジタルICで作ってもよいのですが、PICを使ったほうが簡単で安定度の高いものを
  作る事ができます。

  サンプル@は、PIC12F1501に内蔵されたNCOとADCを組み合わせたもので、
  VRを回すと7.629[Hz]〜7.804[KHz]の波形を出力します。

  サンプルAは、サンプル@のNCOに代入する数値に簡単な修正をしたもので、
  VRを回すと488[Hz]〜499[KHz]の波形を出力します。
  PICで作ったVCOは、周波数を簡単な計算で決定しているだけなので、他にも仕様の変更は容易です。

  サンプルBは、10KΩのVRをロータリースイッチのようにして使っているもので、
  VRを回していくと100[Hz]、500[Hz]、1[KHz]、5[KHz]、10[KHz]、50[KHz]、100[KHz]、500[KHz]
  の波形を出力します。


写真/回路図


サンプル@で1KHzを出力したイメージ

sample1.asm

プログラムソース サンプル@ (PIC12F1501用) MPLAB/MPASM アセンブラバージョン

sample2.asm

プログラムソース サンプルA (PIC12F1501用) MPLAB/MPASM アセンブラバージョン

sample3.asm

プログラムソース サンプルB (PIC12F1501用) MPLAB/MPASM アセンブラバージョン





 (7−1)CLCを使ってみる(その1)

  CLCを使った簡単なサンプルを作ってみました。

  
  サンプル@は、NCOで作った1KHzと、PWMで作った出力をORに入力し、インバータで反転して出力するものです。


写真/回路図


サンプル@のイメージ


オシロスコープによる出力イメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン




 (7−2)CLCを使ってみる(その2) AMラジオにメロディーを飛ばす(その1) ハートレー型発信器バージョン

  NCOで発生させたメロディー(昔の童謡)と、AMスーパーヘテロダインラジオのOSCコイルで発生させたクロックを
  CLCで合成して、AMラジオにメロディーを飛ばすものです。
  使用したOSCコイルは、AMスーパーヘテロダインラジオで昔から一般的に使われている796KHzの赤色のコイルで、
  千石電子やマルツパーツ館、その他パーツショップ等で現在でも容易に入手できます。
  実験では、周波数はコイルのつまみをまわす事で、634〜907KHz程度まで可変できるので、他の放送局と重ならない
  周波数に調整して使用します。
  アンテナは、12F1501のRa2に1m程度の電線をつないでみましたが、出力が意外に大きいので、
  アンテナを長くすると電波法に抵触する可能性があります。
  アンテナ線は、なるべく短くして出力を充分小さくして実験する必要があります。
  
  なお、この発振回路については、 「(別室)レトロのページ」 の「ハートレー型発振回路(その4)」で紹介しているので、
  詳細はそちらを参照してください。

  


写真/回路図



PIC12F1501の入力波形(Ra5:ICの2番ピン)のオシロスコープのイメージ

OSCコイルの出力波形がPK−PKで0.44V程度と小さいので、この出力をPICに入力するためには、
回路図中のR1(500KΩ+1MΩ)は微調整して、PICのRa5の入力振幅が十分大きくなるように調整する必要があります。
「(別室)レトロのページ」の「ハートレー型発振回路(その4)」を参照してください。



IFTコイル(黄・白・黒)455KHz用/OSCコイル(赤)796KHz用

AMスーパーヘテロダインラジオのコイルには、黄・白・黒のIFTコイルと、赤のOSCコイルがありますが、
このサンプルでは、赤のOSCコイルを使用します。IFTコイルでは使用できません。
趣味のラジオ製作では昔から一般的に使われているコイルなので、安価で入手は容易だと思います


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン




 (7−3)CLCを使ってみる(その3) AMラジオにメロディーを飛ばす(その2) インバータバージョン

  発振回路は、上記のようなアナログ回路で作るより、デジタル回路で作るほうが、無調整で簡単に作れます。
  というより、このようなものを趣味の分野でアナログ回路で作る人は、今日ではアナログマニアしかいないかも知れません。
  このサンプルは、上記の「(7−2)CLCを使ってみる(その2)」の回路をインバータに置き換えたものです。
  実験では、出力周波数は、5KΩのVRをまわす事で、716KHz〜1192KHzまで可変できました。

  


写真/回路図
手持ちの部品の都合で、50pFは100pF*2を直列接続、5KΩVRは10KΩVR+10KΩを並列接続して作っています


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン
※上記のサンプルと同じプログラムです






 (7−4)CLCを使ってみる(その4) AMラジオにメロディーを飛ばす(その3) 内臓OSCバージョン

  おそらく、これ以上簡単なPIC工作はありません。
  PIC12F1501のRa2(ICの5番ピン)に、1m程度のアンテナ代わりの電線をつないだだけのもので、
  AMラジオの1MHz付近にメロディーを飛ばします。
  周波数が他の放送局と重なりますが、このサンプルは周波数を可変する事ができないので、他の人の迷惑に
  ならないように、アンテナ線はなるべく短くして出力を充分小さくする必要があります。

  


写真/回路図


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン


 (8−1)CWGを使ってみる(その1)

  CWGを使えば、上記で紹介したPWMやNCOの出力波形を加工する事ができます。

  サンプル@は、「(2)PWM出力してみる」の「PWM4に75%のデューティサイクル」のライジングエッジ、
  及びフォーリングエッジに、ディレイをかけたものをCWG1A、CWG1Bとして出力しているものです。
  ディレイの大きさは、CWG1DBR(RISING)/CWG1DBF(FALLING)の値を変える事で簡単に増減する事が出来ます。
  このサンプルの周波数は15,6KHz程度です。

  


写真/回路図


出力イメージ  ※サンプル@


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン


 (8−2)CWGを使ってみる(その2)

  「(8−1)CWGを使ってみる(その1)」は、ブリッジ回路と組み合わせるといろいろ面白い波形を作りだす
  事ができます。

  サンプル@は、「PWM4に25%、50%、75%のデューティサイクル」を出力した時のCWG1A、CWG1B
  をブリッジ回路に入力したものです。
  もしもCWG機能を使ってディレイを入れてやらなかったら、波形がクロスする時にトランジスタが壊れてしまいます。
  このサンプルの周波数は15,6KHz程度です。

  サンプルAは、50Hzの擬似SIN波を出力するようにしたものです。
  但し、CWGのディレイは、クロックを下げてもディレイをあまり大きくする事ができません。
  もしも車のインバータのような擬似SIN波の用途で使うのなら、CWGより、例えば上記の実験ボードの事例のように、
  PIC12F1822に内蔵されているPWMのEnhanced Modeを使うほうがお勧めです。

  


写真/回路図


出力イメージ  ※サンプル@


出力イメージ  ※サンプルA


sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン
※上記のサンプルと同じプログラムです(デューティサイクル 25%バージョン)

sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン
※上記のサンプルと同じプログラムです(デューティサイクル 50%バージョン)

sample1.asm

プログラムソース サンプル@ (PIC12F1501) MPLAB/MPASM アセンブラバージョン
※上記のサンプルと同じプログラムです(デューティサイクル 75%バージョン)


sample2.asm

プログラムソース サンプルA (PIC12F1501) MPLAB/MPASM アセンブラバージョン








●マイコン内臓RGB(PL9823)を使ってみる (その1)  (PIC12F1822)

  マイコンを内臓したRGB−LEDが秋月電子で数十円で購入できるので使ってみました。
  このLEDは、DIN端子から簡単なプログラムでデータを入力するだけで、256(R)*256(G)*256(B)色もの
  発色をさせる事ができます。
  実験で使用したLEDは、8mm丸型のPL9823−F8ですが、秋月電子では他にも5mm丸型のPL9823−F5や、
  スティックタイプ等、このLEDにはいろいろなタイプのものが市販されています。

  サンプル@は、1秒毎に、(OFF)=>(赤)=>(緑)=>(青)=>(白)=> と色を変化させるものです。
  簡単なプログラムですが、DIN端子から必要なパルスが0.35uSと1.36uSの組み合わせと比較的高速なので、
  PICを使った場合、アセンブラ以外ではプログラムを作る事は困難だと思います。
  (例えばPIC12F1822を32MHz動作させた場合でも、0.35uSは3ステップにしかなりません)
  このようなものは、PICに限らず、マイコンとCPLDを組み合わせて作ったほうが、いいかも知れません。
  なお、CPLDとVHDLで作ったバージョンは、 「CPLD/FPGA奮闘記」のページ で紹介する予定です。


写真/回路図/PL9823のイメージ


PL9823の点灯イメージ

写真の色が白くなってしまうのは、デジタルカメラの露出の問題で、実際の見え方とは異なります



このマイコン内臓RGB−LEDの入力データイメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●マイコン内臓RGB(PL9823)を使ってみる (その2)  (PIC12F1822)

  マイコン内臓RGB−LED(PL9823)は、上記のサンプルのように単体で使ってもいいのですが、一本の
  ワイヤーで複数のLEDを連結できるようになっていて、こちらの使い方のほうが一般的な使い方だと思います。

  サンプル@は、LED−1が(赤)=>(緑)=>(青)=>(白)=>、LED−2が(緑)=>(青)=>(白)=>(赤)=>、  
  LED−3が(青)=>(白)=>(赤)=>(緑)=>と色を変化させるものです。


写真/回路図


PL9823の点灯イメージ

写真の色が白くなってしまうのは、デジタルカメラの露出オーバーの問題で、
実際の見え方はきれいな発色をします



このマイコン内臓RGB−LEDの入力データイメージ


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●マイコン内臓RGB(PL9823)を使ってみる (その3)  (PIC12F1822)

  上記、マイコン内臓RGB−LED(PL9823)を、8個使ってルーレットにしたものです。
  このLEDは、ワンワイヤーでマイコンから全てのLEDを制御できるので、LEDの数が多くなるほど、
  このLEDを使うメリットが大きくなります。

  サンプル@は、(赤)(緑)(青)(白)の色が回転するものです。


写真/PL9823の点灯イメージ

写真の色が白くなってしまうのは、デジタルカメラの露出オーバーの問題で、
実際の見え方はきれいな発色をします(光が強すぎて写真が撮れません)。

ガラスエボキシ基板は強度が強く、見た目も綺麗ですが、穴あけに専用ドリルが必要です



回路図

マイコン内臓LEDのVDDとGNDの間に入れている0.1μFのチップコンデンサは回路図からは省略しています

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●I2C EEPを使ってみる  (PIC12F1822) MSSPバージョン

  I2Cのアクセスプログラムは、 「(別室)インターフェースのページ」の事例で取り上げたようにソフトウエア
  で作っても難しくはないのですが、PIC12F1822には多機能なMSSPモジュールが内蔵されているので、
  これを使うと簡単なレジスタ設定のみでI2Cプログラムが作れます。

  サンプル@は、マイクロチップ社のI2C−EEP(24FC256−I/F)にハイパーターミナルから入力した
  5バイトのデータを書き込み、これを読み出してハイパーターミナルに表示するものです。
  使用したI2C−EEP(24FC256−I/F)は、秋月電子で100円程度で購入できるものです。
  特殊な操作はしていないので、24シリーズのI2C EEPならほとんどのものが使えると思いますが、
  この類のEEPは、型番が同じでも、5Vでは使えないものや、アドレスの設定ピンが異なるものがあるので
  注意が必要です。
  このサンプルでは、EEPのアドレスをゼロにしているので、I2C−EEPのアドレスの設定ピン(A0〜A2)
  は全てGNDにつなぐ必要があります。
  なお、使用したI2C−EEPは高速タイプのものですが、それでも、24FC256のデータシートによると、
  バイト書き込み後、最大5mS以上のWaitを入れる必要があります。
  このサンプルでは、余裕を見込んでWaitを100mSにしてあります。
  Waitに100mSと大きな余裕を見込んでいるのは、他の低速なI2C−EEPを使っても、なるべく動作
  するようにするためです。


写真


回路図

回路図中のFC24F256のA0、A1、A2は全てGNDにつないでおく必要があります


ハイパーターミナルのイメージ


ハイパーターミナルの設定


sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●I2C 有機EL表示器を使ってみる(その1)  (PIC12F1822) MSSP/SO1602AWGB

  有機EL表示器(SO1602AWGB)を使ったサンプルを作ってみました。
  この表示器は、秋月電子で1600円程度で購入できるもので、液晶表示式のLCDとは全く比較にならないほど、
  表示が見やすくきれいです。
  また、I2C接続なので、MSSPを内蔵したPIC12F1822のような小型のマイコンでも充分使用する事ができます。
  但し、この表示器は、3.3V用なので注意が必要です。
  私が購入した表示器の説明書には、5Vでも使えるような誤解を与えるような記述がされていました。

  サンプル@は、PIC12F1822のMSSPモジュールを使って、1秒毎に簡単な画面を切り替えて表示している
  ものです。
  内容は、秋月電子の説明書にあるArduinoのサンプルを、PICのMSSPに移植しただけのものです。
  この類の表示器の処理速度は一般的に遅いので、I2Cでプログラムを作成する場合は、処理のタイミングに注意が
  必要です。


写真


回路図

回路図中のSW1は、GNDにつないでおく必要があります
この表示器は3.3V用です

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●I2C 有機EL表示器を使ってみる(その2)  (PIC12F1822) MSSP/SO1602AWYB

  秋月電子で購入した黄色の有機EL表示器(SO1602AWYB)を使って、シリアル表示器にしてみました。
  有機EL表示器は、自らが発光するのでバックライトが不要で、くっきり見えます。

  サンプル@は、ハイパーターミナルから入力した文字を有機EL表示器で表示するもので、PIC12F1822に
  内蔵されているMSSPモジュールと、EUSARTモジュールを組み合わせたものです。
  上記のサンプル同様、電源電圧は3.3Vなので、注意が必要です。

  サンプルAは、サンプル@に必要性に応じて下記のコマンドを追加したものです。
  コマンドは、今後追加される可能性があります。
    0x0d(Enterキー):改行されます
    0x01 :画面がクリアされます      (ハイパーターミナルからでは、このコードは入力できません)
    0x10 :1行目にカーソルが移動します(ハイパーターミナルからでは、このコードは入力できません)
    0x11 :2行目にカーソルが移動します(ハイパーターミナルからでは、このコードは入力できません)


写真とハイパーターミナルのイメージ

ハイパーターミナルから文字を入力すると初期画面がクリアされ、入力した文字が表示されます


回路図

回路図中のSW1は、GNDにつないでおく必要があります
この表示器は3.3V用です
回路図中の有機EL表示器は、SO1602AWGB(緑色)になっていますが、SO1602AWYB(黄色)
に差し替えても、実験では違いは色の違いのみで、全く同じように動作します



ハイパーターミナルの設定

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)

sample2.asm

プログラムソース サンプルA (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●I2C接続小型キャラクタLCDモジュール(3.3V/5V)ピッチ変換キット  (その1)  (PIC12F1822) MSSP/AQM1602XA

  秋月電子で16文字*2行のI2C液晶表示器がピッチ変換基板付きで550円で購入できるので使ってみました。
  この表示器は、3.3Vでも5Vでも、そのまま使用できるので、いろいろ使えそうな感じです。
  現在のPICには、MSSPはほとんどの品種に内蔵されているので、I2C接続型は簡単なプログラムで使用する事が
  できます。

  サンプル@は、PIC12F1822のMSSPモジュールを使って、2秒毎に簡単な画面を切り替えて表示している
  ものです。
  内容は、秋月電子の説明書にあるArduinoのサンプルを、PICのMSSPに移植した程度のものです。


写真/回路図

このサンプルは、実験基板にプルアップ抵抗が入っているので、ピッチ変換キットのプルアップは使用していません。
実際に使用する場合は、ピッチ変換キットのプルアップ抵抗を有効にすれば、外付けのプルアップ抵抗を省略できます。

sample1.asm

プログラムソース サンプル@ (PIC12F1822用 MPASM) アセンブラ言語プログラム)








●サーボモータを使ってみる  (その1)  (PIC12F1822)

  サーボモータを動かしてみました。
  いろいろ機能を追加して実験する予定なので、基板の右側をあけています。

  サンプル@は、基板の稼働確認のために作ったもので、10KΩのVRを回すと、赤のLEDが2mS〜2Sの周期で点滅します。
  サーボモータとは関係ありませんが、オシレータとして使えそうなので載せています。
  
  PIC−AS用のサンプルを作りたかったので、アセンブラバージョンも載せています。
  こちらは、10KΩのVRを回すと、赤のLEDが20mS〜2Sの周期で点滅します。

  サンプルAは、10KΩのVRを回すと、サーボモータがVRの位置に対応して−60°〜+60°の範囲で動きます。
  但し、12F1822の内蔵クロック16MHzでは動作速度が遅すぎて、100μSの正確なタイマーを作る事が出来なかったので、
  この部分はアセンブラのnopコマンドによるWaitにして、オシロスコープでWaitの回数をハンド調整しています。
  XC8コンパイラーによっては、タイマーが100μSになるように、nopの回数の再調整が必要になるかも知れません。 
  ※Wait_01mS関数のループの回数の箇所
  また、制御の最小単位が100μSとなっていて、処理速度が遅いため、このプログラムでは精緻な制御はできません。
  C言語で作るより、アセンブラで作った方が、はるかに精度の高いプログラムが作れると思います。

  PIC−ASを使ってサンプルAのアセンブラバージョンも作ってみました。
  タイマーはオシロスコープで簡単な調整をしてあります。
  10KΩのVRを回すと−60°〜+60°の範囲で動きます。
  このサンプルは、サーボモータの回転角度を250分割して(0.5°単位)動いているので、上記のC言語バージョンとは比較に
  ならないほどサーボモータが精細に動きます。
  但し、サーボモーターの種類により回転できる角度の範囲は異なるので、もしもVRを上限や下限まで回してモーターが振動するようなら、
  パルスの幅を調整して回転できる範囲を狭くしたり、逆に回転角度が足らなければ広くする必要があります。
  私が使用したサーボモータでは、VRをプラス側に回し切った時にモーターがうなったので、このプログラムの上限側には、
  角度リミッタを入れてあります。
  


写真/回路図/サーボモータは、GWSのS03N/2BBMG/F (回転角度:−60°〜+60°)を使って実験した

sample1.c

プログラムソース サンプル@ (PIC12F1822用) C言語(XC8)プログラム

sample1.asm

プログラムソース サンプル@ (PIC12F1822用) アセンブラ(PIC−AS)プログラム

sample2.c

プログラムソース サンプルA (PIC12F1822用) C言語(XC8)プログラム (回転角度:−60°〜+60°)

sample2.asm

プログラムソース サンプルA (PIC12F1822用) アセンブラ(PIC−AS)プログラム (回転角度:−60°〜+60°)








●ロジックテスター(その1)  (PIC12F1822)

  ロジックテスターを作ってみました。
  L/H/OFF(未接続)/クロックの4つのレベルをLEDで識別できます。
  マイコンポートの出力確認には、一般的にはテスターやLEDが使われることが多いと思いますが、
  テスターでは、H/Lの2つのレベルしか識別できないので、
  例えば、テスターで0Vが表示されていても、これがLレベルの出力がされているのか、断線したり入力ポートになっているのか
  区別ができませんし、オープンドレインポートのデバッグもできないので、
  こんなものを用意しておくと便利です。
  


写真/回路図
GND端子をテストするボードのGNDにつないで、測定端子をテストするポートに接触させます。


測定端子
測定端子はテスター棒ではなく、真鍮のくぎを基板に直付けしましたが、真鍮は半田がよくのるので半田付けしやすい感じです。


LEDの点灯イメージ

sample1.c

プログラムソース サンプル@ (PIC12F1822用) C言語(XC8)プログラム








●ロジックテスター(その2)

  マイコンをPIC12F1822から、PIC18F14K50に変更しました。
  下記の18F14K50の項を参照してください。









14、18、20ピンPIC 16F88/18F1320/16F1503/16F1508/16F1705を使ってみる


マイクロチップ社のデータシートより抜粋

●電子オルガン(16F88、16F819、16F84A、12F683)

PICのポートにトランジスタとスピーカーをつけたものだ。
ビープ音ではつまらないので、サンプルで「海」を入れてある。プログラムが簡単なので、新しい曲を入れる
のは簡単だ。
このプログラムは、出力波形がDCパルスで、聞き心地が悪い。
また、音階が正しくないので、暇な時に修正しようと思っている。(いつも暇なのだが)
 ●平均律音階
   中心の“ラ”の音の周波数が440Hz,その1オクターブ低い“ラ”の音が220Hz
   音階の周波数=220×2^(n/12) nは,1から12の整数

当初、12F683用に作るつもりだったが、基板の隅が余るので、16F88でも使えるようにした。
どちらかのICをソケットに差してつかうが、16F88を使った場合は、Bポートは鍵盤入力として使える。
なお、16F88用プログラムは、コメント位置を変更する事で、16F84A, 16F819でも使えるようになっているが、
これはデバイスの実験に使うためだ。
16F88、16F819は内部に発振回路も持っているから、わざわざ性能が劣る16F84Aでも使おうなんて考えな
ければ、OSCを省略して数十円の節約ができたのだが。

写真は、16F88をソケットに差した場合

12F683をソケットに差した場合の回路図

16F88をソケットに差した場合の回路図

s31.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム) 16F88 16F84A 16F819用 

s32.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム) 12F683用 





●PSG音響LSI式・電子オルゴール(16F88+YMZ294)

秋月電子でYAMAHAのYMZ294(YM2149相当)が、オシレータ付きで500円程度で販売されているので使ってみた。
このLSIは、かつてのパソコン(PC88,98、MSX、FM77、、、)等に使われていた音響LSIと同じものだ。
根気強くプログラミングすれば、上記の「電子オルガン」とは全く異なる優れた音質で、しかも3重和音のメロディーや効果音を
演奏する事ができる。
今ではすっかり見なくなったが、「BASIC」言語を使って、パソコンで音楽を鳴らした事がある人は多いと思う。

秋月電子の説明書には、16F84を使った場合の事例とプログラムが記載されている。
試作した回路は、この事例に、オーディオアンプ(LM386)とシリアルポートを追加しただけのものだ。
LM386のゲインは、最小の20倍(26dB)を選択しているが、それでもゲインが高すぎるので、10KΩのVRはギリギリまで
絞ってやらないと、アンプの出力が飽和してしまい、何も聞こえなくなってしまう。

サンプルプログラムは、「海」を演奏するものだ。
簡単なシングルの演奏プログラムだが、エンベローブ発生器を使って、ピアノ風にしてみた。


写真


回路図

sm1.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●上記、オルゴールを、ADM3202を使ってパソコンにつないで、電子オルガンにしてみた。
ハイパーターミナルに接続メッセージが表示されたら、1,2,3,,,,,0キーを押すと、ド、レ、ミ、、、、、、ミの音が出力される。
「18F8720/18F452マザーボード」の音源ボードとして使うために作った機能だ。(この場合は、ADM3202は使わない)

 ※この記事のパソコン側のアプリケーションが、 「ActiveBASICのページ」 にあります。


写真


回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

ActiveBASICを使った場合のパソコン画面の例
ハイパーターミナルを使うより、マウスでグラフィカルに演奏を行なう事ができます。

sm2.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●上記、オルゴールに、秋月電子で購入した振動センサーをつけてみた。
地震や揺れを感じると、1曲演奏される。
このセンサーは安価で単純な構造だが、小さな揺れにも確実に反応する。


写真 
この振動センサーは、おもりの揺れを感知するだけの簡単な構造ですが、小さな揺れでも動作が確実です。


回路図

sm3.asm

プログラムソース(MPLAB用 アセンブラプログラム)





●4桁2チャンネル電圧計(16F88)

16F88は、16F84や16F628に比べて、いくつかの追加機能がある。
10ビット A/D Converterも、そんな機能の一つだ。
このサンプルは、A/D Converterを使って、4桁・2チャンネルの電圧計を作ったもので、2つの入力
端子の電圧を交互に表示する。
表示器が6桁あるのは、他に補助表示をするためだ。表示を変えるのは簡単で、プログラム中には
英文字のパターンも一部もはいっている(使っている英文字のみパターンを作成してある)。
A/D Converterの出力は、10ビット16進数で、このままでは10進数表示の電圧計にはならないため、
プログラムで16進=>10進変換をしている。この仕組みは単にカウンタを使っているもので、例えば
フルスケールである 1,111,111,111(Bin) => 1023(Dec)の変換では、1000回以上ものループをして
変換するという、とても人に見せられるようなプログラムではないのだが、変換にかかる時間は最大でも
0.0数秒であり、表示するだけなら問題はない。(12F683で作った電圧計も同じだ。)
表示方法は、サイコロのところでも使ったダイナミック方式だ。ドライバーを使っていないので、LEDをあまり
明るくすると、PICが壊れてしまう。表示が暗いので、ドライバーは付けたほうがよかった。

ケースに入れてみた。電源を基準電圧としているので、他に電源回路もつけている。

回路は簡単だ。プッシュSWは使っていない。部品は、16F88と7セグメントLED以外は、抵抗やコンデンサだけだ

s41.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)







●ステッピングモータドライブ(16F88)

ステッピングモータを動かしてみた。
大型のアナログ(針式)時計のおもちゃを作るために、試作したものだ。
時計にする時は、発振子を水晶に変える必要がある。

このモータは、1パルスで3.6°回転する。

s71.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)







●6*7電光掲示板(16F88)

木製のベニヤ額(50cm角程度)に42個のLEDを取り付けて、6*7電光掲示板を作ってみた。
ダイナミック方式で、電源を入れると、数字や、A〜Fの文字、記号を表示する。
ドットが、これより多い掲示板も作成しているのだが、フォントの作成が大変で完成していない。

点燈イメージ(写真が見ずらいのは、デジタルカメラの露出の問題だ)

写真、及び回路図

s91.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)









●シリアル 6桁7セグメント表示器(16F88+12F683)

パソコンで入力した数字を表示する6桁7セグメント表示器で、CPUボードのモニター用に作ったものだ。
実際に使っている時には、12F683のGP4,GP5を直接CPUボードにつないで使っている。
ここではADM3202を使ってパソコンにつなぎ、Windows/XPの「ハイパー ターミナル」で動かしてみた。
電源を入れると、10秒程度デモが表示され、画面が消えたら入力可能だ。
数字以外が入力された場合、文字コードの下位4ビットの数字が表示される。
入力された数字は、1桁方向から6桁方向へシフトされて表示されていくが、'S'文字を入力した場合は、
続けて6文字の数字が設定された時点で表示が更新される。
(パネル用表示器として使用するための機能)。
ダイナミック表示方式のために入力待ちで止める事ができない(止めると表示が消えてしまう)ので、
通信のタイミングを制御する目的で、12F683も使用した。
タイミングの調整が出来ないほど文字間隔の時間を短くすると、動作が不安定になる可能性がある。
(キーボードから入力する程度のスピードでは、関係ないが。)

写真(表示器として使うので、小さくするため二層構造にした)

回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

sa1.asm

プログラムソースサンプル(12F683側 MPLAB用 アセンブラプログラム)

sa2.asm

プログラムソースサンプル(16F88側 MPLAB用 アセンブラプログラム)









●4桁デジタル表示タイマー + 4桁デジタル時計 (16F88)

4桁デジタル表示タイマーだ。
電源をつなぐと「PUSH」と表示されるので、ボタンを押し続けて設定する時間を合わせて、 ボタンを離すと
1分単位でカウントダウンが始まり、「0000」のカウントが終るとリレーがOFFになるというものだ。
使い方が簡単なので、私の部屋ではニッケル水素電池のトリクル充電器のタイマーとして活躍している。
7セグメント表示器は時計用の省電力型のものを使っているが、大型の表示器を使うなら、ドライバー用に
トランジスタをつけないと表示が暗くなってしまう。

写真(例えば上記の場合、12分後にリレーがOFFになる)

回路図(電源部を除く)

sb1.asm

タイマーのプログラムソースサンプル(MPLAB用 アセンブラプログラム)

この種のプログラムは、表示器+n進カウンター+タイマーの組み合わせなので、プログラムの簡単な修正で、
時計とか、周波数カウンタとかに変更する事ができる。
実験的な意味で、回路上の変更点なしで4桁デジタル時計にプログラムを修正してみた。
電源をつなぐと「PUSH」と表示されるので、ボタンを押し続けて時刻を合わせ、ボタンを離すと時計として動き出すものだ。
ただし、時計として使うなら、発振子を水晶にしたり、Wait時間を正確にしたりしないと精度が悪すぎて役に立たない。

写真(例えば上記の場合、12時12分の意味である)

sb2.asm

時計のプログラムソースサンプル(MPLAB用 アセンブラプログラム)









●16文字*2行 シリアルLCD表示器(16F88)

18F8720や18F452のマザーボードで使っているシリアルLCD表示器だ。
秋月電子で購入した16文字*2行のシリアルLCD(SC1602BSLB)を使用した。
説明のためにハイパーターミナルにつないだが、通常は、ADM3202は使わないで、16F88のPortA3,A4を
直接モニタするCPUに接続し、PICのモニターとして使っている。
単にキャラクター文字を表示するだけだが、0x80で画面クリア、0x81で2行目に改行されるようにしてある。
なお、5KΩのVRはLCD表示器のコントラストを調整する為のものだが、絞りきった状態では何も表示されない。

写真、及び回路図

ポートの設定(Windows/XP ハイパーターミナルの場合)

sc1.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)









●0〜25.5V(0.3A)直流安定化電源(16F88)

R-2R抵抗型8ビットD/Aコンバータを使って、直流電源器を作ってみた。
Bポートの8ビットに設定した値(0=>255)に対応して、電圧(0=>25.5V)を出力する。
30V(絶対上限は32V)の電源を供給すれば、0〜25.5V(0.3A)の可変は可能だが、そのためには、2SD553の
放熱器を大きなものに変える必要がある。(実際には12Vの電圧をかけて、0〜9V(0.3A)として使っている。)
出力電流が0.3Aを超えると、保護回路が動作する。
シリアルキーボードや、18F8720/18F452マザーボードのシリアルポートにつなぐ事を想定しているが(この
場合は、8ビットバイナリー入力モードで使用する)、説明の為に、ADM3202を使って、パソコンのハイパー
ターミナルにつないでみた。


 ※この記事のパソコン側のアプリケーションが、 「ActiveBASICのページ」 にあります。
 写真は、ハイパーターミナルでなく、ActiveBASICを使った場合のパソコン画面イメージ


写真

@写真(マザーボードにつなぐ事を考えているので、ADM3202は外付け基板だ。)
A000〜255以外の3桁の数字が入力された場合のエラーハンドリングは行なっていない。
 必ず、この範囲の数字を指定する必要がある。(デタラメの電圧が出力されるので注意!)
 

回路図

@精度が必要なら、例えば「10.0」を指定して、10.0Vになるように、赤色の抵抗を追加してフルスケールを微調整を行なう。
A5Vレギュレタ、及び2SD553には、放熱器が必要である。 
B5VレギュレタについているLEDは、レギュレターの出力を安定させるための安定的な電流負荷を兼ねている。

ポートの設定(Windows/XP ハイパーターミナルの場合)

sd1.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  ※MODE0を使うと、バイナリー入力モードになる。









●赤外線リモコン(16F88)

赤外線リモコンを作ってみた。
送信機で、Bポート(B0〜B7)、Aポート(A0〜A1,A3〜A4)につないだ12個のプッシュスイッチを押すと、
受信機で該当するポート [Bポート(B0〜B7)、Aポート(A0〜A3)] がONになる。
基板では、出力ポートにLEDがつながっているが、通常は、トランジスタやリレーなどをつないで使う。
実験では、5メートル程度離れても、確実に動作していた。

単に1バイトのキャラクタコードを赤外線で送受信しているだけなので、マトリックスにすれば、
そのままでも、255個までプッシュスイッチの増設が可能だ。

写真

送信機回路図

受信機回路図

sh1.asm

送信機プログラムソースサンプル(MPLAB用 アセンブラプログラム)  

sh2.asm

受信機プログラムソースサンプル(MPLAB用 アセンブラプログラム)  









●4桁表示器(16F88)

4桁7セグメント表示機を作ってみた。
電圧計やタイマーと同じような回路だが、センサーボードを付け替えて、多目的に使用する。

基本回路
220Ω*8に集合抵抗を使っているのは、たまたま手持ちがあったからです。
小型になるわけでも、価格が安いわけでもないので、ここに集合抵抗を使う意味は、あまりありません。

sj1.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  



@10.23V 直流電圧計にする

分圧抵抗をつけて、フルスケールが10.23V(16F88のADCが10ビットのため) の電圧計にした。
簡単なアセンブラのプログラムだが、実験のため、同じものをフリーのC言語(SDCC)でも作ってみた。
コンパイルは、sdcc -mpic14 -p16f88 プログラム名.c で行う。

写真

電圧計アダプタ (これを裏返しにして、表示器のセンサーボードの位置にさして使う)

回路

sj2.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム アセンブラバージョン)  

sj2.c

プログラムソースサンプル(SDCC用 C言語バージョン)  



A気圧計にする

秋月電子で購入した「気圧計ボード」をつないでみた。
付属のマニュアルによると、このセンサーは、810〜1060hPaの大気圧の測定が可能だ。
10ビットD/Aコンバータのフルスケールは「1023」であるが、プログラムで1060までの表示も出来るようにしてある。
校正は、プログラム中のパラメータ「PI_ATM」※注)を、表示が正しくなるように増減して行なう。

※注1)「PI_ATM」は16ビットのパラメータなので、上位8ビットの「PI_ATM1」と、下位8ビットの「PI_ATM0」の2つのパラメータに
わけて設定する。
※注2)このセンサーは、現在販売されていない。

写真

回路

sj3.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  



B温度計にする

秋月電子で購入した-55℃〜+150℃の温度センサー(LM35DZ)をつないでみた。
このセンサーは、温度センサー(S-8100B)と異なり、摂氏直読温度センサーで、出力が+10.0mV/℃で、出力
インピダンスが低いので、電圧計につなぐだけで、そのまま無調整で温度計になってしまう、使いやすいICだ。
※S-8100Bは、出力インピダンスが高いので、ボルテージフォロア等を通さないとPICに接続できない。

「@10.23V 直流電圧計」のプログラムと違うのは、少数点の表示位置だけだ。

写真

回路

sj4.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  



Cパルス発信器(50Hz,100Hz,500Hz,1KHz,5KHz,10KHz,50KHz,100KHz)にする

パルス発信器にしてみた。表示器は選択する周波数を表示する。
VRを回して周波数を選択し、ボタンを押すと選択された周波数のパルスが出力される。
周波数を変更する場合は、再度ボタンを押せば、周波数選択画面に戻る。
ドライバーにMOS-FETを使ったのは、大電流のMOS-FETチップが秋月電子で安価で購入できるからだ。
トランジスタを使っても問題はない。

原因がこのMOS-FETによるものかどうかは不明だが、周波数が高くなると波形が崩れている

センサーボードのイメージ
このMOS-FETは形状がチップなので、プリント基板を作らないと半田付けが難しい

回路(一つでも充分な電流が流せるが、デュアルタイプのMOS−FETなのでパラレル接続した。)

sj5.asm

プログラムソースサンプル (MPLAB用 アセンブラプログラム)  



D089.0mV直流電圧計にする

OP07を使って、089.0mV程度まで測れる直流電圧計にしてみた。
微小電圧を扱うので、汎用的なオペアンプでは使えない。
OP07は高性能なオペアンプで、説明書によるとオフセットは、最大でも150μVとの事だが、最小桁の表示が
100μVになるので、オフセットの微調整は必要だ。
OP07の'+'、'-'入力をショートして出力が0Vになるように、20KΩ半固定VRを回して調整してやる。

このオペアンプに必要な負電源は、電圧を表示しながら、PICで同時に作り出している。

写真

回路図

正確に合わせるなら、表示が「050.0」の時に50mVになるように、4.7MΩは微調整が必要

sj6.asm

プログラムソースサンプル (MPLAB用 アセンブラプログラム)  





Eコンデンサ容量計(1μF〜9999μF)にする

コンデンサ容量計にしてみた。
測定が開始されると表示が「−」になり、1秒以内で測定した容量が表示される。
容量が9999μFを超える場合は、「Err1」が表示される。
数秒程度、測定値を表示すると、再度測定が開始される。
この動作を繰り返す。

通常、大容量のコンデンサは値が大きめに出来ていて、基準にできるコンデンサを用意するのが難しいのだが、
正確な大容量のコンデンサがあれば、プログラム中のパラメータ「PI_C( 10Bitの変数なので、実際にはPI_C1、
PI_C2、但し、0 <= PI_C1 <= 03h、0 <= PI_C2 <= FFh )」の値を変える事で校正してやる事ができる。

写真

回路図

sj7.asm

プログラムソースサンプル (MPLAB用 アセンブラプログラム)  





F周波数カウンタ(1〜9999Hz)にする

低周波の周波数カウンタにしてみた。
12F683が周波数カウンタ本体で、測定結果を16F88に送っている。16F88は7セグメントの表示を行なっている。
周波数カウンタ本体は、12F683のTIMER1-MODULEによる1Hzの割り込みと、カウンターを組み合わせただけだ。
タイマー割込みで時計や周波数カウンタを作る場合、精度を高めるために、通常は32.768KHzの水晶を2^15分周して
1Hzの割り込みを行なわせるのが普通だが、
ここでは、表示器の精度が最大でも4桁しかないので、12F683の内部オシレータを使ってみた。
入力には6倍のアンプをつけているが、周波数が低いので、入手が容易で、安価な、汎用単電源オペアンプを
使っている。

電源を接続し、12F683が16F88と正常に通信できれば、F683と表示され、周波数カウンタが稼動する。
12F683と16F88が正常に通信を開始するためには、この2つのCPUが、ほぼ同時に電源が入る必要がある。

写真 (50Hzのパルスを入力したイメージ)

回路図

sj8.asm

プログラムソースサンプル (MPLAB用 16F88用 アセンブラプログラム)  

sj9.asm

プログラムソースサンプル (MPLAB用 12F683用 アセンブラプログラム)  





G超音波距離計(10〜255cm)にする

超音波センサーをつないで距離計にしてみた。
全点等、デモ表示後、1秒毎に距離を測定し、測定結果を表示する。
AVR用に作った超音波アダプタをつないだだけだ。詳細は 「(別室)AVRのページ」を参照。
精度は高くないが、実験では、10〜80cmくらいまで1cm単位での測定が可能だった。
回路図※Aの10KΩを微調整する事で、感度の調整は可能だ。
超音波センサーは秋月電子で購入した40KHzのものだ。

写真

実験の様子(テーブルにビデオテープを置いて、センサーからビデオテープまでの距離を測定した)

回路図

sjj101.asm

プログラムソースサンプル (MPLAB用 16F88用 アセンブラプログラム)  











●16文字*1行 LCD表示器(16F88)

16文字*1行 LCD表示器を作ってみた。
上記の7セグメントを使った「4桁表示器」の表示部をLCDにしたものだ。
「4桁表示器」とは、センサーボードの寸法を同じにしてあるので、「4桁表示器」で使ったセンサーボードを
付け換えて使う事もできる。
LCDは、OPTREX社のDCM16117Aだ。16文字*1行と表示できる文字数は少ないが、秋月電子の店頭で、
300円程度で購入できる。 


※注1)この表示器とほぼ同じ機能のものが、秋月電子で「16文字X1行キャラクタ表示LCDモジュール(S-10551D)」
  として、通販でも購入できるようになりました。   ※H21.2.19現在、300円で購入可能です。
  ピン配置も同じなので、実験で単純に差し替えてみると、そのまま問題なく動作しました。
  付属する説明書も、ほとんどが同じ資料のコピーのようです。
※注2)この表示器は、秋月電子で通販でも購入できるようになりました。
  価格は300円です。※H22.9.10現在

写真

基本回路

DCM16117Aを、S-10551Dに置き換えて動かしてみた





@電圧計(10.23V)にする

「4桁表示器(@10.23V 直流電圧計ボード)」で使ったセンサーボードをつないで、
電圧計にしてみた。

写真

回路

sn1.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  



A周波数カウンタ(0000〜9999Hz)にする

周波数カウンタにしてみた。
水晶をつければ6桁程度の精度の周波数カウンタにできるのだが、
内部OSCを使ってタイマー割り込みをかけているので、精度は高くない。
入力アンプは作っていないので、入力はTTLレベルだ。

写真 (50Hzのパルスを入力したイメージ)

回路

sn10.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  



B周波数カウンタ(00,00〜99,99MHz)にする

CPLDを使って99MHz程度まで測定できる周波数カウンタにしてみた。
CPLDはCPUではないので、PICを使えば容易にできるLCDをコントロールするような事は困難だが、
PICでは難しい数10MHzの高速処理ができてしまう。
このサンプルでは、CPLDは単なるプリスケーラとして使っている。
入力アンプは作っていないので、入力はTTLレベルだ。

CPLDは、初めての人でも扱いやすいデバイスだ。
詳細は、 「CPLDのページ」 で扱っている。

※注)これはCPLDに限った事ではありませんが、一般に、CPLDは壊れやすいので、
電源電圧を超えるような入力をしたり、電源を切った状態で入力を加えたりしてはいけません。

CPLDによっては、平気な種類もありますが。

写真

回路

CPLDのピンアサイン

sn20.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  

sn21.txt

サンプル(メイン部分)プログラム(WebPACK用 VHDLファイル)  

sn22.txt

サンプル(カウンタ部分)プログラム(WebPACK用 VHDLファイル)  



CUV(紫外線)メーターにする

浜松ホトニクス(株)のUVセンサー(G3614)をつないで、UVメータにしてみた。
夏の太陽の紫外線量を測定したり、サングラスやUVガラスの紫外線カット率を調べたり、紫外線ランプの紫外線量をみたりと、
なかなか応用の利く便利なセンサーだ。
回路は、浜松ホトニクス(株)のマニュアルに記載されている通りのもので、プログラムは単なる電圧計だ。
このサンプルは、PICの事例として取り上げているので、PICを使ってLCDにデジタル表示しているが、実際に使ってみると、
5V程度のアナログ式直流電圧計をつないだ方が(回路図A)、表示が安定していて使いやすい。

なお、このセンサーは、過去に秋月電子で千円程度で購入したものだが、現在(H21/09)、秋月電子は、ほとんど同等のセンサーを
使ったキットが「ICL7136(液晶表示)使用 デジタルUV(紫外線量)計キット」として販売されている。

写真/回路図@

回路図A(アナログメータをつないだ例)

sn30.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  















●20バー3色表示器(16F88)

10バー3色LEDを2個つないで表示機を作ってみた。
ボードを付け替えて、多目的に使用する。

写真

基本回路

sk1.asm

サンプルプログラム(MPLAB用 アセンブラプログラム)  



@乾電池チェッカーにする

抵抗をつないで、単三乾電池の残量チェッカーにしてみた。

写真

回路

sk2.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  



Aステレオ レベルインジケーターにする (Version 3)

  ※バージョン3です。平均値を表示するように修正しました。


16F88に内蔵されている Comparator Module 及び、Comparator Voltage Reference Moduleを使って作った
ステレオ レベルインジケーターだ。
パソコンや、オーディオ機器のライン端子につないで、オーディオのアクセサリーとして使用する。
コンパレータを使うと、A/Dコンバータを使った場合に比べて、瞬時に波形をサンプルできるので、レベルメーターには最適だ。
n回の計測値の平均(加重を加えてある)を表示している。

中点(3.125[V])のマイナス側の波形を使って測定しているので、単電源の汎用OPアンプ(LM358)を使用した。
ライン端子につないで、VRを回してもLEDの振れ幅が小さい(ゲインが小さい)場合は、回路図の100Ωをつないで、アンプのゲインを
上げてやる。
このレベルインジケーターは、オペアンプの出力が中点(3.125[V])でゼロ表示1.042[V]で最大表示になるようになっている。

なお、このレベルインジケーターはオーディオ用なので、入力に直流を加えても動作はしない。
コンパイルは、sdcc -mpic14 -p16f88 プログラム名.c で行う。

写真 (全体/アダプタ基板[表]/アダプタ基板[裏])

写真 (点灯したイメージ)

16F88の入力イメージ

回路 ※入力のゲインが必要な場合は、10KΩのVRをもっと大きい値に変更する必要がある

pkaa001.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)  















●ACジェネレータ(16F88)

16F88に8ビットのD/Aコンバータを付けて、多目的なジェネレータにしてみた。

写真

基本回路


@SIN波(500Hz, 100Hz, 50Hz, 10Hz)ジェネレータにする

プッシュスイッチ(1〜4)を押すと、500Hz,100Hz,50Hz,10HzのSIN波を出力するジェネレータにしてみた。
内部発振器を使っているので、周波数はあまり正確に合わせていない。
周波数を正確にあわせるなら、プログラム中の関数(WAVWAT)の微調整が必要だ。
なお、基板上の12F683は使っていない(ICソケットから抜いておく)。

写真

回路

オシロスコープによる出力波形の測定(写真は500Hzの時)

pp0016.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  




A三角波(500Hz, 100Hz, 50Hz, 10Hz)ジェネレータにする

上記、「@SIN波(500Hz, 100Hz, 50Hz, 10Hz)ジェネレータにする」のデータを修正して三角波にしてみた。
プログラム中のSIN(X)のデータ以外は、回路もプログラムも全く同じだ。

写真

回路

オシロスコープによる出力波形の測定(写真は500Hzの時)

pp0018.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)  




B周波数精度が高いサイン波(1KHz, 500Hz, 100Hz, 50Hz)ジェネレータにする

上記、「@SIN波(500Hz, 100Hz, 50Hz, 10Hz)ジェネレータにする」の入力に水晶を使って周波数精度を高くしてみた。
12F683は水晶発振器を分周したオシレータで、電源投入時の12F683のスイッチの位置により、
1.00000KHz, 500.000Hz, 100.000Hz, 50.000Hz程度の精度でサイン波を出力する。

写真

回路

オシロスコープによる出力波形の測定(写真は50Hzの時)

pp0022.asm

16F88側 プログラムソースサンプル(MPLAB用 アセンブラプログラム)  

pp0023.asm

12F683側 プログラムソースサンプル(MPLAB用 アセンブラプログラム)  









●38ドット電子ルーレット(16F88)

38個のLEDを使って電子ルーレットを作ってみた。
ルーレット中心にあるボタンを押すと、ルーレットが高速回転を開始し、スピードが遅くなって乱数で任意のLEDで止まる。
ケースは、美術で使うベニヤカンバスを代用した。
基板には、AVR、及びPICの何れでも使用できるように、両方の回路を付けてある。
 ※この記事のAVRバージョンは、 「(別室)AVRのページ」 にあります。


写真(表示部分)  


写真


回路図(PIC用)

saa1.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)









●5*7LEDドット表示器(16F84A/16F88/18F1320)

5*7LEDドット表示器を作ってみた。
電源を入れると、0〜9、A-Z、絵柄の順に表示する。
この表示器は、 「HI-TECH PICC Lite」 を使ってみる事を目的に作った単純なサンプルだ。
このCコンパイラーは、16F84A、12F629、12F675、、、、についてはMPLABから無償で使用できるが、
18F1320,16F88には対応していないので、16F84A専用だ。
18F1320,16F88用で作ったものはアセンブラだが、カナ文字が追加されている。
18F1320は、16F88に比べてプログラムメモリーが2倍になっていて、大きなプログラムでもページを意識する必要が
ない等の改良がされているのだが、PORTのピン配置に互換性がなく、プログラムを単純に移行する事はできない。

SDCCを使って16F88用にC言語で書いたプログラムは、HI-TECH C言語で書いた16F84A用のプログラムを、
SDCCの実験の為に16F88に移植してみただけだ。
SDCCは、2進表記が使えないので、フォントの移植は大変だ。

なお、「HI-TECH PICC Lite」や、「SDCC」については、 「(別室)Cygwinのページ」 で紹介している。


写真(表示イメージ)  


写真  


回路図

sab1.c

プログラムソースサンプル(16F84A MPLAB用 HI-TECH C言語プログラム)

sab2.asm

プログラムソースサンプル(16F88 MPLAB用 アセンブラプログラム)

sab3.asm

プログラムソースサンプル(18F1320 MPLAB用 アセンブラプログラム)

sab4.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)

sab5.c

プログラムソースサンプル(16F88 HI_TECH PICC Version9.83 C言語プログラム)









●モールス信号発生器@(16F88)

モールス信号の発生器を作ってみた。
電源を入れると、A-Z、0-9、登録したメッセージの順にモールス信号に変換して出力する。
キーのスピードは、「M_out」関数の「Speed=50」を増減する(値が小さいほど速くなる)事で変更が可能だ。
なるべく簡単で安価に作るために、秋月電子で100円以下で購入した圧電スピーカーを使用したが
もちろん、トランジスタとスピーカをつないでもかまわない。
この表示器は、SDCCを使ってみる事を目的に作った簡単なサンプルだ。
「SDCC」はフリーのCコンパイラーで、詳細は 「(別室)Cygwinのページ」 で紹介している。


写真


モールス信号のイメージ


回路図 (圧電スピーカをつけただけだ)

sac1.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)

sac2.c

プログラムソースサンプル(16F88 HI_TECH PICC Version9.83 C言語プログラム)









●モールス信号発生器A(16F88)

上記の「モールス信号発生器@」と、16F88のAUSARTを組み合わせて、
パソコンのハイパーターミナルから入力した文字(A-Z、0-9)を、モールス信号に変換するようにしてみた。
例えば、これを無線機に接続すれば、モールス信号を知らなくても、モールス信号による通信が可能だ。
上記同様、「SDCC」のCコンパイラーを使用した。(サンプル@)

サンプルBは、サンプル@のHI_TECH PICCバージョンだ。


写真


ハイパーターミナルのイメージ(0〜9、A〜Z[大文字]で入力すると、モールス信号に変換される)

ポートの設定(Windows/XP ハイパーターミナルの場合)


モールス信号のイメージ


回路図 (簡単な回路だ)

sac2.c

プログラムソースサンプル@(16F88 SDCC用 C言語プログラム)

sac2i.c

プログラムソースサンプルA(16F88 SDCC用 C言語プログラム ※上記の受信割り込みバージョン)

sac2b.c

プログラムソースサンプルB(16F88 HI_TECH PICC Version9.83 C言語プログラム)







●モールス信号発生器AB(16F88)

上記の「モールス信号発生器A」に、特殊文字 ”.,?−_/@”を追加しただけのものだ。
それ以外は、上記の「モールス信号発生器A」と同じだ。

プログラムは、SDCCで、プログラムの大きさが16F88の1ページに収まらない場合(2K以上)を想定したサンプルだ。
マニュアルによると、SDCCには自動的にページを割り当てる機能は無いので、このような場合は、1ページに収まるように
プログラマーがサブルーチンを別々に分けてコンパイルしてから、リンクする必要がある。(サンプル@)
言うまでもないが、18シリーズの場合は、ページを意識する必要がないので、このような考慮は不要だ。

サンプルAは、サンプル@のHI_TECH PICCバージョンだ。


回路図 (上記と全く同じ)


コンパイルイメージ
 @分割したサブルーチンをコンパイルのみしておく ※注)−cは、コンパイルのみ行うオプション
 Aメインルーチンをコンパイルする時に、サブルーチンを、いっしょにリンクする              

sac2m.c

プログラムソースサンプル@(16F88 SDCC用 C言語プログラム メインプログラム)

sac2s.c

プログラムソースサンプル@(16F88 SDCC用 C言語プログラム サブプログラム)

sac2h.c

プログラムソースサンプルA(16F88 HI_TECH PICC Version9.83 C言語プログラム)









●モールス信号解析器(16F88)

電鍵からモールス信号を打つと、打たれたモールス信号を解析して、ハイパーターミナルに表示する。
18F452で作ったモールス信号解析器を、18F452を使うような大きなプログラムではないので、16F88へ移植しただけだ。
タイミングが合わない場合、「トン」をなるべく短く、「ツー」をなるべく長く、「トン」と「ツー」の間をなるべく短く、「文字間の区切り」を
なるべく長く打てば、実験では、ほぼ確実に変換していた。

上記のサンプル同様、プログラムサイズが1ページを超えるので、分割コンパイルしてリンクする。(サンプル@)

サンプルAは、サンプル@のHI_TECH PICCバージョンだ。


写真




ハイパーターミナルのイメージ(該当する文字と、「トン」が、’0’、「ツー」が’−’で表示される)



ポートの設定(Windows/XP ハイパーターミナルの場合)




回路図 (「電信キー」は、プッシュSWに置き換える事もできるが、その場合、エラーが多発する可能性がある。)





コンパイル方法(上記と同様だ)



sac41m.c

プログラムソースサンプル@(16F88 SDCC用 C言語プログラム メインプログラム)

sac41s.c

プログラムソースサンプル@(16F88 SDCC用 C言語プログラム サブプログラム)

sac41h.c

プログラムソースサンプルA(16F88 HI_TECH PICC Version9.83 C言語プログラム)









●オシレータ(16F88 + CPLD XC9572)

CPLDを使って、簡単なオシレータを作ってみた。
ハイパーターミナルから、出力したい周波数を数字で直接入力し、スペースキーを押すと、該当の周波数が出力される。
20MHzの水晶発振器を、プログラマブルに分周しているだけのものなので、例えば10MHzのように、水晶発振器の周波数を
割り切れる周波数を指定すると、6桁の高精度(使用した水晶発振器の精度)の周波数が出力されるが、そうでないと、
精度が落ちてしまう。
また、原理的に低い周波数のほうが精度が高くなるが、あまり低い周波数だと、このプログラムでは、出力が開始されるまでの
計算に時間がかかり過ぎるので、エラー処理をして入力できないようにしてある。
※CPLDに何ら制約があるわけではないが、このプログラムでは、実用性から分周は24ビット(最大16,777,215)で行っている。

この種のものは、PICに限らず、マイコンだけで作ると、処理が遅くて低い周波数のものしか作れないので、CPLDを組み合わせた
事例は、多くの書籍等で紹介されている。
なお、CPLDについての詳細は 「(別室)CPLD/FPGAのページ」 で説明している。

上記のサンプル同様、16F88のプログラムサイズは1ページを超えるので、分割コンパイルしてリンクする。
VHDL言語のプログラムは、ベタで書いているのでプログラムが長くなった。


写真




ハイパーターミナルのイメージ(出力する周波数をHz[50〜10000000]で入力し、スペースを入力すると出力される)



ポートの設定(Windows/XP ハイパーターミナルの場合)




回路図




アサイン




XC9572のPLCCパッケージのピン配置(QFP型はピン配置が異なるので注意!!)





コンパイル方法(上記と同様だ)





オシロスコープによる出力波形(CPLDの振幅は、ゼロでもGNDまで下がらないので、用途によっては加工が必要だ)



sae01m.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム メインプログラム)

sae01s.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム サブプログラム)




sae01m.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム メインプログラム)

sae01s1.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム サブプログラム@)

sae01s2.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム サブプログラムA)

sae01s3.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム サブプログラムB)

sae01s4.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム サブプログラムC)

sae01s5.txt

プログラムソースサンプル(XC9572用 VHDL言語プログラム サブプログラムD)









●データロガー(16F88)

簡単なデータロガーを作ってみた。
フリーのActiveBASICを使ったパソコンのアプリケーションも作って、計測データをパソコンに蓄積しようというものだ。
8HMzの水晶は、安価な表面実装タイプのものだ。


写真 (右隅に付いているのは、逆接続保護用のダイオードと、LEDランプ)


回路図





  @周波数カウンタ(〜50KHz程度)にしてみる

   周波数カウンタにしてみた。
   パソコン側のアプリケーションを準備していないので、結果をハイパーターミナルに表示した。
   C言語(SDCC)を使用したので、アセンブラに比較すれば、タイマー割り込みの精度が若干落ちてしまうが、
   50KHzで実験すると、4桁以上の精度はあるようだ。
   使用した8MHzの水晶の誤差もあるので、6桁以上の精度を求めても意味はないのだが、
   簡単なプログラムなので、周波数の精度を考えるなら、アセンブラで作るべきだろう。
   
   SDCCのコンパイルは、sdcc -mpic14 -p16f88 プログラム名.c で行う。


写真


ハイパーターミナルのイメージ ※50.000KHzのパルスを測定してみた


ハイパーターミナルの設定


回路図 
※PORTA(0)〜(2)の何れに入力しても良いが、入力のプルダウン抵抗(回路図中の10KΩ*3)は必須だ
プルダウン抵抗がないと、デタラメの値が表示される場合がある。               

pag02011.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)





  ASIN波(50Hz)発振器

   16F88に内蔵されている「COMPARATOR VOLTAGE REFERENCE MODULE」は、コンパレータの比較基準値に使うものだが、
   出力もできるので、4ビットのD/Aコンバータとして使用する事もできる。
   このサンプルは、この機能を使って、プログラムで50HzのSIN波を発生させているものだ。
   4ビットのD/Aコンバータでは、精密な波形を作る事はできないが、アナログ信号を簡単に出力する事ができる。
   ただし、もともと比較に使うものなので、回路のインピダンスが高く、出力に使う場合はボルテージフォロア等のバッファを通す必要がある。
   この類のボルテージフォロアには、レールツーレールの単電源オペアンプが理想だが、電源が5Vの時、出力は最大でも
   3.2V程度にしかならないので、ここでは安価な汎用単電源オペアンプ(LM358)を使用している。 
   D/Aコンバータの精度が低いので、1周期を20分割してSIN波を作っているが、この精度を高める事は簡単だ。 
   その場合、タイマー割り込みの周波数精度は、逆に低くなる。


写真 (全体/ボルテージフォロア(表)/ボルテージフォロア(裏))


オシロの波形 ※4ビット(16分割)だと、ギザギザが目立っている


回路図            

pag02021.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)









●SPI方式・12ビットD/Aコンバータサンプル(MCP4922/16F88)

12ビット・SPI方式のD/Aコンバータが、秋月電子で300円程度と安価に購入できるので使ってみた。
シリアル入力なので、高速用途には向かないと思うが、精度の高い12ビットのD/Aコンバータが2系統入っていて、
単電源で、3.3V系でも、5V系でも使えるという使い勝手の良いものだ。
このD/Aコンバータ(MCP4922)はマイクロチップ社製で、データシートにPICの事例が紹介されている事からも
わかるように、PICやdsPICとの相性は抜群だ。

サンプルプログラムは、出力a、出力bに、12ビットの高精度でそれぞれ異なる形状の階段状の波形を発生させるものだ。
※このサンプルでは、S1は閉じて10μFのコンデンサーはショートしておく。


写真 (全体/DAコンバータ基板[表]/DAコンバータ基板[裏])


回路図


オシロスコープの波形 (出力a端子/出力b端子)

main.c

プログラムソースサンプル(16F88 SDCC用 C言語プログラム)









●模型用サーボモータサンプル(16F88)

ラジコンや2足歩行ロボットで一般的な模型用のサーボモータを動かしてみた。
使用したサーボモータは、GWS製のS03N/2BBMG/F(フタバ)で、秋月電子で1000円程度で購入できるものだ。
GWSの模型用のサーボモータには、フタバやJR、、、等の種類があるが、基本的にはコネクタの形状と、配線の配列が異なるだけだ。

サンプルプログラム@は、-60°==> 中央 ==> +60°==> 中央 という動きを繰り返す。 
サンプルプログラムAは、サンプルプログラム@と同じ機能のものを、CCPモジュールとTIMER1を使って作ってみたものだ。
サンプルプログラムBは、サンプルプログラムAと同じ機能のものを、C言語(SDCC)で作ってみたものだ。
            ※SDCCのコンパイルは、sdcc -mpic14 -p16f88 プログラム名.c で行う。


写真


回路図


サーボモータの制御方法

main1.asm

プログラムソースサンプル@(16F88 MPLAB用 アセンブラプログラム)

main2.asm

プログラムソースサンプルA(16F88 MPLAB用 CCPバージョン アセンブラプログラム)

main3.c

プログラムソースサンプルB(16F88 SDCC用 CCPバージョン C言語プログラム)









●16列*8行*2色 高輝度LED表示機(16F88)

秋月電子の「16*2色 2色(赤、緑) LEDボード」 ※注1) を4セット使用して表示機を作ってみた。
アルファベット(A〜Z)、数字(0〜9)、カタカナ(ア〜ン)、特殊記号を、赤か緑で、右または左にスクロールさせて表示する。
このボードは、ラッチやシフトレジスタといったドライバーが装着されているので、PICで制御するのは簡単だ。
使用されている2色LEDは大型で、眩しすぎるほどの明るさがあるが、全点灯時には5Vで 5Aもの消費電流があるので、
電源ラインには太めの配線を使用し、大型の電源器を使わないと火事になる可能性がある。
(PICKIT2のISCP機能で電源を供給したり、一般のACアダプタを使用したりすると、PICKIT2やACアダプタが壊れてしまいます
PICKIT2を使用する場合は、ソケットの抜き差しで開発するほうが無難です。)

サンプルプログラム@は、A〜Z、0〜9を、赤/緑と交互に、右、及び左に、文字が入力される度にキャラクタ単位でスクロール
させて表示するものだ。
プログラム中の文字フォント(8*6)は、「5*7LEDドット表示器」用に作成したものを、そのまま使用した。

サンプルプログラムAは、メッセージボードのような使い方を想定したもので、サンプルプログラム@をドット単位でスクロールさせる
ように変更したものだ。

※注1)このボードは、現在(H21/09)、秋月電子では販売されていないようです。


写真(表示イメージ/消灯イメージ/表示器の裏面)と回路図

main1.asm

サンプルプログラム@ キャラクタスクロール(16F88 MPLAB用 アセンブラプログラム)

main2.asm

サンプルプログラムA ドットスクロール(16F88 MPLAB用 アセンブラプログラム)









●4桁7セグメント100円ボードを使ってみる(16F88)


   300円、電源コード(2本)のハンダ付けのみでできる活用事例です。
   ※詳細は、 「(別室)ジャンクボードを活用しよう」のページ にあります。

P>






●実験ボード・タイプ5A(PIC16F1503/PIC16F1705)

     PIC16F1503や、PIC16F1705等の14ピンPICを使った実験ボードを作ってみました。
     PIC16F1503の場合、上記、PIC12F1501のサンプルに簡単な修正をするだけで、動作できます。 

     サンプル@は、この実験ボードのテストのために作ったもので、NCOを使って、「ドレミ・・・」と、
     簡単な童謡を演奏するものです。
     このサンプルは、上記、PIC12F1501のサンプルに簡単な修正をしただけのものです。


写真/回路図


ISP端子にPICKIT3をつないだイメージ


サンプル@
写真/圧電スピーカアダプタ/回路図

sample1.asm

プログラムソース サンプル@ (PIC16F1503用) MPLAB/MPASM アセンブラバージョン


     (1)









●8音色バトルサウンド(PIC16F88/GSE3568)


   ジャンクで見つけた8音色バトルサウンドIC(GSE3568)をPIC16F88につないで、バトルサウンドを
   出力するものです。
   PICのTIMER1を使って、1秒毎に8種類のアクションゲームの効果音を出力するようにしていますが、
   レーザー光線銃や爆弾、マシンガン等の迫力ある効果音を出力するので、マイコンでアクションゲームを
   自作した時、ゲームに合わせて音を出すようにして、効果音として使うといいかも知れません。
   あまり音を大きくするとうるさいので、音量は少し控えめにしてあります。

   このICは、過去に秋月電子で「8音色バトルサウンドキット」として使われていたICと同じです。


写真/回路図

sample1.asm

プログラムソース サンプル@ (PIC16F88用) MPLAB/MPASM アセンブラバージョン








80ピンPIC 18F8720を使ってみる

秋月電子 PIC18シリーズ取扱い H22.12現在

●マザーボードの制作

18F8720は本格的なCPUなので、マザーボードを作ってみた。
18F8720の80ピンフラットICは、半田付けに自信がないので、秋月電子のモジュールを購入した。
さすがにアセンブラでプログラムメモリーが128Kバイトもあると、メモリーの残り容量など気にならない。
ボードにはデータを扱えるように、基板上に3つのSerial EEP ROMソケット(2線式 24用I2Cバス)を載せて
いる。このシリーズのEEPには、1Mビットのものもあり、趣味で扱うデータとしては充分な大きさだ。
LCDは、そのままでは配線が大変なので、シリアル接続をしている。これは16F88で作ったオリジナルだ。
18F8720には2系統の通信モジュール(USART)があるが、これではシリアルポートが足りないため、
オリジナルの通信プログラムを使用した。
プログラムの書き込みは、アダプタ(単なる延長ケーブル)をマザーボードのコネクタに挿して行なうが、
この時、他の回路に影響がないようにマザーボードは考えて作る必要がある。
※このマザーボードの場合は、プログラムを書き換える時にはシリアルLCD基板のソケットははずして
おかないと、書き込みエラーになってしまう。

なお、18シリーズには、16シリーズとコマンドの記述が異なるものがあるので、初めて使う人は
18F8720のマニュアル「INSTRUCTION SET SUMMARY」のページを参照しておく事を勧める。
  例) MOVFW  aaa    ==>   MOVF aaa,W 
     RRF f,F      ===>   RRCF f[,d[,a]    

こんな感じの構成

手書きプリント基板だと、さすがにきたない

簡単なアダプタをつないで遊んでいるところ。アダプタには、他に、温度や湿度等のセンサー類、リレードライブ、
ステッピングモータードライブ・・・があり、現在も拡充中だ。



【ADP1】温度センサーアダプタの例 ※無調整で温度計の精度は考えていない。
負の温度係数を持つセンサーなので、反転増幅をして、PICのA/D Converterにつないだ。
0℃で1.75V程度出力されるので、これはプログラムで引き算してやる。



【ADP2】D/Aコンバータ アダプタの例 
一般的に使われている、R-2R抵抗型8ビットD/Aコンバータの回路だ。
出力に、オペアンプやトランジスタをつけて、マザーボードから、DCモータのスピードや、ランプの明るさをコントロール
するために作ったものだ。
16F88側のプログラムは、OSCを内部8MHzに設定し、あとは、ポートAに入力された値を、ポートBにコピーしているだけだ。
マザーボードのパラレルポートに25本の同値の抵抗をつけるだけでも良いのだが、ポートによっては属性が異なるものがある
(他のマザーボードでも使用する事を想定している)ために、16F88を入れている。



【ADP3】キーボードの例 
マザーボードにパソコン用のキーボードをつけると、より使いやすくなった。
※注)詳細は、12F683の項目「パソコンキーボード(PS/2 106日本語キーボード)のPIC接続用アダプタ」を参照。



【ADP4】赤外線通信アダプタの例 
赤外線通信を行なう事で、通信ケーブルをなくす事ができる。



試作したマザーボードの構成図

回路図(シリアルLCD基板との接続は、TX,RXをクロスさせる必要がある。また、ADM3202は使わない。)

s51.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)



@2線式EEPアクセス用に、別にプログラムを作ったのは、ピンアサインを変更する可能性があるからだ。
このプログラムは、24シリーズのEEPをアクセスするためのもので、広くI2Cバスを意識して
作ってあるわけではない。また、アトメル社のAT24C256以外では、動作確認もしていない。
マニュアルに書かれた通りの使い方をするなら、MSSPを使って作った方が簡単で信頼性が高い。
Aデモとメニュー画面は、稼動確認のために使った単なるおまけだ。実際には接続するアダプタに応じて、
その都度作り直しているので、常に変更されていて、完成したプログラムではない。






40ピンPIC 18F452/18F4520/18F4525を使ってみる

●マザーボードの制作

比較するため、18F8720のマザーボードと似た構成で、18F452のマザーボードも作ってみた。
18F8720に比較すれば、ポート数やメモリーの制約は受けるが、それでも、32Kバイトのプログラムメモリー
があれば、実用上は充分な性能である。
基板には2つのSerial EEP ROM(2線式 24用I2Cバス)を載せている。
18F452は、クロックを40MHzにする事もできるが、実験で18F8720マザーボードと互換性を保つ必要があった
ため、20MHzで動かしている。
比較のため、16F877でもテストを考えたのだが、プログラムメモリーが8K Wordsでは、マザーボードにするには、
少し力不足のようなのでやめた。(1.3K Words 程度のプログラムなので、使えなくはないのだが)

こんな感じ

相変わらず、フリーハンドの手書きプリント基板。定規くらいは使った方がいい。

18F8720で使ったアダプタをつないで遊んでみた

試作したマザーボードの構成図

回路図(シリアルLCD基板との接続は、TX,RXをクロスさせる必要がある。また、ADM3202は使わない。)

s61.asm

プログラムソースサンプル(MPLAB用 アセンブラプログラム)





●16*32ドットLEDグラフィック表示器(18F452,16F877+12F683)

16*16ドットLED表示器を2個使って、16*32ドットの表示器を作ってみた。
文字・記号やグラフィックをLEDで表示する。
いろいろな使い方ができるように、シリアル通信ポートと24シリーズのシリアルEEPをつけている。
回路を簡単にするため、ドライバーにトランジスタアレー(TD62083AP)を4個使った。
これは、秋月電子で1個100円程度で購入できる安価なものだ。
回路中にある12F683は、16F88の項目の「シリアル 6桁7セグメント表示器」でも使った通信制御を行なうものだ。

サンプルで作ったプログラムは、プログラム中に文字コードとグラフィックパターンを登録しておき、「18F8720/18F452
マザーボード」や、パソコン等のシリアル通信ポートから文字コードを入力し、該当のグラフィックを表示する。
18F452を使った場合で、100パターンほどグラフィックを登録できるが、16*32のグラフィックをドットパターンで
作成するのは、根気のいる作業だ。
サンプルプログラムでは、グラフィックが単純な「+」、「−」、「全消灯」、「全点等」、「まだら模様A,B」の6パターンを
テストの為に登録した。

プログラムの構造が簡単なので、グラフィックをEEPに登録して使うなり、スクロール表示して使うなり、変更する
のは簡単だ。
また、Eポートに、EEPのかわりにドットLEDやドライバーをもう一組追加して、16*48ドット表示機にする事も出来るが、
その場合、表示が暗くなる可能性はある。

写真(小さくするために、2枚の両面基板を重ねて作ってみた)


ハイパーターミナルにつないで+−文字を入力し、表示したところ


回路図(サンプルプログラムでは、EEPをアクセスしていない。図のTRは2SC1815では電流が足りないので使えない。)

ポートの設定(Windows/XP ハイパーターミナルの場合)



sf1.asm

プログラムソース(MPLAB用 12F683用 アセンブラプログラム)

sf2.asm

プログラムソース(MPLAB用 18F452を使用する場合 アセンブラプログラム)

sf3.asm

プログラムソース(MPLAB用 16F877を使用する場合 アセンブラプログラム)





●上記、「16*32ドットLEDグラフィック表示器」の回路に変更を加えないで、「8*8ドット8文字」のプログラムも作ってみた。
フォントは関数「SETSFNT」に登録する。サンプルでは上記と同様の6パターンをテストの為に登録してある。
18F452用のサンプルは、上記機能も全て含んでいて、モード切り替えスイッチ(GST変数)の値が異なるだけだ。
※プログラムの180行目付近のコメントにする変数が異なるだけで、それ以外は全く同じプログラム。
12F683用のプログラムは、上記と全く同じものだ。

ハイパーターミナルにつないで+−文字を入力し、表示したところ



sf1.asm

プログラムソース(MPLAB用 12F683用 アセンブラプログラム)

sf4.asm

プログラムソース(MPLAB用 18F452を使用する場合 アセンブラプログラム)

sf5.asm

プログラムソース(MPLAB用 16F877を使用する場合 アセンブラプログラム)





●上記、「16*32ドットLEDグラフィック表示器」の回路に変更を加えないで、「8*6ドット10文字」のプログラムも作ってみた。
フォントは関数「SETFNT86」に登録する。サンプルでは0〜9、A〜Z、半角カナ、特殊文字をテストの為に登録してある。
デモを表示した後、入力モードになるので、ハイパーターミナルから0〜9、A〜Z、半角カナを入力すると、スクロールしてドット表示する。
18F452用のサンプルは、上記機能も全て含んでいて、モード切り替えスイッチ(GST変数)の値が異なるだけだ。
※プログラムの180行目付近のコメントにする変数が異なるだけで、それ以外は全く同じプログラム。
12F683用のプログラムは、上記と全く同じものだ。

ハイパーターミナルにつないで文字を入力し、表示したところ



sf1.asm

プログラムソース(MPLAB用 12F683用 アセンブラプログラム)

sf6.asm

プログラムソース(MPLAB用 18F452を使用する場合 アセンブラプログラム)





●上記、「16*32ドットLEDグラフィック表示器」の回路に変更を加えないで、「8*6ドット10文字」表示の掲示板にしてみた。
表示したい内容をEEPに書き込み、表示する。
EEPのデータに'OO'、'FF'を書き込むと先頭に戻り、'01'を書き込むとウエイトする。
フォントは、英/数/カナ/特殊文字が登録されている。
18F452用のサンプルは、上記機能も全て含んでいて、モード切り替えスイッチ(GST変数)の値が異なるだけだ。
※プログラムの180行目付近のコメントにする変数が異なるだけで、それ以外は全く同じプログラム。
12F683用のプログラムは、上記と全く同じものだ。

サンプルのEEPデータを表示したところ

美術のベニアカンバスに収納したイメージ

sf1.asm

プログラムソース(MPLAB用 12F683用 アセンブラプログラム)

sf7.asm

プログラムソース(MPLAB用 18F452を使用する場合 アセンブラプログラム)

sfeep1.asm

EEPデータサンプル(MPASM用 アトメルAT24C256用 アセンブラプログラム)









●モールス信号解析器(18F452)

実験で、SDCCのC言語を使ったサンプルを作ってみた。
電鍵でモールス信号を打つと、ハイパーターミナルに該当する文字が表示される。
キーを打つスピードは人によって異なるが、プログラムの設定は、デフォルトでは超スローにしてある。
タイミングが合わない場合、「トン」をなるべく短く、「ツー」をなるべく長く、「トン」と「ツー」の間をなるべく短く、「文字間の区切り」を
なるべく長く打てば、実験では、ほぼ確実に変換していた。

内容は、18F452が必要なほど大きなプログラムではないが、18シリーズはページを意識する必要が無いので、大きなプログラム
でも簡単だ。(そもそもページを意識するような大きなプログラムではないが。)
コンパイルは、sdcc  -mpic16  -p18f452  [プログラム名] で行なう。


写真




ハイパーターミナルのイメージ(該当する文字と、「トン」が、’0’、「ツー」が’−’で表示される)



ポートの設定(Windows/XP ハイパーターミナルの場合)




回路図 (「電信キー」は、プッシュSWに置き換える事もできるが、その場合、エラーが多発する可能性がある。)



sac21.c

プログラムソースサンプル(18F452 SDCC用 C言語プログラム)
※注)Configが反映されない事象が発生するので、ライターのハンド設定が必要









●マザーボード2 (18F452 + CPLD/XC9536XL)

CPLDをつないだマザーボードを作ってみた。
マイコンが苦手な高速処理は、CPLDに分担させようというものだ。
サンプルのCPLD(XC9536XL)は、このシリーズで最も小規模なものだが、必要ならXC9572XLに差し替えも可能だ。
XLシリーズを使っているので、電源電圧は3.3Vだ。
18F452は、3.3Vではクロックを10MHz程度にしないと確実な動作はしないので、注意が必要だ。



写真(ソケットに33MHzの水晶を挿した状態)


回路図


XC9536XL(PLCCパッケージの場合)のピン配置



(1)プログラマブルオシレータ

  ボードの稼動確認のために作ったサンプルだ。
  およそ10秒毎に、500KHz=>100KHz=>50KHz=>10KHz=>5KHz=>1KHzの順に6桁の高精度の周波数を出力する。
  プログラムは、PICで指定した分周回数だけ、CPLDが水晶発振器の周波数を分周しているだけだ。
  簡単なプログラムだが、33MHzの水晶をプログラムで分周するなど、CPLDを使わないと、
  PIC単体では不可能だ。
  水晶は、3.3V用の手持ちが33MHzしかなかったので、これを使って実験したが、出来れば20MHzとか、
  切がいい周波数の水晶を使った方が、分周回数の計算が簡単だ。


回路図


CPLDのピンアサイン


オシロで見た出力波形(普通の波形だ)




saf0101m.txt

プログラムソースサンプル(XC9536XL用 VHDL言語プログラム メインプログラム)

saf0101s1.txt

プログラムソースサンプル(XC9536XL用 VHDL言語プログラム サブプログラム@)

saf0101s2.txt

プログラムソースサンプル(XC9536XL用 VHDL言語プログラム サブプログラムA)

saf0101s3.txt

プログラムソースサンプル(XC9536XL用 VHDL言語プログラム サブプログラムB)

saf0101.asm

プログラムソース(MPLAB用 18F452用 アセンブラプログラム)









●16文字*1行 LCD表示器(18F452/18F4520/18F4525)

16文字*1行 LCD表示器(DMC16117A/S-10551D)とセンサーボードをつないで、測定値を表示するようにしたものだ。
OSCは10MHz水晶を使用して、PLLで40MHz動作させている。

このHPでは、他に16F88や18F14K50で作ったバージョンも紹介しているが、それらのマイコンではポート数やメモリーの制約で
実現できなかったものがあるので、このクラスのマイコンで作り直したものだ。



写真(表示イメージ/LCDを外したイメージ/裏面)/回路図
なるべく小型にするため、マイコンはLCDの下に配置し、水晶は40ピンソケットの中に配置している。




(1)シリアルLCD表示器にしてみる

  稼動確認のために作ったサンプルだ。
  パソコンとRS232で接続し、ハイパーターミナルから入力した文字をLCDにスクロール表示する。


写真(表示イメージ/ハイパーターミナルイメージ)/回路図


ハイパーターミナルの設定

test1.c

プログラムソースサンプル(18F452用  C言語(MPLAB C18))バージョン

test2.c

プログラムソースサンプル(18F4520用  C言語(MPLAB C18))バージョン

test3.c

プログラムソースサンプル(18F4525用  C言語(MPLAB C18))バージョン






(2)3軸加速度センサー(KXM52)をつないでみる

  3軸加速度センサー(KXM52−1050)を使ったサンプルを作ってみた。
  このセンサーは秋月電子で1000円で購入したもので、電源が5Vの時、X/Y/Zのアナログ出力をそのまま直読できる(−1[G]で1.5V、
  0[G]で2.5V、1[G]で3.5Vが出力される)使いやすいものだ。
  サンプルは、X軸/Y軸/Z軸方向の加速度[G]を、そのまま表示する。
  使っているLCDが16文字しか表示できないので、小数点以下2桁表示にしているが、マニュアルによると、このセンサーはオフセットの誤差があり、
  さらに精度が5パーセントなので、表示は充分なものだ。
  なお、このサンプルは18F452で作っているが、16F88や18F14K50で作っても、特に問題があるわけではない。
  (18F452を使うほど、大きなプログラムではない。)
  
  このセンサーは、静止状態では、地表面から垂直方向に1[G]の重力加速度を受けているので、表示はセンサーの姿勢状態を示している。
  例えば、このセンサーをX軸方向に回転してやれば、表示は、X軸が地表面と垂直方向の時1.00[G]、平行の時0.00[G]、逆方向の時
  −1.00[G]と変化する。
  三角関数と組み合わせてやれば、いろいろ応用が出来そうなセンサーである。


写真(左からX軸/Y軸/Z軸方向の加速度[G]を表示)  回路図  X軸/Y軸/Z軸の方向
表示を精緻にしたいなら、電源に正確な5Vを供給し、オフセットの調整(0[G]の時に0.00表示になるように、プログラム中の
PI_1Gの値を修正)する必要があります。

test1.c

プログラムソースサンプル(18F452用  C言語(MPLAB C18))バージョン

test2.c

プログラムソースサンプル(18F4520用  C言語(MPLAB C18))バージョン  準備中!!!

test3.c

プログラムソースサンプル(18F4525用  C言語(MPLAB C18))バージョン  準備中!!!









●実験ボード・タイプ4A(PIC16F1939)

16F1939を使った実験ボードを作ってみた。
このCPUは、「CAPACITIVE SENSING MODULE」や、「LCD DRIVER MODULE」といったユニークな機能を内蔵したもので、
特殊機能を使った事例は、下記の「第四章 特殊な機能を内蔵したPICを使ってみる」の章で取り上げていく予定だ。

サンプルは、OSCCONで内部OSC16MHzを選択し、/4/8分周して、PORTBに500KHzを出力するようにしたものだが、
実測してみると、499.9341KHzと、このマイコンの内部OSCの精度は高いようだ。


写真/回路図

test1.asm

プログラムソースサンプル(16F1939用  アセンブラ言語(MPLAB MPASM))バージョン




 (1)ルーレットにしてみる

    LEDを8個つないでルーレットにしてみた。

    サンプル@は、Timer1モジュールを使って、1秒毎にルーレットが回転する(16MHz動作)。

    サンプルAは、サンプル@を32MHz動作させているものだ。

    サンプルBは、Timer割り込みで1秒毎にルーレットが回転する(16MHz動作)。

    サンプルCは、サンプル@をHI−TECH PLCC C言語に置き換えたものだ。

    サンプルDは、サンプルBをHI−TECH PLCC C言語に置き換えたものだ。


写真/回路図

sample1.asm

サンプル@(16F1939用 16MHz動作 アセンブラ言語(MPLAB MPASM))バージョン

sample2.asm

サンプルA(16F1939用 32MHz動作 アセンブラ言語(MPLAB MPASM))バージョン

sample3.asm

サンプルB(16F1939用 16MHz動作 タイマー割り込み アセンブラ言語(MPLAB MPASM))バージョン

sample4.c

サンプルC(16F1939用 16MHz動作 HI−TECH PLCC C言語)バージョン

sample5.c

サンプルD(16F1939用 16MHz動作 タイマー割り込み HI−TECH PLCC C言語)バージョン




 (2)EUSARTでパソコンにつないでみる

    EUSARTを使って、ハイパーターミナルに出力するエコープログラムを作ってみた。

    サンプル@は、EUSARTを使ったエコープログラムで、入力があるまで待機する。

    サンプルAは、EUSART割り込みを使ったエコープログラムで、入力があるまで他の処理を実行する。
    (このサンプルでは、入力があるまで無限ループ処理を実行する)


写真/ハイパーターミナルのイメージ/回路図

ハイパーターミナルの設定

sample1.asm

サンプル@(16F1939用 16MHz動作 EUSART アセンブラ言語(MPLAB MPASM))バージョン

sample2.asm

サンプルA(16F1939用 16MHz動作 EUSART割り込み アセンブラ言語(MPLAB MPASM))バージョン


 (3)電圧計(0〜10.23V)にしてみる

    A/D Convreterモジュールを使って、ハイパーターミナルに出力する電圧計にしてみた。
    ハイパーターミナルの設定は、上記、エコープログラムと同じにしてある。
    12F1822の実験ボードで作ったプログラムと、ほとんど同じものだ。

    12F1822のサンプル同様、ボルテージフォロアで使用した安価なレールTOレール型のCMOS OPAMPは、OFFSETの精度が
    高くはないので、測定精度はあまり高くはない。
    (例えば、入力をゼロにしても、完全なゼロの表示にはならない。)
    精度を高くしたいなら、高精度オペアンプを使用する必要があります。


写真/回路図


ハイパーターミナルのイメージ(5V、0Vを測定した場合)

test2.asm

プログラムソースサンプル(16F1939用  アセンブラ言語(MPLAB MPASM))バージョン










PIC16F877、PIC16F877Aを使ってみる


16F877や16F877Aは、特徴のPICではありませんが、私の個人的な都合で必要になったので、サンプルを作っています。


16F877/16F877A(DIP型)の写真


秋月電子では、こんなボードも入手できます(16F877Aモジュール/同マザーボード)


上記、マザーボードを組み立ててみました。
実験用の基板なので、プリントパターンや周辺機器はいろいろ改造しています。
なお、16F877AモジュールをCN4コネクタからPICKITにつなぐ場合、このモジュール内のダイオード(D2:1SS344)は
ショートしておかないと、CN4コネクタに電源が供給されず、PICKITとつながりません。

●実験ボード・タイプ5A(PIC16F877/PIC16F877A)

上の16F1939を使った実験ボード・タイプ4Aを改良したものです。
このマイコンは、オシレータが内蔵されていないので、外部に20MHzの水晶をつないでいます。


写真/回路図




 (1)ルーレットにしてみる

    LEDを8個つないでルーレットにしてみました。

    サンプル@は、Timer1モジュールを使って、PORTCにつないだLEDが1秒毎に点滅します(20MHz動作)。
    サンプルAは、Timer1モジュールの割り込みを使って、PORTCにつないだLEDが1秒毎に回転します(20MHz動作)。
    サンプルBは、割り込みとタイマーを組み合わせたもので、Timer1を割り込み、Timer2を0.5mSタイマーとして使用し
    Timer2でLEDを点灯、Timer1の割り込み処理でLEDを消灯し、PORTCにつないだLEDを1秒毎に点滅させている
    ものです(20MHz動作)。

    なお、もしPORTDでLEDを点滅させる場合は、このサンプルプログラム中の「TRISE=0xff」の箇所はコメントにするか、
    TRISE[4]のビットはゼロにする必要があります。
    TRISE[4]は、「I/O Port」と「PSP」の切り替えスイッチになっていて、このビットを選択すると、
    PORTDは「PSP」が選択され、「I/O Port」にはならないからです。
    


写真


回路図
実際の写真の実験では、LEDは個々にトランジスタを経由させて点灯させています。
但し、データシートを見るとPORTCの8個の上限電流は200mAなので、
8個のLEDを同時に点灯させても、回路図のように抵抗だけつければ大丈夫です。

test1.c

プログラムソースサンプル@(16F877用  C言語(XC))Timer1 バージョン

test1.c

プログラムソースサンプル@(16F877用  C言語(XC))Timer1 バージョン (BIT反転式)

test1.c

プログラムソースサンプル@(16F877A用  C言語(XC))Timer1 バージョン

test2.c

プログラムソースサンプルA(16F877用  C言語(XC))Timer1 割り込みバージョン

test2.c

プログラムソースサンプルA(16F877A用  C言語(XC))Timer1 割り込みバージョン

test3.c

プログラムソースサンプルB(16F877用  C言語(XC))Timer1割り込み、Timer2バージョン


 (2)UARTを使ってみる

    UARTを使った簡単なサンプルを作ってみました。
    ADM3202ANを経由して、パソコンのTeraTERMにつないでいます。  

    サンプル@は、電源を入れると接続メッセージを出力し、エコープログラムになります。
    ボーレートは9600BPSにしてあります。

    サンプルAは、サンプル@の割り込みバージョンです。


回路図とTeraTERMのイメージ

test1.c

プログラムソースサンプル@(16F877用  C言語(XC))ノーマルバージョン

test1.c

プログラムソースサンプル@(16F877A用  C言語(XC))ノーマルバージョン

test2.c

プログラムソースサンプルA(16F877用  C言語(XC))割り込みバージョン

test2.c

プログラムソースサンプルA(16F877A用  C言語(XC))割り込みバージョン


 (3)A/Dコンバータを使ってみる

    A/Dコンバータを使った簡単なサンプルを作ってみました。
    ADM3202ANを経由して、パソコンのTeraTERMにつないでいます。 
    PICに限った事ではありませんが、入力ポートは抵抗でプルダウンしておかないと、A/Dコンバータの入力端子
    に何もつながない時、デタラメの値が表示されますので、注意が必要です。 

    サンプル@は、電源を入れると接続メッセージを出力し、Timer1で1秒ごとにAN0の電圧を表示します。
    UARTは割り込みバージョンを使っているので、エコー機能も使用できます。
    なお、何の保護回路も入れていないので、この電圧が電源電圧を超えるとPICが壊れます。
    ボーレートは9600BPSにしてあります。

    サンプルAは、サンプル@にWatchdogを追加したものです。
    Watchdogは、プリスケーラで2.3秒でリセットがかかるようにしてあります。
    メインループの「Timer_1mS(秒数)」が2000(2秒)なら、2秒ごとにAN0の電圧が表示され続けますが、
    3000(3秒)なら、リセットがかかり、接続メッセージと電圧表示が2.3秒毎に繰り返されます。

    サンプルBは、AN0、AN1、AN3の電圧を順に表示するもので、サンプルAを修正したものです。
    


回路図とTeraTERMのイメージ


サンプルBの回路図とTeraTERMのイメージ

test1.c

プログラムソースサンプル@(16F877用  C言語(XC))ノーマルバージョン

test1a.c

プログラムソースサンプル@(16F877A用  C言語(XC))ノーマルバージョン

test2.c

プログラムソースサンプルA(16F877用  C言語(XC))ノーマルバージョン

test2a.c

プログラムソースサンプルA(16F877A用  C言語(XC))ノーマルバージョン

test3.c

プログラムソースサンプルB(16F877用  C言語(XC))AN0、AN1、AN3の電圧表示

test3a.c

プログラムソースサンプルB(16F877A用  C言語(XC))AN0、AN1、AN3の電圧表示









●14桁7セグメント100円ボードを使ってみる(18F4525/18F4520/18F452)


   秋月電子(八潮店)の100円ボードを使った活用事例です。
   ※詳細は、 「(別室)ジャンクボードを活用しよう」のページ にあります。









●128*64(Dot) グラフィックLCD表示器(18F452/18F4520/18F4525)

128*64(Dot)グラフィックLCD表示器(SG12864A)を使った簡単なボードを作ってみた。
この表示器は、秋月電子で2000円程度で購入したものだ。
OSCは10MHz水晶を使用して、PLLで40MHz動作させている。

サンプル@は、稼動確認のために、上記、「16*32ドットLEDグラフィック表示器(18F452,16F877+12F683) 」で作ったフォントをプログラム中に組み込んで
表示してみたものだ。この表示器は、グラフィック表示器なので、キャラクタ文字を表示するにはフォントの作成が必要だ。
(キャラクタ文字を表示するだけなら、キャラクタ表示器を使えばいいので、グラフィック表示器を使う意味がないのですが。)

サンプルAは、簡単なラインコマンドを作って、数式の計算結果を代入し、グラフを表示してみたものだ。

サンプルBは、簡単な座標計算をする事で、表示領域(CS1,CS2)の区別をなくしたもので、このほうが実用的な使い方かも知れません。

注)PICKIT2やPICKIT3をつないだまま動作させると、表示位置がずれて表示される場合があります。


写真(サンプル@の表示イメージ/LCDを外したイメージ/裏面)/回路図
なるべく小型にするため、マイコンはLCDの下に配置し、水晶は40ピンソケットの中に配置している。
コントラスト調整の半固定VR(10KΩ)は、微妙に調整しないと表示が全く見えないので、調整しやすい場所に配置したほうがいいです。
(このボードのようにLCD表示器の下に取り付けてしまうと、調整が大変です。)


写真(サンプルAの表示イメージ)


写真(サンプルBの表示イメージ)


LCDの座標イメージ

sample1a.c

プログラムソースサンプル@(18F452用  C言語(MPLAB C18))バージョン

sample1b.c

プログラムソースサンプル@(18F4520用  C言語(MPLAB C18))バージョン

sample1c.c

プログラムソースサンプル@(18F4525用  C言語(MPLAB C18))バージョン

sample2a.c

プログラムソースサンプルA(18F452用  C言語(MPLAB C18))バージョン

sample2b.c

プログラムソースサンプルA(18F4520用  C言語(MPLAB C18))バージョン

sample2c.c

プログラムソースサンプルA(18F4525用  C言語(MPLAB C18))バージョン

sample3a.c

プログラムソースサンプルB(18F452用  C言語(MPLAB C18))バージョン

sample3b.c

プログラムソースサンプルB(18F4520用  C言語(MPLAB C18))バージョン

sample3c.c

プログラムソースサンプルB(18F4525用  C言語(MPLAB C18))バージョン




(1)電圧(0〜10.23V)をグラフィックで表示してみる


    電圧をグラフィックで表示するサンプルを作ってみました。

    サンプル@は、電源を投入すると1秒毎に50回の電圧測定(0〜5V)を行ってグラフに表示し、測定した電圧の最大値、最小値、
    平均値を、右半分にmVで表示します。
    このサンプルでは、入力電圧は、5Vを越えてはいけません(グラフが5Vまでしか表示できません)。

    サンプルAは、10秒毎に電圧測定(0〜10.23V)を行って、現在の電圧を画面右上に数値で表示し、直近の100データ
    (約17分)をグラフでスクロール表示します。
    このサンプルは、グラフィック処理をLCD上のメモリーを使って処理しているので、画面のスクロール処理が遅くなっていますが、
    例えばdsPICのような大きなメモリーを積んだPICを使って、グラフィック処理はPICのメモリー上でおこなうようにしてやれば、
    スクロールによる画面の再描写がわからないくらい、画面の表示を高速にする事ができます。
    このような事例は、「dsPIC33FJ256GP710」を使ったものを、 「第二章 16ビットPICを使ってみる」のページで取り上げています。


サンプル@の写真/回路図
電解コンデンサの充電電圧を入力にして測定してみた


サンプルAの写真
可変式の直流安定化電源で、0〜10.23Vの電圧を変化させて入力したイメージ

sample1a.c

サンプル@(18F452用  C言語(MPLAB C18))バージョン

sample1b.c

サンプル@(18F4520用  C言語(MPLAB C18))バージョン

sample1c.c

サンプル@(18F4525用  C言語(MPLAB C18))バージョン

sample2a.c

サンプルA(18F452用  C言語(MPLAB C18))バージョン   準備中!!!

sample2b.c

サンプルA(18F4520用  C言語(MPLAB C18))バージョン   準備中!!!

sample2c.c

サンプルA(18F4525用  C言語(MPLAB C18))バージョン











●LANでパソコンとつないでみる(その1)   (18F4520、LANコントローラ[RTL8019AS])

  LANコントローラ(RTL8019)を使って、PICをLANにつなぐ事例です。

  ※この記事は、 「(別室)インターフェースのページ」のページ にあります。













●実験ボード・タイプ5A(PIC18F452/PIC18F4520/PIC18F4525)

上記、PIC12F1822で使ったマイコン内臓LEDボードを使って、簡単な実験ボードを作ってみました。

PIC18F452のA/Dコンバーターにいろいろなアダプタをつないで、例えばオーディオイルミネーションにするとか、
派手なアクセサリーを作る事を想定するものです。
PIC12F1822のサンプルでも何も問題はないのですが、PIC18F452のほうがプログラムメモリーが多いので、
こちらの方が、派手な光らせ方をプログラムして遊ぶ事ができます。
但し、PICKIT2及びPICKIT3をつないだまま動作させると、システムクロックのスピードの都合で、実験では正常に
動作しないので、注意が必要です。


サンプル@は、稼動確認のために作ったもので、それぞれのLEDが、単色の赤・緑・青・白に変化します。


写真


回路図

test1.asm

サンプル@(PIC18F452用  アセンブラ言語(MPLAB MPASM))バージョン















USB内臓のPICを使ってみる


    PICを使うとUSBを使ったアプリケーションが容易に作成できます。
    この章では、USBを使ってパソコンと通信を行う簡単なサンプルをまとめています。

Bタイプ(ターゲット側)の標準USBレセクタブル 
USBのBタイプコネクタには、他にMini−Bもあるが、標準タイプのほうが工作しやすいようだ
パソコンとの接続ケーブルは、なければダイソーで100円で購入できる
注意)プラグ側の図ではありません(レセクタブル側から見た図です)
裏面のピン配置図は、購入するコネクタにより異なるかも知れません。

参考)秋月電子取り扱い ※H21.12月 現在


20ピンPIC PIC18F14K50を使ってみる


     最新のPICの中には、なかなか魅力的なものがあるのだが、中でもPIC18F14K50は、USBを積んだマイコンとしては
     20ピンと小型で安価ながら、性能的には今までの16シリーズを上回る(Flash:16KバイトRAM:768バイト
     Clock:48MHz
、ADC、EUSART、MSSP、、、、)、16シリーズの置き換えとしても最適と思われるものだ。
     また、開発にはアセンブラの他、マイクロチップ社純正のCコンパイラー(C18)、SDCC等も使用できる。
     但し、新しいPICなので、例えばPICKIT2で使用する場合、MPLABやPICKIT2(アプリケーション)、SDCC等は最新の
     ものに更新しておく必要はある(古いバージョンのままだと、PICKIT2は、このマイコンには対応していない)。


マイクロチップ社のマニュアルより抜粋

PICKIT2で書き込む場合、こんなアダプタを作っておくと便利です




  ●実験ボード タイプ1(PIC18F14K50)

写真

回路図 ※このCPUは4X PLLが内蔵されているので、12MHz水晶でPLLEN=ONの時、48MHz動作になります


     1.基本機能

       (1)ルーレットアダプタをつないでみる

           稼動確認のため、LEDが回転する簡単なプログラムを作ってみた。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません

写真、回路図 

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB XC8)) バージョン

test2.asm

プログラムソースB(MPLAB用 PIC18F14K50用 Timer仕様(1秒間隔) アセンブラ MPASM) バージョン

test2.c

プログラムソースC(MPLAB用 PIC18F14K50用 Timer仕様(1秒間隔) C言語(MPLAB C18)) バージョン

test3.asm

プログラムソースD(MPLAB用 PIC18F14K50用 Timer割り込み仕様(1秒間隔) アセンブラ MPASM) バージョン

test3.c

プログラムソースE(MPLAB用 PIC18F14K50用 Timer割り込み仕様(1秒間隔) C言語(MPLAB C18)) バージョン



       (2)UARTを使ってみる

           EUSARTを使って、簡単なエコーバックプログラムを作ってみた。
           このCPUに内蔵されているEUSARTは、16Fシリーズの従来のUSARTに比べて機能が拡張されて使いやすくなった。
           (Baud Rateを16ビットで指定できる、、、、。)
           RXピンは、デフォルトではアナログ設定なので、ANSELHのデジタル設定は忘れないように注意が必要だ。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません
           
           

写真、回路図

ハイパーターミナルのイメージ

ハイパーターミナルの設定

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン

test1.asm

プログラムソースB(MPLAB用 PIC18F14K50用 割り込み仕様 アセンブラ(MPASM)) バージョン

test1.c

プログラムソースC(MPLAB用 PIC18F14K50用 割り込み仕様 C言語(MPLAB C18)) バージョン



       (3)A/D Converterを使ってみる

           EUSARTとA/D Converterを使って5Vの電圧計にしてみた。
           入力はAN(10)にしてある。
           実験で何の保護回路も付けていないので、電源電圧以上の入力を加えると、PICが壊れてしまうので注意が必要です。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません

写真、回路図

ハイパーターミナルのイメージ ※ハイパーターミナルの設定は、上記と同じ

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン  ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン



       (4)割り込みを使ったサンプル

           タイマー割り込みを使って周波数カウンタにしてみた。
           入力はAN(10)[PORTB(4)]にしてある。
           実験で何の保護回路も付けていないので、電源電圧以上の入力を加えると、PICが壊れてしまうので注意が必要です。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません。     

写真、回路図

ファンクションジェネレータで100.000KHzを入力したハイパーターミナルのイメージ
簡単なサンプルなので、100KHzという高い周波数帯域では精度が低くなってしまう
(OSCが48MHzの時、1ステップのプログラムの記述でも、工夫しないと100KHzでは1%近い誤差が発生してしまう)
※ハイパーターミナルの設定は、上記と同じ

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン  ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン



       (5)ECCPを使ったサンプル

           ECCPを使ってPWMによる調光器にしてみた。2.5秒程度で、LEDが明暗を繰り返す。
           18F14K50に内蔵されているECCPは、16FシリーズのCCPに比べて、例えばブリッジ機能が拡充され、より使いやすくなっている。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません。     

写真、回路図

周波数カウンタとオシロスコープによる出力波形のイメージ

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン  ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン



       (6)Voltage Reference機能を使った簡単なサンプル

           Voltage Referenceを使って50HzのSin波発生器(AC波形)を作ってみた。
           18F14K50に内蔵されているVoltage Referenceには、新たにFVR(Fixed Voltage Reference)機能が追加され、正確な電圧を
           発生させるD/Aコンバータにする事が出来るようになった。
           サンプルは、Voltage Reference機能と、FVR機能を組み合わせたものだ。
           単にSin波を発生させるだけなので、プラス側のリファレンスはFVRにする必要はなく、VDDにしても良いのだが、FVR機能のサンプル
           として使っているだけだ。
           使用したオペアンプ(NJU7032D)は、秋月電子で安価で購入できるものだが、単なるボルテージフォロアなので、レールTOレール型の
           オペアンプなら何でも良く、プログラム中の振幅を小さくすれば、安価なLM358等でも使用可能だ。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません。     

写真、回路図(100μFに並行するスイッチはOFFにしておく)

周波数カウンタとオシロスコープによる出力波形のイメージ

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン  ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン



     2.USB機能を使ってみる (1)

           USBフレームワークを使った簡単なUSBプルグラムを紹介しています。
           USBフレームワークは、USB−PICを使った場合の雛形とも言うべきサンプルプログラムで、USBの事をほとんど知らなくても、簡単に
           プログラムが作れる大変使いやすいサンプルプログラムです。

            [USBの規格]
               USB 1.0 ・・・・ 1.5MBPS(ロースピード),12MBPS(フルスピード)
               USB 2.0 ・・・・ 480MBPS(ハイスピード)
               USB 3.0 ・・・・ 5GBPS(スーパスピード)  ※専用コネクタとケーブルを使用しないと、USB2.0互換の通信速度になります

       A.CDCクラスを使ってみる

           CDCクラス(Communication Device Class)は、Windows標準のUSBでRS232シリアル通信をサポートする機能で、この機能を使うと、
           パソコン側のアプリケーションを用意しなくても、ハイパーターミナルや、従来のWin32 API等で作った簡単なアプリケーション等をそのまま活用
           する事が出来ます。
           USB・シリアル変換機能等、容易に作成できるので、RS232コネクタの無い新しいパソコンを使っている人にも、大変重宝する機能です。

       (1)パソコンにメッセージを出力する

           CDCクラスを使って、パソコンのハイパーターミナルにメッセージを出力してみた。
           といっても、マイクロチップ社から無償で提供されるUSBフレームワーク ※注1)は既に出来上がっていて、単にデバイスにPIC18F14K50
           を指定してビルドしたものをPICKIT2でデバイスに書き込んだだけでも、「Button Pressed --」というメッセージを出力するようになっている。
           サンプルは、メッセージの内容を加工しただけ(「main.c」の「ProcessIO関数」を修正したのみ)だ。
           初回接続時のみ、ドライバーのインストール先を聞いてくるので、デモ用に用意されたドライバー(「inf」フォルダーに入っている)を指定する。
           回路図のLEDは、USBステータスのモニター用で、無くても問題は無い。

           MPLABでビルドする場合、プログラムが他のフォルダーも参照しているので、ダウンロードして展開したそのままのフォルダー構成が必要だ。
           C18コンパイラーのインストール先は、ユーザーによって異なると思われるので、ライブラリのフォルダーは修正が必要(MPLABの「Project」
           ==> 「Build options」 ==> 「Project」 ==> 「Directories and Search Paths」で各Pathを修正する)だ。
           ハイパーターミナルの設定は、自動調整されるので、通信速度の指定は何でも良い。

           このサンプルはUSBコネクタでパソコンに接続し、外部からは電源を加えてはいけません



           ※注1)使用したUSBフレームワーク
            「USB Device - CDC - Basic Demo」 ==> 「CDC - Basic Demo - Firmware」中の
              「USB Device - CDC - Basic Demo - C18 - Low Pin Count USB Development Kit」を、デバイスにPIC18F14K50を指定してビルドする

写真

回路図 回路図のUSBコネクタでパソコンに接続する
このサンプルの電源はUSBから供給するので、USBコネクタの電源スイッチをONにしておき、外部からは+5Vの電源を加えてはいけません

ハイパーターミナルのイメージ

ハイパーターミナルの設定(通信速度は自動設定されるので何でも良い)
USBコネクタでPICをパソコンに接続している状態でないと、該当するCOMポートは選択できません

プロジェクトのフォルダ構成

main.c

プログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン




       (2)USB・シリアル変換器にしてみる

           CDCクラスを使って、USB・シリアル変換器にしてみた。
           RS232Cコネクタのないパソコンでマイコンの開発を行っている場合には、お馴染みの機能だ。
           このような変換器は、市販の変換ケーブルが容易に入手できるが、PIC18F14K50で作ったほうが安上がりだ。
           
           プログラムは、USBワークフレーム 注1)として、既に完成されたものがマイクロチップ社のHPよりダウンロードできるので、
           これをそのまま使用した。
           ターゲットデバイスにPIC18F14K50を指定してビルドし、マイコン(A側)に書き込んで使っている。
           デモ用に、PIC18F14K50をもう一台使って、19200BPSのエコーバックプログラムを作成した。(B側)
           USBコネクタを接続すると、(1)同様、初回接続時のみドライバーを聞いてくるので、INFフォルダーを指定する。
           ただし、(1)でインストール済みの場合はこの操作は不要だ。
           ハイパーターミナルの通信速度は19200BPSを指定する。

           このサンプルはUSBコネクタでパソコンに接続し、USB側から電源を供給するので、外部から電源を加えてはいけません。



           ※注1)使用したUSBフレームワーク
            「USB Device - CDC - Serial Emulator」 ==> 「CDC - Serial Emulator」中の
              「USB Device - CDC - Serial Emulator - C18 - Low Pin Count USB Development Kit」を、デバイスにPIC18F14K50を指定してビルドする

写真 (全体イメージ/B側のボード)

デモのイメージ

回路図のUSBコネクタでパソコンに接続する
このサンプルの電源はUSBから供給するので、USBコネクタの電源スイッチをONにしておき、外部からは+5Vの電源を加えてはいけません

ハイパーターミナルのイメージ

ハイパーターミナルの設定
USBコネクタでPICをパソコンに接続している状態でないと、該当するCOMポートは選択できません

test.c

プログラムソース(B側用)(MPLAB用 PIC18F14K50用 内部OSC16MHz使用 C言語(MPLAB C18)) バージョン

(A側)のプログラムは、マイクロチップ社のHPからダウンロードしたプログラムをそのまま使用した



       B.Genericクラスを使ってみる

           Genericクラスを使うと、USBの機能を駆使した本格的なアプリケーションを作る事ができます。
           ただし、このクラスを使いこなすには、USBの基本的な知識が必要になります。

       (1)



                 ただいま、準備中!!!!



       C.パソコン側の簡単なプログラム

           






    只今、準備中





  ●実験ボード タイプ2(PIC18F14K50)

写真

回路図
  ※注)24型のSerial−EEPには、型番が同じでも5Vで使用できない(使用電圧が異なる)があるので注意が必要です!!


     1.内臓EEP ROMを使ってみる

           内臓EEP ROM(18F14K50の内部に内蔵されているEEP ROM)をアクセスする簡単なサンプルを作ってみた。
           といっても、18F14K50のマニュアルには、サンプルプログラムの事例が記載されており、このサンプルは、マニュアルのプログラムに
           UARTを組み合わせただけのものだ。
           ハイパーターミナルから5バイトの文字を入力すると、18F14K50の内臓EEP ROMに書き込まれ、内臓EEP ROMから5バイトを
           読み込んでハイパーターミナルに出力する。
           内臓EEP ROMの書き込みには時間を要するので、WAITを入れないと正常に動作しないので、注意が必要だ。


ハイパーターミナルのイメージ

ハイパーターミナルの設定

test.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン

test.c

プログラムソース@(MPLAB用 PIC18F14K50用 C言語(C18)) バージョン





     2.I2C型(24型)Serial EEP ROMを使ってみる   ※MSSPバージョン

           I2C型Serial EEP ROM(回路図のAT24C256)をアクセスする簡単なサンプルを作ってみた。
           18F14K50には、MSSPモジュールが内蔵されており、さらにマイクロチップ社から解りやすいサンプルも提供されているので、
           これを使うとプログラムは簡単だ。
           サンプルは、ハイパーターミナルから入力した10バイトの文字をEEP ROMに書き込み、再度EEP ROMから読み込んで、
           ハイパーターミナルに出力する。
 
           18F14K50に内蔵されているMSSPは、16シリーズのSSPより機能が拡張されているもので、I2Cマスター機能も、スラブ機能も
           サポートしているものだ。

ハイパーターミナルのイメージ

ハイパーターミナルの設定

test.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン    ※準備中!!!

test.c

プログラムソース@(MPLAB用 PIC18F14K50用 C言語(C18)) バージョン

                







  ●PIC18F14K50を使った電子工作

           PIC18F14K50は、従来の16ピン16シリーズに比べて性能が高く、機能も拡張されているにも関わらず安価なので、
           16シリーズの置き換えには最適です。

     1.ロータリーエンコーダを使ってみる

           PICでオーディオ用の電子ボリュームを作るため、ロータリーエンコーダを使った簡単なサンプルを作ってみた。
           上記、実験基板を使って、ロータリーエンコーダを右に回すとLEDが右に回転し、左に回すと左に回転するものだ。
           ロータリーエンコーダは、秋月電子で安価で購入したものだ。

           このサンプルはUSBプログラムではないので、回路図のUSBコネクタでパソコンにつないではいけません

写真、回路図 

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン   ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン


     2.シリアル−パラレル変換ICで出力ポートを増設してみる

           PICは入手しやすいデバイスの種類が豊富なので、ポートの数が必要ならば、目的にあったデバイスを選択する事も
           可能なのですが、「シリアル−パラレル変換IC」を使って簡単に出力ポートを増設する事もできます。
           サンプルは、JRCのNJU3711を使って、8ビットの出力ポートを増設したもので、増設ポートにつないだLEDが回転するものです。
           このICは秋月電子で100円程度で購入できるものですが、秋月電子では、他に12ビットのNJU3714も販売されています。

写真、回路図 

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン   ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン


     3.4桁7セグメントLED式・DC電圧計(0〜20V)にしてみる

           秋月電子で購入した4桁7セグメントLED ※注1) を使って電圧計(DC 0〜20V)を作ってみた。
           このLED表示器は高輝度タイプで、写真では解り難いのですが、5mA程度の電流でも眩しいくらいの明るさがあり、色合いもきれいだ。
           このサンプルは電源を電圧の基準にしているので、精度が高い測定をするには、電源にはできるだけ精度が高い5Vを供給する必要がある。

           ※注1)「ダイナミック接続4桁緑色7セグメントLED表示器 (アノードコモン) OSL40562−IG」

写真、回路図 ※2SC1815は、もう少しIcが大きなトランジスタにした方がいい

バッテリー充電器に取り付けてみた

test1.asm

プログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン   ※ただいま準備中

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン


     4.インダクタンスメータ(10μH〜2H)にしてみる

           マイコンを使ったインダクタンスメータの作成というと、現在はフランクリン発振回路を使って、
           Cを固定し、LCの共振周波数( f[H] = 1 / 2π√(LC) )から、インダクタンスを計算で求める方法が一般的なようです。
           この方法のインダクタンスメータの製作事例は多く見られますが、精度に影響を与えるのはCの値のみで簡単ですし、無調整で
           実用的なものを作る事が出来ます。

           サンプルは表示部分を省略し、結果をパソコンのハイパーターミナルに出力するものです。
           測定端子をショートした状態で電源を入れ、LEDが点灯したら測定が出来ますので、測定端子にインダクターをつなぎます。
           インダクターは、測定方法や周囲の影響を受けやすいので、表示は安定しませんが、実験では数パーセント程度の精度で
           測定が出来るようです。
 
           ※注1)発振周波数が低いので、CMOSインバータは、74HCでも、4000系でも使用できます。
           ※注2)回路図中の33μHのインダクターは、プログラムで補正されるため、値に意味はありません。
               プログラムは、33μHと、33μH + (x)H の差分から結果を求めるようになっています。
               この値は、大きすぎると小さな値のインダクターを測定した時に誤差が大きくなりますし、小さすぎると動作しなく
               なるので、33μH〜50μH位がいいと思います。
           ※注3)回路図中の※A(0.1μF)は、精度が高いほうが望ましいのですが、テスター等で値がわかるのならば、
               プログラム中のPI_CAPの値を書き換える事で対応する事も出来ます。
               例)0.1μFの値が、実際には0.095μFの場合
                 PI_CAPを、0.000001から、0.00000095に変更する
           ※注4)周波数カウンターを持っているなら、この回路の測定回路部分のみを切り離して、周波数カウンタに入力すれば、
               PICを使わなくても単体で使用する事も出来ます。
               写真にピン(端子)が突き出しているのは、このような使い方を考えているためです。
           ※注5)測定端子に何もつないでいない場合、何も表示はされません。
           ※注6)基板の銅箔面にチップコンデンサを多用していますが、これは手持ちの部品の都合であって、性能を考えての事
               ではありません。
           ※注7)このサンプルプログラムは、1[μH]〜999[H]まで測定できるように作ってありますが、私の手持ちのコイルの都合で、
               上限は2[H]までしかテストしていません。(このような大きなコイルを入手するのは、一般には困難だと思いますし、
               測定する必要性もないとは思いますが)

写真、ハイパーターミナルのイメージ、回路図

ハイパーターミナルの設定

test1.c

プログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン


     5.LCD表示器(16文字*1行)にしてみる

           LCD表示器(16文字*1行)を使った簡単な表示器を作ってみた。
           コネクタにいろいろなセンサーボードをつないで測定値を表示するもので、上記、16F88で作ったものと
           同様な使い方をするものだ。
           ただし、なるべくポートを有効に使うため、LCDは4ビットモードで使用し、マイコンは12MHzの水晶を使って、
           PLLで48MHz動作させている。
           下記にLCDの稼動確認に使った簡単なサンプルを載せているが、これはLCDにメッセージを表示するだけのもので、
           秋月電子で300円で販売されている ※注)H22.11現在 DMC16117Aでも、S-10551Dでも使用可能だ(サンプル@)。

           サンプルAは、サンプル@をスクロール表示させるものだ。

写真(DMC16117A/S-10551D)の場合、回路図

test1.asm

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 アセンブラ(MPASM)) バージョン

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン

test1.c

サンプルプログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) スクロールバージョン





     (1)シリアルLCD表示器にしてみる

           シリアル入力のLCD表示器にしてみた。
           マイコンボードの表示器として作ったもので、入力されたキャラクタ文字をLCDにスクロール表示する。
           サンプルは、説明を簡単にするために、パソコンのハイパーターミナルにつないで、入力した文字をLCDに表示する
           ようにしてある。

ハイパーターミナルのイメージ、LCD表示器、回路図

ハイパーターミナルの設定

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (2)インダクタンスメータ(10[μH]〜10[H])にしてみる (バージョン2)

           インダクタンスメータにしてみた。
           PUSHボタンを押しながら(入力をショートした状態で)電源を入れ、「Wait 〜」の表示が消えたらボタンを離して測定端子にインダクタ
           ンスをつなぎ、測定を開始する。
           上記、UART出力で作ったインダクタンスメータのサンプルを、LCDに表示するようにしたものだ。
           精度が高い測定をするなら、回路図中の※Aの0.1μFは、なるべく精度が高いほうが良いのだが、一般的なコンデンサしかなければ、
           使用したコンデンサの値に合わせて、プログラム中の「PI_CAP」の値を変更して微調整する事もできる。
           また、回路図中の33μHのインダクターは、値に意味はなく、30〜50μH程度なら問題はない。
           
           注意)このサンプルプログラムは、1[μH]〜999[H]まで測定できるように作ってありますが、私の手持ちのコイルの都合で、上限は
           10[H]までしかテストしていません。(このような大きなコイルは、一般には入手困難だと思いますし、測定する機会も必要性も
           一般的にはないと思いますが)。

写真、回路図

インダクターをつないだ時の表示イメージ
上記のテストで使用したインダクターは、その特性等、仕様の詳細は不明ですが、誤差10パーセント程度と
思われる汎用レベルのものなので、写真の数値は参考程度です

電子インダクターのイメージ
数[H]といった大きなインダクターが入手できない場合、簡単な「電子インダクター」を作って、
コイルの代わりにこれをつないで、表示されるインダクタンス値が正しい事を確認する事もできます
電子インダクターについては、 「(別室)レトロのページ」で取り上げていく予定です


test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (3)モールス練習機にしてみる

           モールス信号のヒアリング用練習器を作ってみた。

           サンプル@は、ボタンを押すと(S1でもS2でも良い)、スピーカから任意のモールス信号を発生し、発生した文字をLCDに表示する。
           なお、ボタンは、モールス信号の発生が完全に終了してから押さないと、正常に動作しない。

           サンプルAは、回数設定ボタン(S2)をn回(0<n<17)押し、スタートボタン(S1)を押すと、任意のモールス信号をn文字発生し、
           発生した文字列をLCDに表示する。サンプル@のレベルをマスターした人向けの機能だ。
           回数設定ボタンは、しっかり押す必要がある。また、S2を17回以上押すと、モールス信号を16文字発生する。
           上限を16文字に制限したのは、このLCD表示器が16文字しか表示できないため、16文字以上出力すると最初に発生した文字が
           スクロールして画面から消えてしまうからだ。
           

写真、回路図

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン

test2.c

サンプルプログラムソースA(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (4)タイマーにしてみる

           プッシュボタン(S1/S2)で時間(分/秒)を設定すると出力がONになってカウントダウンが開始され、
           設定された時間が経過するとOFFになるタイマーを作ってみた。
           使用したMOS−FET(μPA2753GR)は、秋月電子で4個100円程度で購入できる(H22.11現在)安価なものだ。
           

写真、回路図

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (5)温度計(2〜100°C)にしてみる

           温度センサー(LM35DZ)をつないで温度計にしてみた。
           使用した温度センサー(LM35DZ)は、秋月電子で100円で購入したものだが、なかなか高精度なものだ。
           

写真、回路図

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (6)温度計(2〜100°C)にしてみる(その2)

           上記、温度計を、温度計ロガーにしてみた。
           スタートボタン(S1)を押すと1秒間隔で温度を収集し、ストップボタン(S2)を押すか、100データを収集すると停止し、
           収集した温度を表示する。
           次ボタン(S3)を押すと、次のデータを表示する。
           全てのデータの表示が終了したら、スタートボタン(S1)を押すと、再度、データの収集を開始する。
           

写真、回路図

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (7)高抵抗メータにしてみる

           オペアンプで作ったボールテージフォロアの入力抵抗は、LM324のような汎用的なものでも、数百MΩ(直流)もあるようだ。
           サンプルは、C−MOSオペアンプで作ったボールテージフォロアと、PICのA/Dコンバータを組み合わせて、数10MΩの
           高抵抗値を測定するようにしたものだ。
           ただし、実験では表示が安定せず、目安レベルにしか使えないものだった。
           

写真(10MΩの抵抗をつないだイメージ)、回路図

test1.c

サンプルプログラムソース@(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (8)ガスセンサー(においセンサー)にしてみる (その1)

           ガスセンサー(においセンサー)TGS2450をつないで、簡単な表示器にしてみた。
           このセンサーは、秋月電子で数百円で購入できるもので、最近、何かとお騒がせの硫化水素や、メチルメルカプタン、
           エタノール、アンモニア等の濃度の測定に使用するものだ。

           このセンサーのマニュアルには、電源の供給や、測定方法について説明がされているが、一般的なアナログセンサー
           のように直流電圧をくわえてしまうと、センサーが壊れてしまうので、マイコンによる電源の制御が必要になる。
           また、このセンサーは、電源投入後、数十秒〜数分しないと表示が安定しないので、注意が必要だ。
           
           サンプルは、センサー抵抗(Rs)の数値を表示するものだ。
           本当は、Rs/Roを表示したほうがいいのだが、そうすると、測定開始前にRoを入力するという、簡単ではあるが
           調整が必要になり、無調整というわけにはいかなくなるので、このような仕様にしているものだ。
           

写真(綿棒に薄いエタノール(焼酎@お酒)を染み込ませてセンサーに近づけると、数値が大きくなっている)、回路図

デジタルオシロスコープによる供給タイミングのイメージ

test1.c

サンプルプログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (9)ガスセンサー(においセンサー)にしてみる (その2)

           上記「(8)ガスセンサー(においセンサー)にしてみる (その1)」の表示をRs/Roにしたものだ。

           電源を入れると、その1同様、センサー抵抗(Rs)が表示されるので、表示が安定したらガスのない場所で、S1を押す。
           この時のタイミングで、RsがRoとしてプログラムに取り込まれ、以降、Rs/Roをパーセント表示するというものだ。
           Roを修正する時は、S2を押すと、元のRs表示画面に戻る事ができる。
           
           

写真、回路図  ※写真にあるプッシュスイッチ(S3)は、使っていない。

test1.c

サンプルプログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (10)AC電圧計(0〜1.5[V])にしてみる

           簡単な交流電圧計(0〜1500[mV]程度)にしてみた。

           この電圧計は、精度は10パーセント程度と高くはないが(使用している部品や電源回路の精度が低い事も理由にあるのですが)
           測定データを直接マイコンで処理しているので、回路が簡単で、数Hz〜数百KHz程度までのSIN波の電圧を測定することができる。
           (一般的なデジタルテスターのACレンジでは、数Hz〜数KHz程度までのSIN波しか正しく測定はできません。)
           また、計算式を変更してやれば、SIN波以外の交流電圧の測定も簡単だ。
           
           サンプル@は、一般的な交流電圧計(SIN波)だ。       ※(測定範囲は0〜1500[mV]程度)
           サンプルAは、最大振幅(PK−PK)を表示するものだ。   ※(測定範囲は0〜3000[mV]程度)
           
           

写真、回路図 (小型にするため、コンデンサは全てチップ型を使用しています)
プログラムの計算で処理をしているので、抵抗の精度は測定結果にほとんど影響を与えません。
(一般的な5%精度の抵抗を使用して、何も問題ありません)

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン

test2.c

サンプルA プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (11)AC電力計(0〜1500[W])にしてみる

           上記の交流電圧計に、計器用変流器をつないでAC100V用の電力計にしてみた。
           (似たような機能のものは、変流器以外にもいろいろあるのですが、個人的に大電流の実験で使う機会が多いので。)

           この変流器は、ラインの片方を通すだけで精度の高い大電流(100A程度)の測定ができるもので、シャント抵抗を使った電力計(電流計)のような
           電圧のロスも少なく、また、ラインを変流器に巻いてやるだけで、感度を上げる事もできる。
           サンプルは、安全で簡単に測定ができるように、変流器に家庭用のACコードの片側を通しただけのもので、ACラインの加工は簡単だが精度は
           高くはない。

           使用した変流器は、本来は100Aの大電流を5Aの電流に変換して、大電流を小型の電流計で測定するような用途で使用するものだ。
           一般に変流器の二次側に流れる電流は数Aと大きいため、二次側は電流計を直接つないでショートさせるか、低抵抗にして使わないと、
           高エネルギーの高電圧が発生して、感電したり、変流器が燃え出す可能性すらある。また、本来はアースの接地が必要なものだ。

           変流器には、最低でも必ず負荷をつなぎ、開放にはしないように注意が必要だ。        
           

写真、回路図

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (12)コンデンサ容量計(1〜10000[pF])にしてみる 

           コンデンサ容量計を作ってみた。
           100KHz、10KHz、10KHzを加えた時のコンデンサのリアクタンスを基準コンデンサのリアクタンスと比較しているもので、
            「レトロのページ」 で紹介している秋月電子の微小容量計と同じ原理のものだ。
 
           電源を投入すると測定レンジ(100pF/1000pF/10000pF)を聞いてくるので、S0で画面に選択するレンジを表示して、
           S1〜S3(測定するレンジに該当するコンデンサがつながっているボタン)を押し続け、「Selected 〜」メッセージが表示されたら、
           ボタンを離すと、数秒ほどで測定が開始される(この間に初期値の測定が行なわれているので、測定が開始されるまでは、
           測定端子には何もつながないようにする)。
           測定が開始されてから、測定端子に測定するコンデンサを接続すると、その容量が表示される。
           測定は2秒毎に繰り返し行なわれるが、測定するレンジを切り替える場合は、S0を押し続ける事で初期画面に戻る。

           測定精度は高くはないが、精度を高くするなら、基準となるコンデンサ(100pF、1000pF、10000pF)の精度はなるべく高い
           ほうが良い。実験では、100pFレンジで数パーセント、10000pFレンジで数十パーセント程度の測定精度だった。
 
           整流用ダイオードは、小容量のショットキーが必須で、秋月電子で安価で購入できるHN2S01FUを使用した。
           これ以外のダイオードを使った場合は、測定結果に著しく大きな誤差がでる(測定結果が正比例しない)可能性がある。
           平滑用の100μFのコンデンサは、この値より大きくても小さくても、測定精度が悪くなる。
           (小さすぎると平滑が不充分となり、大きすぎると、次の測定開始までに放電が完了しないため、測定結果がバラバラになる)。
     
           

写真、回路図
0.000470μF(470pF)誤差10パーセントのセラミックコンデンサを測定したイメージ
           

使い方
 

測定レンジ
            

HN2S01FUは、米粒のように小さな6ピンダイオードで、このサンプルではパラレルにして使用する

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     6.LCD表示器(16文字*2行)にしてみる

           秋月電子で購入できるオレンジ色のLCD表示器(SD1602HUOB)を使った簡単な表示器を作ってみた。
           上記、LCD表示器の表示部を2行にし、より多用途に使えるようにしたものだ。
           なるべく上記の表示器とプログラムレベルの互換性を持たせるため、4ビットモードで使用し、LCDとの接続ポートは
           同じにしてある。
           上記同様、12MHzの水晶をつないで、PLLで48MHz動作させて使用する。
           

           サンプル@は、LCDの稼動確認のために作ったもので、メッセージを表示するだけのものだ。

写真、回路図
このLCDのバックライトはオレンジ色で、小型ながら、なかなか見やすい感じだ。

sample1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン


     (1)コンデンサ容量計(1〜10000[pF])にしてみる(その1)

           上記のDMC16117A(16文字*1行)LCDで作った「(12)コンデンサ容量計(1〜10000[pF])にしてみる」を移植してみました。
           使い方は、上記の容量計と同じですが、表示が2行あれば簡単な操作説明が入れられるので、こちらの方が使いやすい感じです。
 
           測定レンジは(100pF/1000pF/10000pF)で、実験では100pFレンジは数パーセント程度の精度で使えましたが、
           10000pFレンジは数十パーセント程度の精度しかなく、目安レベルにしかなりません。
           表示がオーバーフロー(A/DコンバータがFVRの設定値を越える)すると「***・・**」が表示されます。
 
           100pF、1000pF、10000pFのコンデンサは、測定の基準になるものなので、測定精度を高くするには、なるべく精度が高い
           必要があります(測定精度は、このコンデンサの精度で決まってしまいます)。
           整流用ダイオードは、小容量のショットキーが必須で、秋月電子のHN2S01FUを使用していますが、これ以外のダイオードを
           使った場合は、測定結果に大きな誤差がでる可能性があります。
           平滑用の100μFのコンデンサは、この値より大きくても小さくても、測定精度が悪くなります。
     
           

写真、回路図
15pF(誤差10パーセント)のセラミックコンデンサを測定したイメージ
10000pFレンジの精度を高くするには、100μFのコンデンサを大きくして待機時間を長くする(プログラムを修正する)
必要があるが、そうすると、測定にかかる時間が長くなってしまって、実用的なものではなくなってしまう。
           

測定イメージ
100pFレンジについては、ある程度は使えそうだ。
           

使い方
 

測定レンジ
            

HN2S01FUは、米粒のように小さな6ピンダイオードで、このサンプルではパラレルにして使用する

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (2)コンデンサ容量計(100[pF]〜10000[μF])にしてみる(その2)

           100[pF]〜10000[μF]程度までの測定ができるコンデンサ容量計を作ってみた。
           コンデンサの時定数(放電時間)を測定しているもので、測定精度は高くはないが、大容量のコンデンサの測定には便利なものだ。
           測定レンジは10μF(100pF〜10μF)、10000μF(0.1μF〜10000μF)の2つをつけているが、測定精度は高くはないので、
           目安レベルのものだ。
           マルチテスターの容量計レンジの測定値と比較すると、測定精度は数十パーセント程度で、コンデンサの種類によっては、値が大きく
           ずれる事があるようだ(私が使っているメーカのテスターの測定値が、どれほど信用できるのかはわかりませんが)。

           使い方は、S1スイッチでレンジを選択してから電源を入れ、測定が開始されたら、測定するコンデンサをつなぐ。
           測定は2〜3秒毎(コンデンサの値により異なる)に繰り返し行なわれる。
 
           使用しているPチャンネルMOS−FETは、秋月電子で安価で購入できるもので、本当は、こんなに大きなものを使う必要はない。
         

写真、回路図
1000μFのアルミ電解コンデンサを測定したイメージ 
手持ちの部品の都合で44Ω1Wは22Ω1/2W+22Ω1/2W、100Ω1W1%は選別品です。 
           

測定イメージ@
コンデンサの種類によって、値が大きく外れる事があるようだ。
           

測定イメージA 
0.1μFのセラミックコンデンサを、マルチテスターの測定値と比較したイメージ
 

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     (3)圧力計にしてみる

            マルツパーツ館 の店頭で50円程度で販売されていた圧力センサー(FPM−02PG + 専用ボード)を使って圧力計にしてみた。
           このボードは、気体の圧力を測るもので、大気圧をヘクトパスカルで求めるようなものではないが、コンプレッサーやタイヤの空気圧
           (そんな高圧力に耐えられるのかはわからないが)等、日用的にも、いろいろ役に立ちそうだ。
           このセンサーボードの出力は、大気圧では、ほぼゼロになっている。
           
           サンプルは、1秒毎に繰り返し測定を行い、数値を表示するものだ。
           S0スイッチを押し続けると表示をホールドし、再度S0スイッチを押すと、ホールドが解除される。
           センサーの圧力導入口に自転車用の虫ゴムチューブを取り付けて、コンプレッサーにつないでテストしたイメージでは、コンプレッサーに
           つながないで虫ゴムを指で軽くつまんだだけでも、表示が振り切れてしまう(1023が表示される)ほどの高感度だったので、
           感度はプログラム中の「G_ADC_MODE」に「PI_ADCMODE_0〜2」の何れかを選択する事で変更できるようにしてある。
 
           このボードは12Vの電源が必要なので、PIC用の5V電源は、12Vの電源から5V電源レギュレタで作り出している。
           このボードの詳細については、店頭に表示があるのみなので、購入時に、店頭で書き写しておく必要がある。
           説明書の回路図にある抵抗は、このサンプルでは使用していない。
         

写真、回路図
FPM−02PGの圧力導入口に、ダイソーで購入した自転車用の虫ゴムを取り付けて、コンプレッサーにつないだ。
このセンサーボードの感度は高く、虫ゴムをつまんだだけでも数値は大きく変化するので、テストでコンプレッサーは不要だ。
PICの電源は、5VDCジャックからではなく、アダプタ基板左側の12V端子側から5Vレギュレタを通して供給する

FPM−02PGと付属ボードのピン配置図
センサーとボードのセットで、破格の50円で販売されていた。

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     7.D/Aコンバーターを使ってみる

           今では使わなくなってしまった昔のD/Aコンバーターがいろいろあるので使ってみました。


     (1)DAC0808シリーズ(8ビットパラレルD/Aコンバーター)を使ってみる [DAC0806]

           DAC0808シリーズは、D/Aコンバーターが一般的に使われるようになった初期の頃に、8ビットパラレル入力のD/A
           コンバーターとして一般的だったものです。
 
           動作に多電源が必要になりますし、電圧出力ではないので、出力にオペアンプによる変換回路が必要になる等、
           あまり使いやすいICとは思えませんが、このICは、趣味のマイコン工作の分野でも、かなり一般的に使われていたように思います。
 
           事例の回路は、データシートのサンプルを、手持ちの部品に合わせて簡略化したものですが、精度が高い必要があるなら、
           回路中の抵抗や供給電圧は、しっかりした設計が必要になります。
           マイコン側は8ビットパラレル出力するだけなので、何でも良いのですが、このサンプルでは上記のUSB実験ボードを使用しています。
           なお、このICは、DIPパッケージと、SOPパッケージでピンのレイアウトが全く異なるので、使用する場合には注意が必要です。
     
           サンプルは、0V〜5Vのフルスイングのノコギリ波(4Hz程度)を出力するものです。
           

写真、回路図
           

オシロスコープによる測定イメージ
あまり高速でスイッチングすると、ノイズが増えるかも知れません
(このサンプルは1KHzで256データをスイッチングしています)
           

このICの内部イメージ ※データシートより抜粋

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン








     8.モータードライバーを使ってみる


     (1)DRV8830(I2C・PWMモータードライバーIC)を使ってみる [DRV8830/18F14K50]

           DRV8830を使ったサンプルを作ってみました。
           このICは、秋月電子で170円(H24.11現在)で購入できるモータードライバーICで、I2C接続で同時に9個までの
           DCモーターを、正転・反転でPWM制御できます。
           小型ながら電源電圧が2.75〜6.8Vで、1Aまで使用できます。

           サンプルは、UARTでパソコンにつないで、ハイパーターミナルから、回転方向とスピードをコントロールするものです。
           例えば、正転で速度99パーセントなら、+99、反転で速度50パーセントなら、−50、停止なら+00と入力します。
           このプログラムとは関係ありませんが、大きなモーターの場合、正転からいきなり反転すると、モーターが故障したり
           電流値を越える可能性があるので、いったん停止してから反転したほうがいいかも知れません。
 
           

写真、回路図
このドライバーICは、「ISENCE」につないだ抵抗で、電流の上限を指定する事ができます。
このサンプルでは1A(0.2Ω [0.1Ω*2])にしてあります。
この抵抗値は、単に「R=0.2[V]/I[A]」で求められますが、1Ωより小さくする必要があります。
           

基板イメージ
秋月電子のモジュール基板は立てて装着できるので、機器の隙間でも入りそうです。  
         

ハイパーターミナルの入力イメージ/オシロスコープによる測定イメージ(無負荷の時)
     

ハイパーターミナルの設定 

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン



     (2)DRV8830(I2C・PWMモータードライバーIC)を使ってみる(その2)  [DRV8830/18F14K50]

           DRV8830を2つ使って、2個のDCモータをコントロールするサンプルを作ってみました。
           このICは、A0、A1ピンの設定を変更することで、同時に9個までのDCモーターを、正転・反転でPWM制御できます。

           サンプルは、UARTでパソコンにつないで、ハイパーターミナルから、2つのDCモーターの回転方向とスピードをコントロール
           するものです。
           例えば、モーターAを正転で速度99パーセントなら、A+99、モーターBを反転で速度50パーセントなら、B−50
           モーターAを停止ならA+00と入力します。
 
           

写真、回路図
           

基板イメージ
実験では、上記のI2C・EEPの実験ボードを使用していますが、今回はEEPは使用しないのでソケットから抜いてあります  
         

ハイパーターミナルの入力イメージ
     

ハイパーターミナルの設定 

test1.c

サンプル@ プログラムソース(MPLAB用 PIC18F14K50用 C言語(MPLAB C18)) バージョン












●ロジックテスター(その2)  (PIC18F14K50)

     ロジックテスターを作ってみました。
     上記で紹介している、12F1822バージョンのロジックテスターに、分周器を追加したものです。
     L/H/OFF(未接続)/クロックの4つのレベルをLEDで識別するほか、
     クロック信号に分周器を通したLEDの点滅機能を追加する事で、1〜数KHz程度の、おおよその
     周波数を目視でデバッグできます。
     
     マイコン基板の開発では、デバッグでオシロスコープやテスターを使う事が多いと思いますが、
     基板に実装された小さな部品の何箇所にもオシロのプロープの先端を当てて、オシロの画面を見ながら
     レンジを切り換えたりといった作業が、意外に大変だったので作ったものですが、
     こういう簡単なツールがあると、LEDの点滅だけで、瞬時に感覚的な判断ができます。
     こういうツールは、無駄な機能をなくした簡単なものが使いやすいようです。
     
     なお、この分周器のカウンタを動かすには、正/負のシーソー入力が必要です。
     これは、プロープの接触不良による誤カウントをなくすためです。


写真/回路図
GND端子をテストするボードのGNDにつないで、測定端子をテストするポートに接触させます。
LEDの制限抵抗を1KΩとしていますが、
これは、このMPUのI/Oポートのトータル電流が上限で50mAだからです。
但し、緑のLEDだけ、1KΩでは暗すぎるので、300Ωにしています。


LEDの点灯イメージ
注意!!! この分周カウンタの処理速度は数KHz程度しかないので、
3〜5(1/10000分周〜1/1000000分周)のLEDは、「ロジックテスター(その2)」では、
あってもほとんど意味がありません。

sample1.c

プログラムソース サンプル@ (PIC18f14K50用) MPLABX C言語(XC8)プログラム 内部OSC:16MHz

sample2.c

プログラムソース サンプル@ (PIC18f14K50用) MPLABX C言語(XC8)プログラム 内部OSC:32MHz












40ピンPIC PIC18F4550を使ってみる

マイクロチップ社のマニュアルより抜粋




  ●実験ボード タイプ1(PIC18F4550)


       簡単な実験ボードを作ってみた。

       詳細な検証をしているわけではありませんが、実験では18F4550に、MPLAB(V8.53)からPICKIT2で書き込みを行なうと、
       「Verifying Program Memory」で、「PK2Error0027 Failed verify」が発生する事があるので(一度、このエラーが発生するとPICKIT2
       では書き込みができなくなってしまう。PICKIT3からは正常に書き込みできる。)、このサンプルはPICKIT3で開発をしています。

写真と回路図


     1.基本プログラム編

       (1)ルーレットアダプタをつないでみる

           基板の稼動確認のために、PORTDにつないだ8個のLEDが1秒毎に回転するプログラムを作ってみた。
           このサンプルは、USBコネクタでパソコンにつないではいけません。
           また、24型EEPは使用しないので、ソケットから抜いておきます。
 

写真と回路図

test1.s

プログラムソース@(MPLAB用 PIC18F4550用 アセンブラ(MPLAB MPASM)) バージョン

test1.c

プログラムソースA(MPLAB用 PIC18F4550用 C言語(MPLAB C18)) バージョン

test2.s

プログラムソースB(MPLAB用 PIC18F4550用 Timer仕様 アセンブラ(MPLAB MPASM)) バージョン     ただいま、準備中!!!

test2.c

プログラムソースC(MPLAB用 PIC18F4550用 Timer仕様 C言語(MPLAB C18)) バージョン     ただいま、準備中!!!








UARTを2つ内蔵した、PIC18F25K22を使ってみる

マイクロチップ社のマニュアルより抜粋




  ●実験ボード タイプ1(PIC18F25K22)


       簡単な実験ボードを作ってみました。
       このMPUはUARTを2つ内蔵されているので、このような用途には最適だと思います。

       OSCは内蔵の16MHzを使用し、PLLで64MHz動作させています。
       サンプル@は、TIMER1モジュールと、UART1、UART2を組み合わせたもので、
       1秒毎にRC4のLEDが点滅し、UART1、UART2の両方のシリアルポートにA,B,A,B,,,,
       と文字を出力します。
       ボーレートは、115200BPSにしてあります。
       実験では、UART1、UART2の両方のシリアルポートに、何らかの機器が接続がされていれば問題はないのですが、
       仮に片方しか接続されていなくてRX1,RX2がオープンになっていると、RXn端子がノイズを拾ってしまって、
       受信割り込み処理が無限に発生する事があるので、UARTの片方しか使わない場合は、RXnを例えば10KΩ等で
       プルアップするか、プログラム中の「Init_usart関数」の中の「PIE1bits.RC1IE」、「PIE3bits.RC2IE」をゼロにして
       受信割り込み処理を止めてしまうといいと思います。
       但し、UART2は、PICKITのPGD,PGCと共通のピンになっているので、RX2をプルアップしたり、
       UART2に何らかの機器を接続したりすると、PICKITの更新処理に失敗する事があります。
       UART2の接続機器は、PICKITの更新処理中は外せるようにした方がいいかも知れません。
       
       私は、開発中でのPICKITや機器の抜き差しが面倒なので、UART2はTX2(出力)のみにしてトランジスタを接続し、
       「PIE3bits.RC2IE」はゼロにして、UART2のRX2(入力)割り込み処理を停止して、RX2側のプルアップ抵抗は
       接続しないで使っています。
       
       サンプルAは、UART1の割り込みを使ったエコープログラムです。
       上の問題はあるので、もしもUART2は使わないなら、「PIE3bits.RC2IE」はゼロにしてRX2側には何もつながない方が、
       PICKITの更新処理が楽です。
       UART2の割り込みを使ったUART2のエコープログラムにする事もできますが、この場合は、開発でPICKITや
       機器の抜き差しが必要になります。
       
       サンプルBは、ADC0〜2の値をUART1に表示するものです。
       ボーレートは、115200BPSにしてあります。

写真と回路図

サンプル@のTeraTERMのイメージ(UART1/UART2)

サンプルAのTeraTERMのイメージ(UART1)

サンプルBのTeraTERMのイメージ(UART1)

test1.c

プログラムソース@(MPLAB-X(V6.05) PIC18F25K22用 C言語(XC8 V2.41)) バージョン

test2.c

プログラムソースA(MPLAB-X(V6.05) PIC18F25K22用 C言語(XC8 V2.41)) バージョン

test3.c

プログラムソースB(MPLAB-X(V6.05) PIC18F25K22用 C言語(XC8 V2.41)) バージョン




48ピンPIC PIC18F57Q43を使ってみる


       18F57Q43は、プログラムメモリー128Kバイト、クロック64MHz、その他多くのペリフェラルを積んだ高性能なMPUです。
       これだけ高性能であるにもかかわらず、秋月電子では200円(変換基板付きで300円)※R04.03.10現在 で購入できます。

       ※注)このデバイスは、R04.3.10現在、最新のMPLABX-V6.00では、PICKIT3には対応していません。PICKIT4が必要になります。  

写真/ピンレイアウト(マイクロチップ社のマニュアルより抜粋)

デバイスデータ(マイクロチップ社のマニュアルより抜粋)

アロケーションテーブル(マイクロチップ社のマニュアルより抜粋)




       ただいま、準備中!












特殊な機能を内蔵したPICを使ってみる


    この章では、特殊な機能を内蔵したPICを使った事例を紹介しています。
    但し、紹介する機能の中には有益なものも多いため、将来はPICに一般的に内蔵される機能になるかも知れません。





  ●オペアンプを内蔵したPIC(16F785)を使ってみる


    
    
    


     1.電流計(0〜1000mA)にしてみる

           電流計を作ってみた。
           0.1Ωに発生する電圧を、内臓オペアンプで24.44倍に増幅し(5%精度の抵抗で作っているので、そんなに精密に作っていないが)、
           A/Dコンバータに入力し、パソコンのハイパーターミナルに出力する。

写真、ハイパーターミナルのイメージ、回路図

ハイパーターミナルの設定

test1.asm

プログラムソース@(MPLAB用 PIC16F785用 アセンブラ(MPASM)) バージョン


     2.導通チェッカー(0.01V、 1[mS]/100[mS])にしてみる

           導通チェッカーを作ってみた。
           テスターでは部品を痛めてしまうような耐圧の低いIC基板の導通チェックに使うもので、
           0.01V、 1[mS]/100[mS]の一瞬のパルスで測定を行い、結果を音とLEDで表示する。

           ※注)部品の耐圧は個々の部品毎に異なりますので、この条件の測定で部品が壊れないという保障はありません。

写真、回路図

ロジックアナライザーによる測定信号のイメージ

test1.asm

プログラムソース@(MPLAB用 PIC16F785用 アセンブラ(MPASM)) バージョン




  ●タッチセンサーを内蔵したPIC(12F1822/16F1938/16F1939)を使ってみる


        PIC(12F1822/16F1938/16F1939)は、静電容量方式タッチセンサモジュール(CSM)を内蔵し、
        安価ながら、従来の12F、16Fシリーズと同等か、それ以上のメモリーを積み、32MHzと高速化され、超低消費電力で、
        従来のシリーズの置き換えにも最適なPICマイコンです。


写真
    

           このPICマイコンについては、上記「8ピンPIC」、「40ピンPIC」の項を参照してください。


    
    
   




  ●KEELOQ(Code Hopping)/AFP機能を使ってみる(16F636/16F639)


        Microchip社のKEELOQは、某業界では標準として使われている機能です。
        また、PICには、AFP(Analog Front−End)といったワンチップでRF信号を扱えるものもあります。


写真


PICKIT3のつなぎ方
    




  ●実験ボード タイプ1(PIC16F636)


       簡単な実験ボードを作ってみました。

       このマイコンには、UARTやSPIといった基本的な機能がないので、これらの機能が必要な場合は、
       アセンブラで準部しておく必要があります。
       
       サンプル@は、PORTCにつないだLEDが1秒間隔で点滅するもので、プログラムの書き込みテストで使用したものです。
       内蔵OSC(8MHz)で動作させていて、電源をつなぐだけで動作しますので、説明は割愛します。
       
       サンプルAは、UARTのエコープログラムです。
       通信速度は9600BPSにしてあります。




サンプル@ LEDの点滅プログラム(接続イメージ)


サンプルA エコープログラム(接続イメージ)


サンプルA エコープログラム(実行イメージ)

sample1.asm

プログラムソース サンプル@(MPLAB用 PIC16F636用 アセンブラ(MPASM)) バージョン

sample2.asm

プログラムソース サンプルA(MPLAB用 PIC16F636用 アセンブラ(MPASM)) バージョン


    
    
   






別室、PIC作品のページもよろしく!(続々、バージョンアップ中!!)

PIC作品のページへ飛ぶ

上のボタンをクリックすると作品のページに飛びます



CPLDのページもよろしく!(いよいよオープン! 続々、バージョンアップ中!!)

CPLDのページへ飛ぶ

プログラマブルに変更ができるハードウエアであるCPLDと、コンピュータであるPICを組み合わせた、簡単な製作を
紹介しています

上のボタンをクリックするとCPLDのページに飛びます



付録(おまけ)のページもよろしく!(続々、バージョンアップ中!!)

CPLDのページへ飛ぶ

技術系雑誌の付録(おまけ)を使った、おまけのページです
付録の都合上、ここでは、PIC以外のCPUを使った製作を紹介しています。(内容は、PICと関連がありません。)

上のボタンをクリックすると付録(おまけ)のページに飛びます



Cygwinのページもよろしく!(続々、バージョンアップ中!!)

CPLDのページへ飛ぶ

WindowsXP上で動作するUnixであるCygwinのページです。
WindowsXP上での、Unixの開発を紹介しています。
市販の雑誌や書籍では、TRON系OS(μITRON)や、GNUを使ったCPUの開発記事が、しばしば紹介されて
いますが、このページでは、PIC対応のフリーのコンパイラーの実験を計画しています。ただし、現在、全くの未着手です。
そのほか、AVRのgccについて、基本操作をのせています。

上のボタンをクリックするとCygwinのページに飛びます



AVRのページもよろしく!(続々、バージョンアップ中!!)

AVRのページへ飛ぶ

AVRを使った製作のページです 。アセンブラ(AVRStudio)、C言語(gcc)、BASIC(BASCOM)のサンプルプログラムを紹介しています。
内容は、PICと関係がありません。

上のボタンをクリックするとAVRのページに飛びます



動く作品のページもよろしく!(続々、バージョンアップ中!!)

動く作品のページへ飛ぶ

CPUを使った動く工作作品のページです。
目標は、自分の意識を持った巨大ロボットを作る事です。
現在は、無償の開発ツールを使った知識データベースの実験を紹介しています。

上のボタンをクリックすると動く作品のページに飛びます



古いパソコンの活用のページもよろしく!

古いパソコンのページへ飛ぶ

スペックが古くて廃棄するしかなくなったパソコンを、解体して再利用するページです。

上のボタンをクリックすると古いパソコンのページに飛びます



ActiveBASICのページもよろしく!(続々、バージョンアップ中!!)

ActiveBASICのページへ飛ぶ

USBやRS232を使って、PICとつなぐ、Windows/XPパソコンの簡単なアプリケーションを紹介しています。
このページでは、無償で使用でき、しかも機能的にも優れている、ActiveBASICを使った事例を紹介しています。

上のボタンをクリックするとActiveBASICのページに飛びます



パソコンのパラレルポート(プリンタポート)で遊ぼうのページもよろしく!(続々、バージョンアップ中!!)

パラレルポートで遊ぼうのページへ飛ぶ

Windows/XPパソコンのパラレルポート(プリンタポート)を、パソコンのプログラムで操作した簡単な事例を紹介しています。
このページは、パソコンで、直接、外付けのハードウエアを動かすもので、組み込み型CPUとは関係がありません。

上のボタンをクリックするとパラレルポートで遊ぼうのページに飛びます



リアルタイムOSで遊ぼうのページもよろしく!(続々、バージョンアップ中!!)

リアルタイムOSで遊ぼうのページへ飛ぶ

μITRON(TRON系のOS)を使った簡単な事例を紹介しています。
TRON系のOSは、組み込み型システムにおいては、広く普及しているものです。

上のボタンをクリックするとリアルタイムOSで遊ぼうのページに飛びます



H−8で遊ぼうのページもよろしく!(続々、バージョンアップ中!!)

H−8で遊ぼうのページへ飛ぶ

ルネサステクノロジー社の8ビットCPUであるH−8を使った簡単な事例を紹介しています。

上のボタンをクリックするとH−8で遊ぼうのページに飛びます



SH−2で遊ぼうのページもよろしく!(続々、バージョンアップ中!!)

SH−2で遊ぼうのページへ飛ぶ

秋月電子で入手が可能になった、32ビットCPUであるSH−2を使った簡単な事例を紹介しています。

上のボタンをクリックするとSH−2で遊ぼうのページに飛びます



「(別室)MSP430のページ!(続々、バージョンアップ中!!)

「(別室)MSP430のページへ飛ぶ

MSP430を使った簡単な事例を紹介しています。

上のボタンをクリックすると「(別室)MSP430のページに飛びます



「(別室)M16C/R8Cで遊ぼう 」のページ(続々、バージョンアップ中!!)

「(別室)M16C/R8Cで遊ぼうのページへ飛ぶ

M16C/R8Cを使った簡単な事例を紹介しています。

上のボタンをクリックすると「(別室)M16C/R8Cで遊ぼう」のページに飛びます



計算のページもよろしく!(ただいま、準備中!!)

計算のページへ飛ぶ

PICやAVRで使う、簡単な微分、積分、代数計算等をまとめています。
知識ベースや、加速度センサーを使うために準備しているもので、内容は初心者レベルです。

上のボタンをクリックすると計算のページに飛びます



「(別室)カーアクセサリーのページ!(続々、バージョンアップ中!!)

「(別室)カーアクセサリーのページへ飛ぶ

カーアクセサリーの簡単な事例を紹介しています。

上のボタンをクリックすると「(別室)カーアクセサリーのページに飛びます



「(別室)ゲームコーナーのページ!(続々、バージョンアップ中!!)

「(別室)ゲームコーナーのページへ飛ぶ

簡単なゲームを紹介しています。

上のボタンをクリックすると「(別室)ゲームコーナーのページに飛びます



オーディオのページもよろしく!(続々、バージョンアップ中!!)

オーディオのページへ飛ぶ

楽器やステレオアンプ等のオーディオ機器を、簡単に自作してみようというコーナーです。

上のボタンをクリックするとオーディオのページに飛びます



レトロのページもよろしく!(続々、バージョンアップ中!!)

レトロのページへ飛ぶ

今では懐かしいマイコンを使わない製作のページです。
真空管、トランジスタ、ロジックICによる製作を予定しています。

上のボタンをクリックするとレトロのページに飛びます



携帯電話で遊ぼうのページもよろしく!

携帯電話で遊ぼうのページへ飛ぶ

携帯電話の簡単なアクセサリーを紹介しています。

上のボタンをクリックすると携帯電話で遊ぼうのページに飛びます



STM8Sマイコンで遊ぼうのページもよろしく!

STM8Sマイコンで遊ぼうのページへ飛ぶ

STM8Sマイコンを使った簡単な製作を紹介しています。(続々、バージョンアップ中!!)

上のボタンをクリックするとSTM8Sマイコンのページに飛びます



ARMマイコンで遊ぼうのページもよろしく!

ARMマイコンで遊ぼうのページへ飛ぶ

ARMマイコンを使った簡単な製作を紹介しています。(続々、バージョンアップ中!!)

上のボタンをクリックするとARMマイコンのページに飛びます



ジャンクボードで遊ぼうのページもよろしく!

ジャンクボードで遊ぼうのページへ飛ぶ

仕様不明のジャンクボードを使った簡単な製作を紹介しています。(続々、バージョンアップ中!!)

上のボタンをクリックするとジャンクボードで遊ぼうのページに飛びます



メニューのページ

メニュー画面のページへ飛ぶ

ページが増えたので、派手なメニュー画面を作りました。

上のボタンをクリックするとメニューに飛びます



これであきずに、次章もよろしく。。。。。。




●問い合わせ先(代表者) BYP03364@nifty.ne.jp

 ※ウイルス感染防止のため、容量の大きなもの、添付ファイルのあるもの、テキスト形式以外のメールは
全て削除されます。
 また、個々の質問については、お答えできません。

●このページは、自由にリンクしてください。