/*------------------------------------------ TalkingTester - テスターの音声読み上げ  コントローラ・ファームウェア 秋月のデジタルテスター MAS-345を使用 構成: tester controller AquesTalk-pico MAS-345 <> ATmega328p <> ATP3011F4-PU UART I2C Author: yamazaki(AQUEST) Date: 2012/01/03 FUSE: 内臓RC8MHzを8分周 EXTENDED = 0xFF (valid) HIGH = 0xD7 (valid) LOW = 0x62 (valid) --------------------------------------------*/ #include #include #include //#define F_CPU 8000000UL #define F_CPU 1000000UL // CKDIV8:0 8MHz/8 #include #include #define DEF_UBBR 103U // baudrate to 600 bps using a 8MHz/8 IntenalRC at U2X0=0 CKDIV8:0 #define DEF_I2C_ADDR 0x2E // I2Cのデフォルトデバイスアドレス #define LED_INIT DDRB |= (1 << PORTB5) #define LED_ON PORTB |= (1 << PORTB5) #define LED_OFF PORTB &= ~(1 << PORTB5) #define STR_CHIME_J "#J\r" void my_delay(); void Init(); void GetData(char *str); uint8_t Str2Cmd(const char *str, char *cmd); void Speak(const char *cmd); uint8_t PutChar_I2C(uint8_t tdata); uint8_t Puts_I2C(uint8_t *str); uint8_t GetChar_I2C(); void PutChar_UART(uint8_t tdata); uint8_t GetChar_UART(); char g_cmd[128]; char g_str[16]; char g_strLast[16]; int main(void) { uint8_t iret; // 初期化 Init(); g_strLast[0]=0; // 起動音 strcpy_P(g_cmd, PSTR(STR_CHIME_J)); Speak(g_cmd); while(1) { // テスターから値を取得 LED_ON; GetData(g_str); LED_OFF; // 取得した値を音声記号列に変換 iret = Str2Cmd(g_str, g_cmd); if(iret!=0){ Speak(g_cmd);// 音声出力(エラー) break; // Error時はpower down } // 前回と異なる結果の場合のみ音声出力 if(strcmp(g_str, g_strLast)!=0) { Speak(g_cmd);// 音声出力 strcpy(g_strLast, g_str); } // Delay 1sec my_delay(); } SMCR = 0x05; // sleep enable power down mode asm("sleep\n"); //ERR後の復帰はリセット } // 省電力 Delayルーチン 約1sec void my_delay() { // WDTを割り込みモードで利用 cli(); asm("wdr\n"); // WDT reset MCUSR &= ~0b00001000; // Clear WDT reset flag WDTCSR = 0b00011000; // WDPnの変更のためWDCE=1,WDE=1 WDTCSR = 0b00010110; // タイムアウト約1sec 上より4CLK以内に実行すること WDTCSR |=0b01000000; // WDT INT enable sei(); // power down SMCR = 0x05; // sleep enable power down mode asm("sleep\n"); } ISR(WDT_vect) { // do nothing WDTCSR &=~0b01000000; // WDT off (WDIE zero) } void Init() { cli(); // POWER REDUCTION ACSR = (1<>8); UBRR0L = (uint8_t)DEF_UBBR; // UCSR0A = (1<') break; _delay_ms(10); } // send command to AquesTalk pico Puts_I2C((uint8_t*)cmd); } // I2Cへnull終端文字列列送信 uint8_t Puts_I2C(uint8_t *str) { TWCR = (1 << TWINT)|(1 << TWSTA)|(1 << TWEN); // send START condition while (!(TWCR & (1 << TWINT))) // Wait START condition has been transmitted ; if ((TWSR & 0xF8) != 0x08) // Check value of TWI Status goto ERR_EXIT; TWDR = (DEF_I2C_ADDR <<1); // Load SLA_W into TWDR TWCR = (1 << TWINT) | (1<