マイクロホン・インターフェース ― PTTスイッチの実験

マイクロホン・インターフェース

ICOM IC-9700,IC-7300Mを使っています.マイクロホン端子に機能がいくつか現れているので,それを利用したマイクロホン・インターフェース・ボックスを作ろうと考えています.
その仕様はそのうちにまとめようと思いますが,キーパッドやハンドマイクやヘッドセットなど複数のマイクの切り替え機能を盛り込もうと思っています.

PTT(Push-to-Talk)のボタンも入れるだろう,でもしっかりした機構のスイッチを探し出してきて素人工作で作り込むのが難しそうに思ったので,ワンチップマイコン+タクトスイッチでロック付きPTTの機能を拵えました.
PTTなら端子も少ないし8-pin AVRでいいだろうということ始め,ブレッドボードに部品を置いてコードを書いて動かしたところで,「あ,マイク切り替えもするならピン数の多いやつにすればよかった」と気づいた次第です.まあ,ちょこっと変更で行けそうです.

参考コード

簡単なコードなので参照したいという方が居るかどうか謎ですが,コードを置いておきます.メインの部分は上記に揚げたELMさんの情報に負うています.
なおAVR Studio 7.0でビルド&テストしました.

/*
 * Ptt.c
 *
 * Author : Steve JO1MMI
 */ 
/*
	Target AVR  : ATtiny45
	System clock: 1MHz

	key input[1:0]        = { PB[1:0] } ( 1: PTT Lock 0: PTT )
	PTT out                 = { PB2 } active HIGH
	PTT Lock LED out  = { PB3 } active HIGH
*/

#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define PTT     (0x01)
#define PTTLOCK (0x02)
#define PTTON()  (PORTB |=  (1<<PB2))
#define PTTOFF() (PORTB &= ~(1<<PB2))
#define LOCKLEDON()  (PORTB |=  (1<<PB3))
#define LOCKLEDOFF() (PORTB &= ~(1<<PB3))

typedef struct key_t_tag {
	uint8_t cmd;
	uint8_t stat;
	uint8_t filt;
} key_t;

/* keyin globals */
volatile static key_t key_buf;


//----- Begin Code ------------------------------------------------------------


ISR(TIMER0_OVF_vect)
{
	static uint8_t process = 0;
	uint8_t a, b;

	++process;
	if (process & 0x01) {	// process every other interrupt
		a = (~PINB & 0x03);
		if (a == key_buf.filt) {
			b = key_buf.stat;
			key_buf.stat = a;
			b = (b ^ a) & a;
			if (b) {
				key_buf.cmd = b;
			}
		}
		key_buf.filt = a;

	} // end of		if (process & 0x01)

}

void timer0Init(void)
{
	// start timer0
	TCNT0 = 0;
	TCCR0B |= (1<<CS01)|(0<<CS00);		// set prescaler by 8 1MHz/256/8->2msec
	TIMSK |= (1<<TOIE0);

	sei();
}


void keyInit(void)
{
	DDRB &= ~(1<<PB0);
	DDRB &= ~(1<<PB1);
	PORTB |= (1<<PB0);
	PORTB |= (1<<PB1);
}

void PTTIOInit(void)
{
	// IO ports
	PTTOFF();
	LOCKLEDOFF();
	DDRB |= (1<<PB2); // PTT
	DDRB |= (1<<PB3); // PTT LOCK LED
	PTTOFF();
	LOCKLEDOFF();
}


enum { S_OFF = 0, S_ON, S_LOCK };

int main(void)
{
	uint8_t keyPTT, keyLOCK;
	uint8_t stat = S_OFF;

	keyInit();
	PTTIOInit();
	timer0Init();
	
    while (1) 
    {
 		sleep_mode();
		
		keyPTT  = key_buf.stat & PTT;
		keyLOCK = key_buf.cmd & PTTLOCK;
		
		switch (stat) {
			case S_OFF:
				if(keyPTT)  stat = S_ON;
				if(keyLOCK) stat = S_LOCK;
				break;
			case S_ON:
				if(keyPTT) stat = S_ON;
				if(!(keyPTT)) stat = S_OFF;
				if(keyLOCK) stat = S_LOCK;
				break;
			case S_LOCK:
				if(keyLOCK && keyPTT)  stat = S_ON;
				if(keyLOCK && !keyPTT) stat = S_OFF;
				break;				
		}
		if((stat== S_ON) || (stat == S_LOCK)) PTTON();
		else PTTOFF();
		if(stat == S_LOCK) LOCKLEDON();
		else LOCKLEDOFF();
		
		key_buf.cmd = 0;		
    }
}