読んで字のごとく私の暇つぶしです

# 暇つぶしのブログ(+α) by nomper

GR-SAKURAを使う。(Serial - SPI)

そろそろGR-SAKURAを使おうかなと。

設定変えたり色々出来るようにしてみた。

/*GR-SAKURA Sketch Template Version: V1.08*/
#include < rxduino.h>
#include < spi.h>

#define INTERVAL (100)
unsigned int bitLength = 8; //標準ビット長は8bit
unsigned int dib=7,mode=0,spi_mode=0;
char message[150];
char tt[4];
void spi_set();
void spi_set_freq();
void spi_set_bit();
void spi_set_mode();
void spi_set_order();
void spi_write();
void cv2base(unsigned int ,int ,int );
void setup()
{
pinMode(PIN_LED0,OUTPUT);
pinMode(PIN_LED1,OUTPUT);
pinMode(PIN_LED2,OUTPUT);
pinMode(PIN_LED3,OUTPUT);
digitalWrite(PIN_LED0, 0);
digitalWrite(PIN_LED1, 0);
digitalWrite(PIN_LED2, 0);
digitalWrite(PIN_LED3, 0);
Serial.begin(9600 , SCI_AUTO);
// Serial.begin(115200 , SCI_AUTO);
SPI.begin();
SPI.setBitLength(bitLength);
SPI.setBitOrder(MSBFIRST);
SPI.setClockDivider(SPI_CLOCK_DIV128);
SPI.setDataMode(SPI_MODE2);
}

void loop()
{
digitalWrite(PIN_LED0, 1);
delay(INTERVAL);
digitalWrite(PIN_LED0, 0);
delay(INTERVAL);
if(mode == 0)
{
Serial.println("modeを入力してください。");
Serial.println("s => Setting");
Serial.println("t => Transfer");
mode = 1;
}
if( Serial.available() > 0)
{
//while(Serial.available() < 1);
mode = Serial.read();
switch (mode)
{
case 's':
spi_set();
break;

case 'w':
case 't':
spi_write();
break;

default:
mode = 1;
break;
}
int x=str2num("120");
//Serial.print(data);
}

}

