Hatena::ブログ(Diary)

99円のへたれ日記! RSSフィード

2011-01-16

[]SONY ICF-M55にオフタイマーを付けた[後編]

前編はこちら

回路図です。

f:id:kyuuzyuu9yen:20110116192126p:image

とくに面白みはありませんw

マイコンAVR ATtiny13Aを使います。秋月で一つ120円です。

ただし、プッシュスイッチは外部割り込みINT0のPB1に接続しないと、パワーダウンスリープからの復帰が出来ません。

ということで、プログラムはこんな感じです。

通常はパワーダウンスリープです。スイッチが押されたらタイマーを起動して約3.8秒ごとに割り込みがかかるので、時間になったらラジオの電源をオフにして再びパワーダウンスリープします。

クロックは、消費電力の削減とラジオの雑音防止のために、9.6MHzの内蔵クロックを128分周して75kHzに設定します。

/*
*  SONY ICF-M55にオフタイマーを付ける for ATtiny13A
*  by 99yen 2011/01/15
*  WinAVR 20100110でコンパイル出来た
*/
#define F_CPU 75000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <util/delay.h>

#define INT_SW (1<<PB1)
#define POWER_STATE (1<<PB3)
#define POWERSW_FET (1<<PB4)

#define OVF_CNT 484 // 約30分(実測)

/* 電源ボタンをFETで押す */
static inline void push_sw(void){
	PORTB |= POWERSW_FET;
	_delay_ms(300);
	PORTB &= ~POWERSW_FET;
}

/* 電源状態を取得する */
static inline uint8_t get_state(void){
	uint8_t res;

	// AD変換開始
	ADCSRA = (1<<ADEN | 1<<ADSC); // ADCオン 変換開始
	loop_until_bit_is_clear(ADCSRA,ADSC); // 初回の結果は捨てる
	ADCSRA |= (1<<ADSC); // もう一回変換
	loop_until_bit_is_clear(ADCSRA,ADSC);
	res = ADCH; // 結果取得
	ADCSRA = 0; // ADCオフ
	
	// 0.75V以上でオンと見なす
	return (res > 64) ? 1 : 0;
}

/* 外部割り込み ボタン */
ISR(INT0_vect){
	// 外部割り込みをオフ
	GIMSK = 0;
	// タイマ起動
	TCCR0B = (1<<CS02 | 1<<CS00);
	// タイマを動かすためにスリープモードをアイドルに
	set_sleep_mode(SLEEP_MODE_IDLE);
}

/* タイマ溢れ割り込み */
ISR(TIM0_OVF_vect){
	static uint16_t cnt = 0;

	if(cnt++ > OVF_CNT){
		// 設定時間が経過した
		// 電源をオフにする
		push_sw();
		_delay_ms(1000);
	}
	if(!get_state()){
		// 電源がオフになった
		cnt = 0;
		// タイマ終了
		TCCR0B = 0;
		// 外部割り込み許可
		GIMSK = (1<<INT0);
		// スリープモード パワーダウン
		set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	}
}

int main(void){
	// クロック設定
	CLKPR = (1<<CLKPCE);
	CLKPR = (1<<CLKPS2 | 1<<CLKPS1 | 1<<CLKPS0); // 128分周 9.6MHz/128=75kHz

	// ポート設定
	DDRB = 0b010101; // 不要なポートは出力に
	PORTB = INT_SW; // プルアップ

	// 外部割り込み設定
	MCUCR = 0; // Lowレベル割り込み
	GIMSK = (1<<INT0); // 外部割り込み許可

	// ADコンバータ設定
	ADMUX = (1<<ADLAR | 1<<MUX1 | 1<<MUX0); // 結果を左揃え ADC3
	ADCSRA = 0;
	ADCSRB = 0;
	DIDR0 = (1<<ADC3D); // ADCに接続

	// タイマ準備
	TCNT0 = 0;
	TCCR0A = 0;
	TCCR0B = 0; // /1024のときは (1<<CS02 | 1<<CS00)
	TIMSK0 = (1<<TOIE0); // タイマ溢れ割り込み許可
	
	// スリープモード パワーダウン
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);

	_delay_ms(500);
	// 割り込み許可
	sei();
	
	while(1){
		sleep_mode();
	}
	
	return 0;
}

OVF_CNTはオフタイマーの時間ですので、適時調整してください。

で、こんなんになりました。

f:id:kyuuzyuu9yen:20110116133806j:image

f:id:kyuuzyuu9yen:20110116133839j:image

とくに放送にノイズは乗ってない感じです。

マイコンが乗ってるので、他に何か良いアイデアがあれば教えてください。

くれぐれも改造は自己責任で。

fukufuku 2011/02/02 19:45 電源ボタンが他のボタンに比べてへこんでるんですが治す方法はないですか?

kyuuzyuu9yenkyuuzyuu9yen 2011/02/05 11:35 それはもともとそうなってるので、ちょっとふくらんでるシールを貼るとかするといいかもしれません。

おかもとおかもと 2011/04/24 21:18 どうやったらあけられますか。ネジ3つとっても開かないんですが。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kyuuzyuu9yen/20110116/1295175422