====== CWメモリキーヤ(memory-keyer)V2 ======
===== 概要 =====
前回製作した、CWメモリキーヤ(memory-keyer)の、記録容量(時間)を増やし、且つ、記録精度を、約4倍に向上させました。
<仕様>
* 記録チャネルを4チャネル搭載する。(1チャネルあたりの記録時間は、約80秒)
* EEPROMに記録し、電源をOFFにしても記録内容が消えないようにする。
* モールス音(約1kHz)を圧電スピーカで鳴らせる。
* 単三電池2本で動作可能とする。
===== 動作原理 =====
記録および再生の基本的な原理は、CWメモリキーヤ(memory-keyer)を参照してください。
<記録容量>
* PIC16F88に、EEPROM(24LC64)を、I2C方式で接続します。
* 容量が8kバイトあるので、4チャネルに分割し、1チャネルあたりは、2kバイト(16384ビット)とします。
|<200px>|
| CH0 | SW3=OFF | SW4=OFF |
| CH1 | SW3=ON | SW4=OFF |
| CH2 | SW3=OFF | SW4=ON |
| CH3 | SW3=ON | SW4=ON |
<記録精度>
* 電鍵信号のサンプリング周期を、5msecとし、1チャネルあたりの記録時間を、約80秒とします。\\ 80秒≒16384ビット×5msec
{{:imgpaste:202004:htmikan-20200430-102703.png?500}}
===== 回路図 =====
{{:imgpaste:202004:htmikan-20200430-102716.png}}
===== ソースコード =====
//**********************************************************************
/*
<CWメモリキーヤーV2>
*/
//**********************************************************************
#define SW_REC PORTA.F2
#define SW_PLAY PORTA.F3
#define SW_CH1 PORTA.F0
#define SW_CH2 PORTA.F1
#define LED_REC PORTB.F1
#define LED_PLAY PORTB.F2
#define LED_OUTPUT PORTB.F3
#define CW_INPUT PORTA.F5
#define CW_OUTPUT PORTB.F4
#define DELAY_TIME 5
#define ACK 1
#define NO_ACK 0
//**********************************************************************
void Pwm_Change_DutyEx(unsigned int duty_ratio)
{
CCPR1L = duty_ratio >> 2;
CCP1CON.F6 = duty_ratio & 0b00000001;
CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1;
}
//**********************************************************************
void Delay_ex()
{
Delay_ms(DELAY_TIME);
}
//**********************************************************************
void EEPROM_24C64_Init()
{
Soft_I2C_Config(&PORTB, 6, 7); //SDA=3 SCL=2
}
//**********************************************************************
unsigned short EEPROM_24C64_Read(unsigned int addr)
{
unsigned short tmp;
//
Soft_I2C_Start();
Soft_I2C_Write(0xA0);
Soft_I2C_Write((addr >> 8) & 0xFF);
Soft_I2C_Write(addr & 0xFF);
Soft_I2C_Start();
Soft_I2C_Write(0xA1);
tmp = Soft_I2C_Read(NO_ACK); //not acknowledge
Soft_I2C_Stop();
return (tmp);
}
//**********************************************************************
void EEPROM_24C64_Write(unsigned int addr, unsigned short dat)
{
unsigned short cnt;
//
Soft_I2C_Start();
Soft_I2C_Write(0xA0);
Soft_I2C_Write((addr >> 8) & 0xFF);
Soft_I2C_Write(addr & 0xFF);
Soft_I2C_Write(dat);
Soft_I2C_Stop();
Delay_ms(5);
}
//**********************************************************************
void recProc()
{
static unsigned int cnt1, addr_offset;
static unsigned short cnt2, tmp;
//
if ((SW_CH1 == 1) && (SW_CH2 == 1)) {
addr_offset = 0;
}
if ((SW_CH1 == 0) && (SW_CH2 == 1)) {
addr_offset = 2048;
}
if ((SW_CH1 == 1) && (SW_CH2 == 0)) {
addr_offset = 2048 * 2;
}
if ((SW_CH1 == 0) && (SW_CH2 == 0)) {
addr_offset = 2048 * 3;
}
//
LED_REC = 1;
for (cnt1 = 0; cnt1 < 2048; cnt1++) {
tmp = 0x00;
for (cnt2 = 0; cnt2 < 8; cnt2++) {
if (CW_INPUT == 0) {
tmp |= 0x01;
Pwm_Start();
LED_OUTPUT = 1;
CW_OUTPUT = 1;
} else {
Pwm_Stop();
LED_OUTPUT = 0;
CW_OUTPUT = 0;
}
if (cnt2 < 7) {
tmp = tmp << 1;
Delay_ex();
}
}
EEPROM_24C64_Write(addr_offset + cnt1, tmp);
Delay_ex();
//
if (SW_REC == 0)
break;
}
LED_REC = 0;
Pwm_Stop();
LED_OUTPUT = 0;
CW_OUTPUT = 0;
}
//**********************************************************************
void playProc()
{
static unsigned int cnt1, addr_offset;
static unsigned short cnt2, tmp;
//
if ((SW_CH1 == 1) && (SW_CH2 == 1)) {
addr_offset = 0;
}
if ((SW_CH1 == 0) && (SW_CH2 == 1)) {
addr_offset = 2048;
}
if ((SW_CH1 == 1) && (SW_CH2 == 0)) {
addr_offset = 2048 * 2;
}
if ((SW_CH1 == 0) && (SW_CH2 == 0)) {
addr_offset = 2048 * 3;
}
//
LED_PLAY = 1;
for (cnt1 = 0; cnt1 < 2048; cnt1++) {
tmp = EEPROM_24C64_Read(addr_offset + cnt1);
for (cnt2 = 0; cnt2 < 8; cnt2++) {
if ((tmp & 0x80) != 0) {
Pwm_Start();
LED_OUTPUT = 1;
CW_OUTPUT = 1;
} else {
Pwm_Stop();
LED_OUTPUT = 0;
CW_OUTPUT = 0;
}
tmp = tmp << 1;
Delay_ex();
}
//
if (SW_PLAY == 0)
break;
}
LED_PLAY = 0;
Pwm_Stop();
LED_OUTPUT = 0;
CW_OUTPUT = 0;
}
//**********************************************************************
void main()
{
static short cnt;
//
//ポート関連の設定
TRISA = 0b11111111;
TRISB = 0b00000000;
OSCCON = 0b01100000; // クロックを4Mhzに設定する。
ANSEL = 0b00000000; // A/D変換は使用しない。
//
EEPROM_24C64_Init();
//PWMの設定(1kHz)
Pwm_Init(1000);
Pwm_Change_DutyEx((PR2 * 4) / 2);
Pwm_Stop();
//
for (cnt = 0; cnt < 5; cnt++) {
LED_REC = 1;
LED_PLAY = 1;
LED_OUTPUT = 1;
Pwm_Start();
Delay_ms(200);
Pwm_Stop();
LED_REC = 0;
LED_PLAY = 0;
LED_OUTPUT = 0;
Delay_ms(200);
}
//
while (1) {
if (SW_REC == 0) {
while (Button(&PORTA, 2, 1, 1) == 0)
;
//
recProc();
//
while (Button(&PORTA, 2, 1, 1) == 0)
;
}
if (SW_PLAY == 0) {
while (Button(&PORTA, 3, 1, 1) == 0)
;
//
playProc();
//
while (Button(&PORTA, 3, 1, 1) == 0)
;
}
}
}
//**********************************************************************
===== 動作確認 =====
{{:imgpaste:202004:htmikan-20200430-102833.png?500}}
左側から、PIC16F88、24LC64、2SC1815です。
{{:imgpaste:202004:htmikan-20200430-102849.png?500}}
このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]]
This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]