// 浮動小数点 1/10するのに *0.1 か /10.0か どちらが早い // PB5(D13)ポートに乗算と除算の計算時間パルスを出力 // Num 1 2>234 0.1 数値を2つ入力 // g1:23.4000 g2:23.4000 乗算と1/nした値を除算 // Num 1 2> 入力プロンプト /***** マクロ *****/ #define nop() asm volatile("nop;") // NOPコード // タイミング確認 #define PB5_H (PORTB |= (1 << PB5)) // D13 LED点滅ポート #define PB5_L (PORTB &= ~(1 << PB5)) #define PB4_H (PORTB |= (1 << PB4)) // D12 #define PB4_L (PORTB &= ~(1 << PB4)) /******************************/ /* シリアル入力 */ /******************************/ /***** シリアル1行入力 *****/ #define RXBF_SIZ 64 // 文字バッファ文字数 char rx_bff[RXBF_SIZ+1]; // 受信文字バッファ (+null) byte f_rxok; // 受信データありフラグ /***** シリアル1行受信 *****/ // CRでターミネート f_rxokを1に void rxbff(void) { static byte cnt = 0; // 受信文字数 char c; if(Serial.available()){ // 受信データあり if(f_rxok == 0){ // 前データ受信処理した c = Serial.read(); // 1文字読み出し if(c == '\r'){ // CR? rx_bff[cnt] = '\0'; // nullを最後に Serial.println(); // 改行 f_rxok = 1; // 受信成功 cnt = 0; // 最初から } else if(c == '\x08'){ // BS? if(cnt > 0){ cnt--; // 1文字戻す Serial.print("\b \b"); // BS,space,BS } } else{ // 文字 if((cnt < RXBF_SIZ) && // バッファサイズ内 (isprint(c))){ // 表示可能文字0x20~0x7E Serial.write(c); // エコーバック rx_bff[cnt] = c; // バッファに入れる cnt++; // 1文字進める } } } } } /***************************/ /* SETUP */ /***************************/ /***** SET UP *****/ void setup() { cli(); // 割込禁止 // I/Oイニシャル PORTB = 0b00000000; // data/pull up DDRB = 0b00111111; // port指定 // |||||+---- PB0 IO8 out // ||||+----- PB1 IO9 out // |||+------ PB2 IO10 out // ||+------- PB3 IO11 out // |+-------- PB4 IO12 out (!!!)テストパルス // +--------- PB5 IO13 out (LED) PORTC = 0b00000000; // data/pull up DDRC = 0b00111111; // port指定 // |||||+---- PC0 AD0 out // ||||+----- PC1 AD1 out // |||+------ PC2 AD2 out // ||+------- PC3 AD3 out // |+-------- PC4 AD4 out // +--------- PC5 AD5 out PORTD = 0b00000011; // data/pull up DDRD = 0b11111110; // port指定 // |||||||+---- PD0 IO0 in RXD // ||||||+----- PD1 IO1 out TXD // |||||+------ PD2 IO2 out // ||||+------- PD3 IO3 out // |||+-------- PD4 IO4 out // ||+--------- PD5 IO5 out // |+---------- PD6 IO6 out // +----------- PD7 IO7 out sei(); // 割込許可 // シリアル,I2C Serial.begin(9600); // 9600BPSで } /**********************************/ /* LOOP */ /**********************************/ /***** LOOP *****/ void loop() { byte f_prnpt = 1; // プロンプト出力フラグ volatile float f0, f1, f2; // 入力数字 volatile float g1, g2; // 結果 char *s; byte n; char *s_in[2]; // 文字2つ // 繰り返し while(1){ if(f_prnpt){ // プロンプト出力 Serial.print(F("Num 1 2>")); f_prnpt = 0; } rxbff(); // 1行受信処理 // 1行文字受信処理 if(f_rxok){ // CR入力あり f_rxok = 0; n = 0; s = strtok(rx_bff, " ,"); // 最初の文字分離 while(s != NULL){ s_in[n] = s; s = strtok(NULL, " ,"); // 次文字分離 n++; if(n >= 2) break; // 2文字まで } if(n >= 2){ // 2文字ok ? // 文字→floatへ PB4_H; // (!!!) f0 = atof(s_in[0]); // 文字からfloatへ 被演算数 PB4_L; nop(); PB4_H; f1 = atof(s_in[1]); // 乗算データ PB4_L; f2 = 1 / f1; // 除算用 // 計算 PB5_H; // (!!!) g1 = f0 * f1; // 乗算で PB5_L; nop(); PB5_H; g2 = f0 / f2; // 1/nした値を乗算 PB5_L; Serial.print("g1:"); PB4_H; Serial.print(g2, 4); PB4_L; Serial.print(" g2:"); PB4_H; Serial.print(g2, 4); PB4_L; Serial.println(); } f_prnpt = 1; } } }