チーム1647
課題名
Number_Hit_Game
研究者名
Yusuke Iwano
Yuichiro Usami
概要
数当てゲームをする。
数字はキーボードから入力する。
最初の範囲は1~9で、レベルが上がるにつれ範囲が10ずつ増える。
「High!」が出たら、その数字は正解の数字より大きい。
「Low!」が出たら、その数字は正解の数字より小さい。
「Congratulation!!」が出たら、正解で、音が鳴る。
その後に「i」キーを入力すると音が止まり、レベルが上がる。
「h」キーを押すとヘルプモードに入り、正解と5以上離れているときは「Very ○○!!」と表示される。
もう一度「h」キーを押すと元のモードに戻る。
使用機器
・PSoC基盤 ×1
・MiniProg ×1
・スピーカー ×1
・ジャンパ × 3
・通信ケーブル × 1
ソースコード
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include <stdlib.h>
#include <stdio.h>
int SILENT=0,D=229;
int x;
int number;
int Max;
int flg;
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. char* strPtr; unsigned int adc_data; Max =9; flg = 0;
UART_CmdReset(); UART_IntCntl(UART_ENABLE_RX_INT); Counter8_WritePeriod(155); Counter8_WriteCompareValue(77); Counter8_Start(); UART_Start(UART_PARITY_NONE); M8C_EnableGInt; PWM16_1_Start(); UART_CPutString("\r\nWelcome to Number Hit Game . V1.1 \r\n");
PGA_Start(PGA_HIGHPOWER); ADCINC_Start(ADCINC_HIGHPOWER); ADCINC_GetSamples(0); while(ADCINC_fIsDataAvailable() == 0); adc_data = ADCINC_wClearFlagGetData(); srand(adc_data); number = 1 + (int)(rand() * (Max - 1 + 1.0)/(1.0 + RAND_MAX));
while(1){ if(UART_bCmdCheck()){ if(strPtr = UART_szGetParam()){ UART_CPutString("Enter Number = >"); UART_PutString(strPtr); x = atoi(strPtr); if(*strPtr == 'h'){ flg = (flg + 1) % 2; if (flg == 1) UART_CPutString("<\r\n\nHelp Mode!!\r\n"); else UART_CPutString("<\r\n\nNormal Mode!\r\n"); } else if(*strPtr == 'i'){ UART_CPutString("<\r\n\nLevel up!!\r\n"); PWM16_1_WritePeriod(SILENT); } else if(number == x){ UART_CPutString("<\r\nCongratulation!! Press key i !\r\n"); PWM16_1_WritePeriod(D); Max = Max + 10; number = 1 + (int)(rand() * (Max - 1 + 1.0)/(1.0 + RAND_MAX)); } else if(number > x){ if (number - x >= 5 && flg == 1) UART_CPutString("<\r\nVery Low!!\r\n"); else UART_CPutString("<\r\nLow!!\r\n"); } else if(number < x){ if (x - number >= 5 && flg == 1) UART_CPutString("<\r\nVery High!!\r\n"); else UART_CPutString("<\r\nHigh!!\r\n"); } } UART_CmdReset(); } }
}
考察
pwm_uart_2とlab3_adcを参考にした。
乱数のシードとして、C言語のtime関数を使おうとしたがPSoCでは使うことができなかった。そのため、乱数のシードをAD変換で得られる連続的な電圧の値から取り出したことで、VRを回すと生成される乱数のパターンを変えることができた。乱数のシードとして他に光センサーや温度センサーの値を使っても異なる乱数のパターンを作成できると思った。
pwm_uart2の回路にlab3_abcの回路を付け加えると異なるVRの値は得られたが、ドの音が正しく出なくなってしまった。クロックの値を次のように調節することで、乱数の生成とドの音程を正しく処理することができた。正解の音はドの音が出るだけだが、Timerなどを使って音楽を鳴らしたらより面白くなったもしれない。
変更前
VC1 = 1
VC2 = 16
VC3 Source = VC2
VC3 Divider = 25
Sysclk Source = 24MHz
変更後
VC1 = 8
VC2 = 16
VC3 Source = VC1
VC3 Divider = 50
Sysclk Source = 24MHz
- 最終更新:2016-11-22 14:29:22