2011年03月25日

PICでMIDI信号送信

一応動作確認OKなので、自分のメモとしても記録したいと思い、こっちのブログに書きます。


MIDIとは何かというところは省略します。
知識ゼロからMIDIを調べて、色々と人に教えてもらい、書籍を読み、なんとかここまで来ました。

仕様は凄く単純。
ボタンが3つあって、MIDIフットコントローラーの役割をします。



使用言語はC言語、MikroC_PROです。
PICは16F88です。
内部クロック8Mhz。

ハード側の回路図は。。。
pic_midi_kairozu01.jpg

単純です。


以下プログラムソース。
(全角スペースを消してください)
======================================================
void btn_on1(){ //プログラムチェンジ
//チャンネル:1 プログラム01 とする

PORTB=0b00000000;//LEDの初期化
PORTB=0b00000001;//LED点灯させます。
UART1_Write(0xC0);
while(!UART1_Tx_Idle());
UART1_Write(0x00);//0=1
delay_ms(200);
}

void btn_on2(){ //プログラムチェンジ
//チャンネル:1 プログラム02 とする

PORTB=0b00000000;//LEDの初期化
PORTB=0b00000010;//LED点灯させます。
UART1_Write(0xC0);
while(!UART1_Tx_Idle());
UART1_Write(0x01);//01=2
delay_ms(200);
}

void btn_on3(){ //プログラムチェンジ
//チャンネル:1 プログラム03 とする

PORTB=0b00000000;//LEDの初期化
PORTB=0b00001000;//LED点灯させます。
UART1_Write(0xC0);
while(!UART1_Tx_Idle());
UART1_Write(0x02);//02=3
delay_ms(200);
}

void main()
{
OSCCON=0x070;//内部クロック8Mhz使用
ANSEL=0b00000000;
TRISA=0b00011100; //RA2,3,4を入力にする
TRISB=0b00000000; //RBはすべて出力

PORTB=0b00100000; //TX(RB5)は常時ON(MIDI信号待機状態はONです)

UART1_Init(31250);//UARTの初期設定

delay_ms(200); //起動時はプログラム1を選択
PORTB=0b00000000;//LEDの初期化
PORTB=0b00000001;//LED点灯させます。
UART1_Write(0xC0);
while(!UART1_Tx_Idle());
UART1_Write(0x00);//0=1
delay_ms(200);

while(1)
{
if(Button(&PORTA,2,1,1)) btn_on1(); //RA2を押した時にLED_on1を実行
if(Button(&PORTA,3,1,1)) btn_on2(); //RA3を押した時にLED_on2を実行
if(Button(&PORTA,4,1,1)) btn_on3(); //RA4を押した時にLED_on3を実行
}
}

================================================================

ここまで。

自分がぶち当たった壁
1.PICのUART機能
2.PICのTXから出力されたMIDI信号をバッファリングすること。

その他たくさん分からなかった事がありましたが、やっぱりPICのUART機能と信号のバッファリングが一番悩んだ。。。

という事で、LOOP機能なんかも加え色々と実験を継続していきたいです。

posted by 絵乃@櫻組 at 14:35| 秋田 ☁| Comment(4) | TrackBack(0) | PICの勉強 | このブログの読者になる | 更新情報をチェックする

2010年03月08日

C言語 配列について

7セグLEDの実験


7セグLEDは7つのLEDから出来ているので、数字を表示させるには複数のLEDを光らせ数字のように表示させます。

そこで0〜9までの表示させたい数字(PORTBの出力)を予め変数に格納し、表示させたいときにその変数を指定してあげれば良いワケだ。

 int seg[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x67 };

と、このようにすれば、seg[0]には[0x3f]が、seg[1]には[0x06]が格納されることになり、7セグLEDに6を表示させたいときは、seg[6]とすれば 0x7d が指定され、PORTBは01111101となり、出力端子に繋がったLEDを光らせ「6」と表示されることになる。

実験してませんが、これは便利そうです。
posted by 絵乃@櫻組 at 16:39| 秋田 ☁| Comment(4) | TrackBack(0) | PICの勉強 | このブログの読者になる | 更新情報をチェックする

2010年02月25日

C言語

PICの言語でアセンブラ言語とC言語、この2つどっちが良いか、分かり易いか。
自分の勉強しているネットや書籍にはアセンブラ言語で書かれた物が多くありましたので、最初はアセンブラでやってました。

が、色々と学んでいくうちにアセンブラよりC言語の方が分かりやすく、プログラムしていて楽、そんなことで今はC言語にて進めています。

このブログには豆知識的なことも書いて、自分のノート代わりにしたいと思ってます。
もしご覧になって間違って理解しているところなどがありましたらご指摘頂けたら嬉しいです。

<今日の豆知識>

シフト演算子

ビット演算子、数値の各ビットを左又は右へシフトさせるための演算子。

 <<= //左へシフト
 >>= //右へシフト

a = a <<= 2 //aを左に2ビットシフトさせる。

aが[00000001]であれば、[000001000]となるわけです。

これ、凄く使える演算子なんです。

8つ並んだLEDを流れるように点灯させるとか、すごく使えます。



※mixiで勉強させてもらっているネタが主になるかと・・・
posted by 絵乃@櫻組 at 09:47| 秋田 | Comment(2) | TrackBack(0) | PICの勉強 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。