指定したモータを動かす

ハード構成を確認する

マイコン側サンプルプログラム(four_sci.c)

/* (four_sci.c) 受け取ったモータ番号(0から11)と ON時間のに比例した値0から179までを 対応するポートに出力 (four_s01.cの改訂版:見やすく書き直しただけ 主に、if文をswitch caseに書き換え) four_s01.cに比べて、実行ファイルが多少小さくなった 2003/10/03(Fri) */ #include<3664.h> unsigned char n=0; /* PWM出力時に足を指定するためのフラグ */ unsigned int grbm[12]; int st[12]={90,150,100,90,150,100,90,30,80,90,30,80}; int d_flag=0; void InitSCI(void){ DI; SCI3.SMR.BYTE=0x00; /* 調歩同期,8ビット,パリティなし,ストップビット1,クロックφ */ SCI3.SCR3.BYTE=0x00; SCI3.BRR=12; /* 38400bps */ SCI3.SSR.BIT.OER=0; SCI3.SSR.BIT.FER=0; SCI3.SSR.BIT.PER=0; SCI3.SCR3.BIT.RIE=1; SCI3.SSR.BIT.RDRF=0; SCI3.SCR3.BIT.RE=1; EI; } void InitTW(void){ DI; TW.TMRW.BYTE=0x48; /* FTIO端子は使用しない */ TW.TCRW.BYTE=0xBF; /* 内部クロックの1/8、割り込みフラグの全て(IMFA-D)の出力を1 */ TW.TIERW.BYTE=0x7F; /* 全ての割り込みを可能に */ TW.TSRW.BYTE=0x70; /* 割り込みフラグをクリア */ TW.TCNT=0; TW.GRA=6000; /* 3mS(18mSの1/6) */ TW.GRB=2400; /* 1.2mS(ニュートラル) */ TW.GRC=2400; EI; } int main(void) { int rccount=0; int i; InitSCI(); InitTW(); IO.PCR1=0xFF; IO.PCR5=0xFF; IO.PDR1.BYTE=0x00; IO.PDR5.BYTE=0x00; DI; TW.TMRW.BIT.CTS=1; EI; for(i=0; i<12; i++){ grbm[i]=st[i]*20+600; } while(1){ ; } } void int_sci3(void){ int dammy1,dammy2; while(SCI3.SSR.BIT.RDRF!=1){ ; } if(d_flag==0){ dammy1=SCI3.RDR; d_flag=1; }else{ dammy2=SCI3.RDR; grbm[dammy1]=dammy2*20+600; d_flag=0; } } void int_timerw(void) { if(TW.TSRW.BIT.IMFB==1){ switch(n){ case 0: IO.PDR5.BIT.B0=0; break; case 1: IO.PDR5.BIT.B1=0; break; case 2: IO.PDR5.BIT.B2=0; break; case 3: IO.PDR5.BIT.B3=0; break; case 4: IO.PDR5.BIT.B4=0; break; case 5: IO.PDR5.BIT.B5=0; break; } TW.TSRW.BIT.IMFB=0; } if(TW.TSRW.BIT.IMFC==1){ switch(n){ case 0: IO.PDR1.BIT.B4=0; break; case 1: IO.PDR1.BIT.B5=0; break; case 2: IO.PDR1.BIT.B6=0; break; case 3: IO.PDR1.BIT.B0=0; break; case 4: IO.PDR1.BIT.B1=0; break; case 5: IO.PDR1.BIT.B2=0; break; } TW.TSRW.BIT.IMFC=0; } if(TW.TSRW.BIT.IMFA==1){ switch(n){ case 0: IO.PDR5.BIT.B1=1; IO.PDR1.BIT.B5=1; break; case 1: IO.PDR5.BIT.B2=1; IO.PDR1.BIT.B6=1; break; case 2: IO.PDR5.BIT.B3=1; IO.PDR1.BIT.B0=1; break; case 3: IO.PDR5.BIT.B4=1; IO.PDR1.BIT.B1=1; break; case 4: IO.PDR5.BIT.B5=1; IO.PDR1.BIT.B2=1; break; case 5: IO.PDR5.BIT.B0=1; IO.PDR1.BIT.B4=1; break; } TW.TSRW.BIT.IMFA=0; n++; if(n>5){ n=0; } TW.GRB=grbm[n]; TW.GRC=grbm[n+6]; } }

パソコン側サンプルプログラム(four_s01.c)

/* Windows版シリアル送信(four_s01.c) 0から11までと0から179までの値をふたつ送信 2003/09/17(Wed) */ #include <windows.h> #include <stdio.h> #include <ctype.h> typedef enum { // ボーレート設定リスト br2400 = 2400, br4800 = 4800, br9600 = 9600, br19200 = 19200, br31250 = 31250, br38400 = 38400, br57600 = 57600 } BaudRate; /* シリアルポート初期化関数 */ void InitSer(DCB dcb, HANDLE* hComm, BaudRate baud) { *hComm = CreateFile( "COM1", /* シリアルポートの指定 */ GENERIC_WRITE, /* アクセスモード */ 0, /* 共有モード */ NULL, /* セキュリティ属性 */ OPEN_EXISTING, /* 作成フラグ */ FILE_ATTRIBUTE_NORMAL, /* 属性 */ NULL /* テンプレートのハンドル */ ); GetCommState(*hComm, &dcb); /* DCB を取得 */ dcb.BaudRate = baud; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState(*hComm, &dcb); /* DCB を設定 */ } int chop(char* input) { int i, c_stat, r_stat=1; for(i=0; input[i]!='\n'; i++){ c_stat=isdigit(input[i]); if(c_stat==0){ r_stat=-1; } } input[i]='\0'; return(r_stat); } int checkn(int maxn) { char input[1024]; /* 入力用 */ int status, status2, value=-1; /* エラー処理,数値格納 */ while(1){ printf("\n送信数値を入力(0-%d)%dで終了:", maxn,maxn+1); fgets(input, 1024, stdin); status=sscanf(input, "%d", &value); status2=chop(input); if(status!=1 || status2<0){ printf("数値以外が入力されました\n"); printf("入力文字%s\n", input); }else if(value>=0 && value <=maxn+1){ if(value==maxn+1){ return(-1); } return(value); }else if(status==1){ printf("0-%dの範囲外の数値が入力されました\n",maxn); printf("入力数値%d\n", value); } value=-1; } } int main(void) { DCB dcb; /* 通信パラメータ */ HANDLE hComm; /* シリアルポートのハンドル */ DWORD writesize; /* ポートへ書き込んだバイト数 */ BaudRate baud=br38400; /* BaudRate設定用 */ unsigned char sendd1,sendd2; /* 数値格納 */ int echeck1,echeck2; InitSer(dcb, &hComm, baud); while(1){ echeck1=checkn(11); if(echeck1<0){ break; } sendd1=echeck1; echeck2=checkn(179); if(echeck2<0){ break; } sendd1=echeck1; sendd2=echeck2; WriteFile(hComm, &sendd1, 1, &writesize, NULL); /* シリアルポートに書き込み */ WriteFile(hComm, &sendd2, 1, &writesize, NULL); /* シリアルポートに書き込み */ printf("入力:%d,%d\n", sendd1,sendd2); } CloseHandle(hComm); return(0); }

初期位置

プログラムの初期位置

4足歩行ロボットの目次へ

トップページへ

SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送