<<前へ
次へ>>
指定したモータを動かす
ハード構成を確認する
マイコン側サンプルプログラム(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];
}
}
/*
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);
}
初期位置