PIC-12F675 デジタル ステレオレベルメーター

もどる

総工費 500円で
4ピンで6個のLEDをダイナミック点灯、ゴージャスな レベルメータができる。
高級ラジオとよく似合います。 
BGMはBOSE のAUXで鳴らします。

接続する機器によって入力レベルの確認ができなかったので、少々不便であるのと、何か視覚的に
変化がほしいと制作しました。

4ピンで6個のLEDをどう光らせるかを考えるに1日を要しましたが、制作はのんびり2時間程度
箱は100円ダイソー製 サーとー電気で販売している 実験基盤 抵抗8個100Ω LED12個
RCAジャック、SW、ACアダプターはゴミあさり品 3端子レギレター付きで 8V〜24VまでOK

見ているだけでも何か愉快な感じ 夜間は少々 明るすぎるので 夜間用に照度を落とすように
プログラムを変更しようかともおもってます。 入力専用のピンが未使用ですからここにタクトSW
を付け 夜間用に プログラムの変更も可能です。
尚、入力の取得はプリアンプ 40歳のLUX A804のREC端子からとりましたが、二股に分けて
とっても良いのです。
とにかく、PICというモノは便利なモノです。

/* 以下ソース

  MPLAB 8.30 HI−TECH C 9.8
いろいろコピペなので、よけいな説明または間違った説明もありますが無視してください。
PC CDの出力は最大で2V程度なので 直接入力しても問題はなく
PICの入力IMPが高いので 音質に影響を与えません。気になる場合は適当な
C(コンデンサー)デモ入れてください。
下の文章をコピペしてください。

*/





/****************************************************************

***************************************************************/
#include <pic.h> //標準の関数セット利用
#include <htc.h> // delay用に必要

#define _XTAL_FREQ 4000000 // 周波数の指定 delay用に必要(クロック4MHzを指定)

// メモリを保護しない(UNPROTECT):外部リセット信号は使用せずにデジタル入力(GP3)ピンとする(MCLRDIS)
// 電源電圧降下常時監視機能ON(BOREN):電源ONから72ms後にプログラムを開始する(PWRTEN)
// ウオッチドックタイマ無し:内部クロック4MHz使用する(INTIO)
// MCLRDIS を書き込まないとGP3=0でリセットがかかる。 プルアップ必要。ICの仕様
__CONFIG(UNPROTECT & MCLRDIS & BOREN & PWRTEN & WDTDIS & INTIO) ;



// アナログ値の入力処理
unsigned int adconv()//関数として宣言か?*****************************
{
int i; //8ビットの桁数指定の変数宣言
unsigned int temp; //10Bitであるため桁数を増やす

GODONE = 1 ; // PICにアナログ値読取り開始を指示
while(GODONE) ; // PICが読取り完了するまで待つ
temp = ADRESH ; // PICは読取った値をADRESHとADRESLのレジスターにセットする
temp = ( temp << 8 ) | ADRESL ; // 10ビットの分解能力です.
return temp ;
}
//*****************************ここまでが関数?
// メインの処理
void main()
{

unsigned int num =0 ; //電圧記入用変数


CMCON = 0x07 ; // コンパレータは使用しない
ANSEL = 0b00001000 ; //AN1. 指定 アナログピンの指定は右から0〜3間での4本**注意**より左はクロックの指定
/* アナログピンは4本しかないのでGPの番号に関係なく4bitで指定。
GP4(AN3)を入力としてし
プリスケラーは最速指定のは 000 一番左は無関係 
000:FOSC/2 001:FOSC/8  010:FOSC/32
                 100:FOSC/4 101:FOSC/16 110:FOSC/64この設定で速度Fosc/8(2.0us)、*/
ADCON0 = 0b10001101 ; // アナログ変換情報設定 AN3 を指定圧 2bit2桁で指定。
__delay_us(10) ; // アナログ変換情報が設定されるまでとりあえず待つ桁数が少ない場合は短い時間で
TRISIO = 0b00010000 ; // gp4 入力その他のピンは出力に割当てる*ピンの列び順で指定 
//GP3は入力専用であるからここでの指定無視される。
GPIO = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
GPIO=0; //これを入れないと6番つきっぱなしだぞ。
ADCON0 = 0b10001101 ; // アナログ変換情報設定 AN3 を指定圧 2bit2桁で指定。
__delay_us(20) ; // アナログ変換情報が設定されるまでとりあえず待つ桁数が少ない場合は短い時間で
while(1) {
// 動作するようである。 指定は20us程度といってる。
num = adconv() ; // AN3から電圧を読み込んでNUM代入 数値を2倍にした方がいいかも
GPIO=0;   //GP1、2はしょっちゅうつくので最低にするもあまり大きな変化無しだった。
       //従って、途中にGPIO=0を入れて強制消灯させた。

if (num>2 && num<25 ) //以下実際に点灯させて良い調子の所を選んだ

{
GPIO=0b00000001 ;
asm("nop");//__delay_us(1) ;
}


if (num>25 && num<=35)
{
GPIO=0b00000001 ;
__delay_us(1) ;
GPIO=0b00100110 ;
__delay_us(20) ;
}
if (num>35 && num<=45)
{
GPIO=0b00000001 ;
__delay_us(1) ;
GPIO=0b00100110 ;
__delay_us(10) ;
GPIO=0b00000011 ;
__delay_us(50) ;


}
if (num>45 && num<=55)
{
GPIO=0b00000001 ;
__delay_us(1) ;
GPIO=0b00100110 ;
__delay_us(10) ;
GPIO=0b00000011 ;
__delay_us(50) ;
GPIO=0b00100100 ;
__delay_us(50) ;
}
GPIO=0;
if (num>55 && num <=65)
{
GPIO=0b00000001 ;
//__delay_us(1) ;
GPIO=0b00100110 ;
__delay_us(10) ;
GPIO=0b00000011 ;
__delay_us(50) ;
GPIO=0b00100100 ;
__delay_us(50) ;
GPIO=0b00000111 ;
__delay_us(100) ;
}
if (num>65)
{
GPIO=0b00000001 ;
__delay_us(1) ;
GPIO=0b00100110 ;
__delay_us(10) ;
GPIO=0b00000011 ;
__delay_us(50) ;
GPIO=0b00100100 ;
__delay_us(50) ;
GPIO=0b00000111 ;
__delay_us(100) ;
GPIO=0b00100000 ;
__delay_us(180) ;

}
}
}




































プログラムソース

実体配線図
昔はFCZ基盤といっていましたが、現在入手可能なのはサトー電気だけでしょう。