////////////////////////////////////////////////////////// // ステレオアンプ2 2012.11.24 // // 制御用プログラム // // ATTINY13A 1.2MHz // ////////////////////////////////////////////////////////// #define F_CPU 1200000UL //1.2MHz #include #include #include #include #define RELAY_ON PORTB |= _BV(0) #define RELAY_OFF PORTB &= ~_BV(0) void SELECTOR(char num); void LED_OUT(char num); char adc(void); int main(void){ // ポート初期化 // PB3-4:LED , PB2:SWITCH PORTB = 0x00; // PB1:SELECTOR DDRB = 0b00011011; // PB0:SP-RELAY // アナログ比較器 切断 ACSR = 0b10000000; // ADC設定 ADCSRA= 0b10000110; ADMUX = 0b00100001; // ADC1:PB2 // 変数 char mode = 0; char sct = 0; char sb = 0; char pb = 0; uint16_t cnt = 0; while(1){ switch(mode){ case 0: // 電源OFF 待機中 if( adc() < 64){ // 電源スイッチが押された mode = 1; cnt = 0; pb = 1; } break; case 1: // ポップノイズ保護 SELECTOR(1); if(cnt%20 <= 10){ LED_OUT(sct); }else{ LED_OUT(2); } if(100 < cnt){ mode = 2; } cnt++; if( adc() < 64 ){ // 電源スイッチが押された if(pb == 0){ mode = 3; } }else{ pb = 0; } break; case 2: // リレーON SELECTOR(sct); RELAY_ON; LED_OUT(sct); if( adc() < 64 ){ // 電源スイッチが押された if(pb == 0){ mode = 3; } }else{ pb = 0; } break; case 3: // 電源OFF 処理 RELAY_OFF; _delay_ms(150); SELECTOR(0); LED_OUT(2); while( adc() < 64 ){}; mode = 0; break; } if( (64 < adc()) && (adc() < 192) ){ // セレクタースイッチが押された if(sb == 0x00){ //反転 if(sct == 1){ sct = 0; }else{ sct = 1; } sb = 1; } }else{ // セレクタースイッチから離れた sb = 0; } _delay_ms(50); } } void SELECTOR(char num){ if(num == 1){ PORTB |= _BV(1); }else{ PORTB &= ~_BV(1); } } void LED_OUT(char num){ switch(num){ case 2: PORTB &= ~_BV(4); PORTB &= ~_BV(3); break; case 1: // 右 点灯 , PWR 点灯 PORTB |= _BV(4); PORTB &= ~_BV(3); break; case 0: //左 点灯 , PWR 点灯 PORTB |= _BV(4); PORTB |= _BV(3); break; } } char adc(void){ //AD変換 ADCSRA |= 1<