void spi_write()
{
mode = 0;
unsigned int maxi,keta;
unsigned long value=0,temp=0;
char t[4];
maxi=pow(2,bitLength)-1;
sprintf(message , "送信モードに入ります。現在ビット長は%dです。送信モードを選択してください。",bitLength);
Serial.println( message );
Serial.println("b -> bin");
Serial.println("d -> dec");
Serial.println("h -> hex 未実装");
while(Serial.available() < 1);
mode = Serial.read();
if(mode == 'd')
{
Serial.println("10進数で");
Serial.println("まずは桁数から");
while(Serial.available() < 1);
for(int i=0;i<1;i++)
{keta=Serial.read()-48;}
sprintf(message , "ビット長は%dです。0~%dまでの値を入力してください。なお桁数は%d",bitLength,maxi,keta);
Serial.println( message );
while(Serial.available() < keta);
for(int i=0;i {tt[i]=Serial.read();}
for(int i=0;i {value += (tt[i]-48)*pow(10,keta-i-1);}
}
else if(mode == 'b')
{
Serial.print("2進数で。0か1で。0b");
for(int i=0;i {Serial.print("x");}Serial.println("");
sprintf(message , "ビット長は%dです。",bitLength);
Serial.println( message );
while(Serial.available() < bitLength);
for(int i=0;i {tt[i]=Serial.read()-48;}
for(int i=0;i {value += tt[i]*pow(2,bitLength-i-1);}
}
else if(mode == 'h')
{

}
temp=SPI.transfer(value);
sprintf(message , "%dを送信しました。",value);
Serial.println( message );
cv2base(value,2,bitLength);
Serial.println(value, BIN);

sprintf(message , "%dを受信しました。",temp);
Serial.println( message );
cv2base(temp,2,bitLength);
Serial.println(temp, BIN);
mode = 0;
}

void spi_set()
{
mode = 0;
Serial.println("modeを入力してください。");
Serial.println("b => bit Length");
Serial.println("f => frequency");
Serial.println("o => bit order");
Serial.println("t => Length & freq & order");
while(Serial.available() < 1);
char mode = Serial.read();
switch (mode)
{
case 'b':
spi_set_bit();
break;

case 'q':
case 'f':
spi_set_freq();
break;

case 'm':
spi_set_mode();
break;

case 't':
spi_set_bit();
spi_set_freq();
spi_set_order();
break;

case 'o':
spi_set_order();
break;
}

}

void spi_set_bit()
{
mode = 0;
sprintf(message , "ビット長設定モードに入ります。現在ビット長は%dです。",bitLength);
Serial.println( message );

/* ビット長 */
Serial.println("ビット長を入力してください。 8bit ~ 32bit");
while(Serial.available() < 2);
for(int i=0;i<2;i++)
{tt[i]=Serial.read();}
bitLength = ((tt[0]-48)*10)+(tt[1]-48);
switch (bitLength)
{
case 8:
case 9:
case 10:
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 20:
case 24:
case 32:
SPI.setBitLength(bitLength);
sprintf(message , "ビット長を%dにしました。",bitLength);
Serial.println( message );
break;

default:
Serial.println("error 8bitに設定します。");
bitLength = 8;
SPI.setBitLength(bitLength);
sprintf(message , "ビット長を%dにしました。",bitLength);
Serial.println( message );
break;
}
Serial.println("");
}

void spi_set_freq() /* 通信速度 */
{
mode = 0;
double frq=48;
frq = frq/pow(2,dib);
sprintf(message , "通信速度設定モードに入ります。現在通信速度は%6.3fMHzです。",frq);
Serial.println( message );
Serial.println("通信速度を入力してください。 24MHz~375kHz");
Serial.println( "1:SPI_CLOCK_DIV2 : 24MHz" );
Serial.println( "2:SPI_CLOCK_DIV4 : 12MHz" );
Serial.println( "3:SPI_CLOCK_DIV8 : 6MHz" );
Serial.println( "4:SPI_CLOCK_DIV16 : 3MHz" );
Serial.println( "5:SPI_CLOCK_DIV32 : 1.5MHz" );
Serial.println( "6:SPI_CLOCK_DIV64 : 750kHz" );
Serial.println( "7:SPI_CLOCK_DIV128: 375kHz" );
while(Serial.available() < 1);
for(int i=0;i<2;i++)
{tt[i]=Serial.read();}
dib = (tt[0]-48);
if(dib >= 1 && dib <= 7)
{

}
else
{
Serial.println("error 375kHzに設定します。");
dib = 7;
}
switch (dib)
{
case 1:
SPI.setClockDivider(SPI_CLOCK_DIV2);break;

case 2:
SPI.setClockDivider(SPI_CLOCK_DIV4);break;

case 3:
SPI.setClockDivider(SPI_CLOCK_DIV8);break;

case 4:
SPI.setClockDivider(SPI_CLOCK_DIV16);break;

case 5:
SPI.setClockDivider(SPI_CLOCK_DIV32);break;

case 6:
SPI.setClockDivider(SPI_CLOCK_DIV64);break;

case 7:
SPI.setClockDivider(SPI_CLOCK_DIV128);break;
}
sprintf(message , "分周期を%d番にしました。",dib);
frq=48/pow(2,dib);
sprintf(message , "通信速度は%6.3fMHzです。",frq);
Serial.println( message );
Serial.println("設定の変更を行いました。");
Serial.println("");
}

void spi_set_mode()
{
sprintf(message , "データ取得モード設定モードに入ります。現在データ取得モードはMODE%1dです。",spi_mode);
Serial.println( message );
Serial.println( "データ取得モードを入力してください。" );
Serial.println( "0:SPI_MODE0 : アイドル時のクロックがLow、立ち上がりでサンプリング" );
Serial.println( "1:SPI_MODE1 : アイドル時のクロックがLow、立ち下がりでサンプリング" );
Serial.println( "2:SPI_MODE2 : アイドル時のクロックがHigh、立ち上がりでサンプリング" );
Serial.println( "3:SPI_MODE3 : アイドル時のクロックがHigh、立ち下がりでサンプリング" );
while(Serial.available() < 1);
for(int i=0;i<1;i++)
{tt[i]=Serial.read();}
spi_mode = (tt[0]-48);
if(spi_mode >= 0 && spi_mode <= 3)
{

}
else
{
Serial.println("error MODE0に設定します。");
spi_mode = 0;
}
switch (spi_mode)
{
case 0:
SPI.setDataMode( SPI_MODE0 );break;

case 1:
SPI.setDataMode( SPI_MODE1 );break;

case 2:
SPI.setDataMode( SPI_MODE2 );break;

case 3:
SPI.setDataMode( SPI_MODE3 );break;
}
sprintf(message , "データ取得モードをMODE%1dに設定しました。。",spi_mode);
Serial.println("設定の変更を行いました。");
Serial.println("");
}

void spi_set_order()
{
sprintf(message , "ビットオーダー設定モードに入ります。現在ビットオーダーは何かわかりません。");
Serial.println( message );
Serial.println( "データ取得モードを入力してください。" );
Serial.println( "m:MSBFIRST" );
Serial.println( "l:LSBFIRST" );
while(Serial.available() < 1);
for(int i=0;i<1;i++)
{tt[i]=Serial.read();}
spi_mode = (tt[0]-48);
if(spi_mode == 'm' || spi_mode == 'M' || spi_mode == 'l' || spi_mode == 'L')
{

}
else
{
Serial.println("error MSBFIRSTに設定します。");
spi_mode = 0;
}
switch (spi_mode)
{
case 'm':
case 'M':
SPI.setBitOrder(MSBFIRST);Serial.println("MSBFIRSTに変更しました。");break;

case 'l':
case 'L':
SPI.setBitOrder(LSBFIRST);Serial.println("LSBFIRSTに変更しました。");break;
}
Serial.println("");
}

void cv2base(unsigned int n, int base ,int bitLength)
{
bitLength++;
const int DIGITS = bitLength;
char bit[DIGITS] ;

for(int i = 0; i < DIGITS; i++ )
{
bit[DIGITS -2 -i] = abs((n % base)) + 48;
n /= base;
}
bit[DIGITS - 1] = '\0';
Serial.print( "0b" );
Serial.println( bit );
}





何か素人感丸出しや…

テーマ:つぶやき - ジャンル:ブログ

# ブログ内検索

# 最近の記事

# mail&counter




# あまぞんつー


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。