チーム1621(46/48)
課題名
ストップウォッチ
研究者名
2-15-48 Hiroki Hara
2-15-46 Sinntarou Nishiyama
概要
分と秒を表示できるストップウォッチ。
1分たつと音で知らせてくれる。またSWをおすと秒数のカウントがとまり、
STOPと表示される。
使用器具
PSoC
スピーカー
ジャンパ線 1本
USB2
PSoC MiniProg
仕様
#include <m8c.h> // part specific constants and macros
#include <stdlib.h>
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#pragma interrupt_handler myISR
#define SW 0b00010000
int PW=125; // Pulse Width
int SILENT=0, D=229/12; //Scale
int TC=0; // Time Count
int x=0,y=0,flag=0,flag1=0,flag2=0,flag3=0;
char *m,*s;
void myISR(void)
{
if(flag==0){ TC++; PWM16_WritePulseWidth(PW); if(TC>=1){ LCD_Init(); LCD_Position(0,0); x=csprintf(m, "%d", TC/60); LCD_PrString(m); LCD_PrCString(":"); y=csprintf(s, "%d", TC%60); LCD_PrString(s); } if((TC!=0) && (TC%60==0)){ PWM16_WritePeriod(D); } if(TC%60==1)PWM16_WritePeriod(SILENT); } else{ if(flag1==1){ LCD_Position(1,0); LCD_PrCString("STOP"); flag1=0; } }
}
void main(void)
{
// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts // Insert your main routine code here. LCD_Start(); LCD_Position(0,0); LCD_PrCString("0:0") M8C_EnableGInt; PWM16_Start(); Timer16_EnableInt(); Timer16_Start(); PRT1DR &= (~SW); while(1){ if(PRT1DR&SW){ if(flag3==0){ flag1=1; flag2++; } flag++; PRT1DR &= (~SW); if(flag2==2){ flag2=0; } } else{ flag3=0; if(flag2==0){ flag=0; PRT1DR &= (~SW); } else{ flag++; } } }
}
考察
timer_pwm2とgpio_pollとhello_worldとnoodle timerを参照した。
工夫した点はSWをおすことで、タイマーのカウントがとまりSTOPと表示され、また押すと再びカウントが始まる点である。
しかし、SWを押しても反応しなかったり、一瞬とまるが、再び押す前にカウントが始まってしまう現象が確認できた。また、少し
長押ししないと、反応しないときがあった。これらが起こったのは、基盤の接触不良が大きくかかわっていると考えられる。
今回のプロジェクトにおいては元の周波数(24MHz)をVC1で3分の1、VC2で8分の1、VC3で100分の1することで10KHzとしてTimer16で10000カウントすることで1秒を作ったので、VC3での100分の1せず1MHzをTimer16で使うことで100分の1秒までを表示させることが出来そうだと考えた。が、時間を正確に測れなさそうであったので今回は秒と分の表示のみにした。
- 最終更新:2016-07-12 14:13:16