PICマイコンを使って測定ツールを作ってみよう(2) ―― クロック周波数やモータの回転数を測れるカウンタを作る(後編)

中西 紫朗

2.プログラムの概要

●自分の名前を表示する

 ダウンロードしたものをPICマイコンにただ書き込んだだけでは,面白くもなんともありません.ソース・コードを修正して,自分好みのメニューにしてみましょう.
 

 ボードに搭載されているのは8×2文字の液晶パネルです.表示できる文字数は意外と少なく,何を表示するかを決めるのは容易ではありません.まずは自分の名前でも表示してみましょう.
 

 ソース・コードの処理のおおまかな流れを図4に示します.MPLABのProjectサブウィンドウの中のuser.cがその中心です.

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
組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日