PICマイコンを使って測定ツールを作ってみよう(2) ―― クロック周波数やモータの回転数を測れるカウンタを作る(後編)
tag: 組み込み 電子回路 ディジタル・デザイン
エレキ系DIY 2009年9月28日
2.プログラムの概要
●自分の名前を表示する
ダウンロードしたものをPICマイコンにただ書き込んだだけでは,面白くもなんともありません.ソース・コードを修正して,自分好みのメニューにしてみましょう.
ボードに搭載されているのは8×2文字の液晶パネルです.表示できる文字数は意外と少なく,何を表示するかを決めるのは容易ではありません.まずは自分の名前でも表示してみましょう.
ソース・コードの処理のおおまかな流れを図4に示します.MPLABのProjectサブウィンドウの中のuser.cがその中心です.
他のCソースとして,main.cやusb_device.cなどもありますが,これらにはコンフィグレーションの設定やUSB処理が記述されています.私たちが関心のある処理はuser.cにまとめています.user.cをダブルクリックすると,テキスト・エディタのサブウィンドウが開き,中身が表示されます(図5).MPLABウィンドウの下のほうには,行番号(Ln)とカーソル位置(Col)が表示されています.
図4 プログラムの処理の流れ(フローチャート)
図5 user.cを表示
[Page Down]キーを押すか,ウィンドウの中を上下に動かすスライド・バーをマウスでつかみ,真ん中あたり(208~353行目)に持っていくと,関数名COMM_USB( )が見つかります(リスト1).検索サブメニューで検索するとすぐに見つけられるのですが,慣れてくるとプログラムの中のだいたいの位置が分かるようになり,スライド・バーで探したほうが早い場合もあります.
リスト1 COMM_USBの記述(user.cの219~365行目)
void COMM_USB(void) { static byte devaddr, regaddr, i2cdata, i2cdata2 ; byte i,j,k,ch,I2Cdata2,ASD_type,ASD_num, *mm0, *mm1,menu_change; menu_change=0; if(PORTAbits.RA3==1){ // SW1 BLUE SW MENU ON/OFF if(oldRA3==0){ oldRA3=1; if(menu_selected) { menu_selected=0; PORTAbits.RA0=0; LCDlocate(0x40); LCDmenu2(); } else { menu_selected=menu+1; PORTAbits.RA0=1; } } else { oldRA3=1; } } else oldRA3=0; if(PORTAbits.RA2==1){ // SW4 YELLOW SW MENU DOWN if(oldRA2==0){ oldRA2=1; menu_change=1; menu--; if(menu==0) menu=7; } else { oldRA2=1; } } else oldRA2=0; if(PORTCbits.RC0==1){ // SW2 GREEN SW MENU UP if(oldRA1==0){ oldRA1=1; menu_change=1; menu++; if(menu>7) menu=1; } else { oldRA1=1; } } else oldRA1=0; LCDlocate(0); if(menu_change){ switch(menu){ case 1 : LCDstring(mn1,8); break; case 2 : LCDstring(mn2,8); break; case 3 : LCDstring(mn3,8); break; case 4 : LCDstring(mn4,8); break; case 5 : LCDstring(mn5,8); break; case 6 : LCDstring(mn6,8); break; case 7 : LCDstring(mn7,8); break; } LCDlocate(0x40); } if(menu_change){ PORTAbits.RA0= 0; LCDmenu2(); LCDlocate(0); } if((menu_selected)&&(dsp_on)){ switch(menu){ case 0 : case 1 : dsp_on=0; LCDlocate (0x40); LCDstring(" ",8); freq=(cnt01*0x10000+TMR0H1*0x100+TMR0L1)*256/100; sprintf(va1,"%8ld",freq); LCDlocate(0x46-strlen(va1)); LCDstring(va1,strlen(va1)); // LCDwrite(0x30); // LCDwrite(0x4B); break; case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : LCDlocate(0x40); LCDstring(mn0,8); break; } } if(getsUSBUSART(input_buffer,2)) { aa[0] = input_buffer[0]; aa[1] = input_buffer[1]; aa[3] = input_buffer[3]; switch(aa[0]){ case 'C' : // Initialize command LCDlocate(0x40); LCDstring(mn9,8); COM_stage=1; for ( i=0; i<4; i++){ for ( j=0; j<4; j++){ aa[0]=0x4E; aa[1]=i*16+0x40+j; for(k=0; k<9; k++){ aa[2+k]=RD_EEPROM(aa[1]+k+3); } // while(mUSBUSARTIsTxTrfReady()==0); mUSBUSARTTxRam(aa,11); } } break; case 'S' : // Swtich command case 'R' : // read command aa[0]=buffer_ptr; for (i=0; i<buffer_ptr; i++){ aa[i]=UART_buffer[i]; } while(mUSBUSARTIsTxTrfReady()==0); mUSBUSARTTxRam(aa,aa[0]); // if(mUSBUSARTIsTxTrfReady()) putsUSBUSART(aa); break; /* case 'N' : // Name command ASD_type = (aa[1]>>4) - 4; ASD_num = aa[1]&0x0F; getsUSBUSART(input_buffer,9); namecpy(ASD_type,ASD_num,9); while(mUSBUSARTIsTxTrfReady()==0); // if(mUSBUSARTIsTxTrfReady()) mUSBUSARTTxRam(aa,4); break; */ } } }//end of COMM_USB |