S3MIPS/プログラミングの例
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[S3MIPSシステム]]
*S3MIPSシステムプログラミングの例 [#oc43b911]
S3MIPSシステム上で動くプログラムの開発方法。
----
#contents
**Hello Worldを表示するプログラム [#m08bd071]
まずは、Hello WolrdをLCDに表示するプログラムを動かしてみましょう。~
~
S3MIPSシステムは通常のCプログラミングで使えるライブラリ類は用意されていないので、~
文字列の表示を行う際に使うprintf関数などは使用できません。~
さらにchar型を扱えないので、文字列もint型として扱う必要があります。~
~
LCDに表示するために今回はS3MIPSシステムAPIに用意されているdisplay_lcd関数を使用します。~
display_lcdはLCDの好きな場所に1文字のキャラクタを表示することができます。~
表示するキャラクタはキャラクタコードで指定する必要がありますが、~
基本的な文字列はint型でキャストしてあげることで、キャラクタコードを関数に渡すことができます。~
~
DE2ボードにS3MIPSシステムの回路を書き込んだときに、LCDは自動的に初期化されないので、~
LCDの初期化ルーチンであるinitialize_lcd関数を最初に呼び出します。
***使用するAPI [#w6b5d9ff]
-display_lcd(int lcd_num, int val)
--lcd_num番目にvalで指定したキャラクタコードを表示する。
-initialize_lcd()
--LCDを全て空白で初期化する。
***ソースコード [#wdfd6a23]
///////////////////////////////////////
/// Hello Worldを表示するプログラム ///
///////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
int main(void){
// LCDを初期化
initialize_lcd();
// キャラクタをLCDに表示
display_lcd(0, (int)'H');
display_lcd(1, (int)'e');
display_lcd(2, (int)'l');
display_lcd(3, (int)'l');
display_lcd(4, (int)'o');
display_lcd(6, (int)'W');
display_lcd(7, (int)'o');
display_lcd(8, (int)'r');
display_lcd(9, (int)'l');
display_lcd(10, (int)'d');
return 0;
}
***動作例 [#c667da54]
CENTER:&ref(hello_world.jpg);
**バブルソートの動作を確認するプログラム [#r4d82092]
バブルソートのプログラムを実行してみましょう。~
Cプログラミングの基礎と、前回説明したAPIのLCD表示関数を利用すれば、簡単に記述できるプログラムです。~
~
今回、新しく使用するAPIの関数はdisplay_lcd_with_hex関数です。~
display_lcd_with_hex関数は、LCDの好きな場所に1文字のキャラクタを表示するという動作は同じですが、~
表示させる値が0-15(0x0-0xf)の1桁の16進数で表せる値をキャラクタコードに変換して表示することができます。~
~
数字を表示させたいけれど、キャラクタコード変換が面倒な場合に便利だと思います。
***使用するAPI [#o1d14d39]
-display_lcd_with_hex(int lcd_num, int hex)
--lcd_num番目にhexの16進数値をキャラクタコードに変換し表示する。
***ソースコード [#fe0a0231]
//////////////////////////////
/// バブルソートプログラム ///
//////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// バブルソート関数
void sort(int x[], int n) {
int i, j;
int tmp;
for(i = 0; i < n-1; i++) {
for(j = n-1; j > i; j--) {
if(x[j-1] > x[j]) {
tmp = x[j];
x[j] = x[j-1];
x[j-1] = tmp;
}
}
}
}
int main(void) {
int i;
int n = 8;
int a[n];
// LCDを初期化
initialize_lcd();
// 初期値生成
for(i = 0; i < n; i++)
a[i] = n-i;
// 初期値をLCDに表示
for(i = 0; i < n; i++)
display_lcd_with_hex(i, a[i]);
sort(a, n);
// ソート結果をLCDに表示
for(i = 0; i < n; i++)
display_lcd_with_hex(i+16, a[i]);
return 0;
}
***動作例 [#a6c82919]
CENTER:&ref(sort.jpg);
**割り込みを用いてカウントアップするプログラム [#oa147023]
DE2ボードについている入力デバイスを使って割り込みを発生させ、~
割り込みに応じた動作をするプログラムを動かしてみましょう。~
~
目標とするプログラムは、プッシュスイッチを押す度に、セブンセグメントLEDの値が増える簡単なカウントアッププログラムです。~
~
割り込みにはDE2ボードの右下にあるプッシュスイッチを使用します。~
今回は右から2番目のKEY1を使用します。
CENTER:&ref(push_switch.jpg);
形状はボードによって異なる場合があります。~
~
まずは、割り込みが起きたときに呼び出す関数を記述します。~
この関数をKEY1割り込みが起きたときに呼び出す関数である割り込みハンドラに登録するためには、~
set_key1_interrupt_hanler関数を使用します。~
~
また、KEY1割り込みを有効にするために、key1_interrupt_enable関数をコールします。~
これで割り込みが起きる度に、登録した関数を実行します。~
~
なお、この2つの動作は、set_key1_interrupt関数を用いることで、同時に実現できます。~
具体的な動作は、割り込みハンドラを登録し、KEY1割り込みを許可するという処理になります。~
~
今回のサンプルでは2つに分けて記述しましたが、1行で記述してしまうこともできます。
***使用するAPI [#wab24a47]
-display_sevenseg(int led_num, int val);
--led_num番目にvalの値を16進数値で表示する。
-set_key1_interrupt_handler(unsigned int func);
--KEY1プッシュスイッチ割り込みのハンドラを登録する。
-key1_interrupt_enable();
--KEY1プッシュスイッチ割り込みを有効にする。
***ソースコード [#gc84334e]
//////////////////////////////////////////////////////////////
/// プッシュスイッチ割り込みでカウントアップするプログラム ///
//////////////////////////////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// カウント用変数
int count = 0;
void count_up(void) {
// カウントアップ
count++;
// セブンセグメントLEDに表示
display_sevenseg(0, count);
}
int main(void){
// KEY1プッシュスイッチ割り込みハンドラに関数を登録
set_key1_interrupt_handler(count_up);
// KEY1プッシュスイッチ割り込みを有効にする
key1_interrupt_enable();
return 0;
}
***動作例 [#m735f586]
割り込みを起こす度に、カウントアップしていきます。
CENTER:&ref(S3MIPS/プログラミングの例/count_up_0.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_1.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_2.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_3.jpg,50%);
**タイマ割り込みを用いてカウントアップするプログラム [#k07ded24]
プッシュスイッチ割り込みで作ったプログラムは、スイッチを押す度に指定した関数を動かすというものでした。~
S3MIPSシステムでは、ある周期ごとに割り込みを起こすタイマがあります。~
これを用いることで、自動的に動作を繰り返すプログラムを実現することができます。~
~
割り込み許可や、割り込みハンドラの指定方法などは、プッシュスイッチ割り込みと変わりません。~
そのための関数として、timer_interrupt_enableやset_timer_interrput_handlerが用意してあります。
ただし、タイマはどんな周期で割り込みを起こすかを指定する必要があります。~
そのための関数はset_timer_init_valueで、何クロックごとに割り込みを起こすかが指定できます。~
~
S3MIPSシステムの動作周波数は27MHzなので、27,000,000を指定すると、1秒ごとに割り込みを起こすようになります。~
割り込みの周期を変えたい場合は、この値を基準として設定すると良いでしょう。~
~
また、割り込み許可を行った後、タイマのカウントをスタートさせるには、run_timer関数を実行する必要があります。
***使用するAPI [#ed114372]
-set_timer_interrupt_handler(unsigned int func);
--タイマ割り込みのハンドラを登録する。
-set_timer_init_value(unsigned int func);
--タイマの初期値を設定する。
-timer_interrupt_enable();
--タイマ割り込みを有効にする。
-run_timer();
--タイマを動作させる。
***ソースコード [#y1533b25]
////////////////////////////////////////////////////
/// タイマ割り込みでカウントアップするプログラム ///
////////////////////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// カウント用変数
int count = 0;
void count_up(void) {
// カウントアップ
count++;
// セブンセグメントLEDに表示
display_sevenseg(0, count);
}
int main(void){
// タイマ割り込みハンドラに関数を登録
set_timer_interrupt_handler(count_up);
// タイマの初期値を設定
set_timer_init_value(27000000);
// タイマ割り込みを有効にする
timer_interrupt_enable();
// タイマを動作させる
run_timer();
return 0;
}
***動作例 [#vfc54d5d]
割り込みを用いてカウントアップするプログラムと同じような動作になります。
終了行:
[[S3MIPSシステム]]
*S3MIPSシステムプログラミングの例 [#oc43b911]
S3MIPSシステム上で動くプログラムの開発方法。
----
#contents
**Hello Worldを表示するプログラム [#m08bd071]
まずは、Hello WolrdをLCDに表示するプログラムを動かしてみましょう。~
~
S3MIPSシステムは通常のCプログラミングで使えるライブラリ類は用意されていないので、~
文字列の表示を行う際に使うprintf関数などは使用できません。~
さらにchar型を扱えないので、文字列もint型として扱う必要があります。~
~
LCDに表示するために今回はS3MIPSシステムAPIに用意されているdisplay_lcd関数を使用します。~
display_lcdはLCDの好きな場所に1文字のキャラクタを表示することができます。~
表示するキャラクタはキャラクタコードで指定する必要がありますが、~
基本的な文字列はint型でキャストしてあげることで、キャラクタコードを関数に渡すことができます。~
~
DE2ボードにS3MIPSシステムの回路を書き込んだときに、LCDは自動的に初期化されないので、~
LCDの初期化ルーチンであるinitialize_lcd関数を最初に呼び出します。
***使用するAPI [#w6b5d9ff]
-display_lcd(int lcd_num, int val)
--lcd_num番目にvalで指定したキャラクタコードを表示する。
-initialize_lcd()
--LCDを全て空白で初期化する。
***ソースコード [#wdfd6a23]
///////////////////////////////////////
/// Hello Worldを表示するプログラム ///
///////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
int main(void){
// LCDを初期化
initialize_lcd();
// キャラクタをLCDに表示
display_lcd(0, (int)'H');
display_lcd(1, (int)'e');
display_lcd(2, (int)'l');
display_lcd(3, (int)'l');
display_lcd(4, (int)'o');
display_lcd(6, (int)'W');
display_lcd(7, (int)'o');
display_lcd(8, (int)'r');
display_lcd(9, (int)'l');
display_lcd(10, (int)'d');
return 0;
}
***動作例 [#c667da54]
CENTER:&ref(hello_world.jpg);
**バブルソートの動作を確認するプログラム [#r4d82092]
バブルソートのプログラムを実行してみましょう。~
Cプログラミングの基礎と、前回説明したAPIのLCD表示関数を利用すれば、簡単に記述できるプログラムです。~
~
今回、新しく使用するAPIの関数はdisplay_lcd_with_hex関数です。~
display_lcd_with_hex関数は、LCDの好きな場所に1文字のキャラクタを表示するという動作は同じですが、~
表示させる値が0-15(0x0-0xf)の1桁の16進数で表せる値をキャラクタコードに変換して表示することができます。~
~
数字を表示させたいけれど、キャラクタコード変換が面倒な場合に便利だと思います。
***使用するAPI [#o1d14d39]
-display_lcd_with_hex(int lcd_num, int hex)
--lcd_num番目にhexの16進数値をキャラクタコードに変換し表示する。
***ソースコード [#fe0a0231]
//////////////////////////////
/// バブルソートプログラム ///
//////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// バブルソート関数
void sort(int x[], int n) {
int i, j;
int tmp;
for(i = 0; i < n-1; i++) {
for(j = n-1; j > i; j--) {
if(x[j-1] > x[j]) {
tmp = x[j];
x[j] = x[j-1];
x[j-1] = tmp;
}
}
}
}
int main(void) {
int i;
int n = 8;
int a[n];
// LCDを初期化
initialize_lcd();
// 初期値生成
for(i = 0; i < n; i++)
a[i] = n-i;
// 初期値をLCDに表示
for(i = 0; i < n; i++)
display_lcd_with_hex(i, a[i]);
sort(a, n);
// ソート結果をLCDに表示
for(i = 0; i < n; i++)
display_lcd_with_hex(i+16, a[i]);
return 0;
}
***動作例 [#a6c82919]
CENTER:&ref(sort.jpg);
**割り込みを用いてカウントアップするプログラム [#oa147023]
DE2ボードについている入力デバイスを使って割り込みを発生させ、~
割り込みに応じた動作をするプログラムを動かしてみましょう。~
~
目標とするプログラムは、プッシュスイッチを押す度に、セブンセグメントLEDの値が増える簡単なカウントアッププログラムです。~
~
割り込みにはDE2ボードの右下にあるプッシュスイッチを使用します。~
今回は右から2番目のKEY1を使用します。
CENTER:&ref(push_switch.jpg);
形状はボードによって異なる場合があります。~
~
まずは、割り込みが起きたときに呼び出す関数を記述します。~
この関数をKEY1割り込みが起きたときに呼び出す関数である割り込みハンドラに登録するためには、~
set_key1_interrupt_hanler関数を使用します。~
~
また、KEY1割り込みを有効にするために、key1_interrupt_enable関数をコールします。~
これで割り込みが起きる度に、登録した関数を実行します。~
~
なお、この2つの動作は、set_key1_interrupt関数を用いることで、同時に実現できます。~
具体的な動作は、割り込みハンドラを登録し、KEY1割り込みを許可するという処理になります。~
~
今回のサンプルでは2つに分けて記述しましたが、1行で記述してしまうこともできます。
***使用するAPI [#wab24a47]
-display_sevenseg(int led_num, int val);
--led_num番目にvalの値を16進数値で表示する。
-set_key1_interrupt_handler(unsigned int func);
--KEY1プッシュスイッチ割り込みのハンドラを登録する。
-key1_interrupt_enable();
--KEY1プッシュスイッチ割り込みを有効にする。
***ソースコード [#gc84334e]
//////////////////////////////////////////////////////////////
/// プッシュスイッチ割り込みでカウントアップするプログラム ///
//////////////////////////////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// カウント用変数
int count = 0;
void count_up(void) {
// カウントアップ
count++;
// セブンセグメントLEDに表示
display_sevenseg(0, count);
}
int main(void){
// KEY1プッシュスイッチ割り込みハンドラに関数を登録
set_key1_interrupt_handler(count_up);
// KEY1プッシュスイッチ割り込みを有効にする
key1_interrupt_enable();
return 0;
}
***動作例 [#m735f586]
割り込みを起こす度に、カウントアップしていきます。
CENTER:&ref(S3MIPS/プログラミングの例/count_up_0.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_1.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_2.jpg,50%); &ref(S3MIPS/プログラミングの例/count_up_3.jpg,50%);
**タイマ割り込みを用いてカウントアップするプログラム [#k07ded24]
プッシュスイッチ割り込みで作ったプログラムは、スイッチを押す度に指定した関数を動かすというものでした。~
S3MIPSシステムでは、ある周期ごとに割り込みを起こすタイマがあります。~
これを用いることで、自動的に動作を繰り返すプログラムを実現することができます。~
~
割り込み許可や、割り込みハンドラの指定方法などは、プッシュスイッチ割り込みと変わりません。~
そのための関数として、timer_interrupt_enableやset_timer_interrput_handlerが用意してあります。
ただし、タイマはどんな周期で割り込みを起こすかを指定する必要があります。~
そのための関数はset_timer_init_valueで、何クロックごとに割り込みを起こすかが指定できます。~
~
S3MIPSシステムの動作周波数は27MHzなので、27,000,000を指定すると、1秒ごとに割り込みを起こすようになります。~
割り込みの周期を変えたい場合は、この値を基準として設定すると良いでしょう。~
~
また、割り込み許可を行った後、タイマのカウントをスタートさせるには、run_timer関数を実行する必要があります。
***使用するAPI [#ed114372]
-set_timer_interrupt_handler(unsigned int func);
--タイマ割り込みのハンドラを登録する。
-set_timer_init_value(unsigned int func);
--タイマの初期値を設定する。
-timer_interrupt_enable();
--タイマ割り込みを有効にする。
-run_timer();
--タイマを動作させる。
***ソースコード [#y1533b25]
////////////////////////////////////////////////////
/// タイマ割り込みでカウントアップするプログラム ///
////////////////////////////////////////////////////
// APIヘッダをインクルード
#include "./lib/de2_mips.h"
// カウント用変数
int count = 0;
void count_up(void) {
// カウントアップ
count++;
// セブンセグメントLEDに表示
display_sevenseg(0, count);
}
int main(void){
// タイマ割り込みハンドラに関数を登録
set_timer_interrupt_handler(count_up);
// タイマの初期値を設定
set_timer_init_value(27000000);
// タイマ割り込みを有効にする
timer_interrupt_enable();
// タイマを動作させる
run_timer();
return 0;
}
***動作例 [#vfc54d5d]
割り込みを用いてカウントアップするプログラムと同じような動作になります。
ページ名: