<PIC12F629のCW送信> 8ピンの小さいPIC12F629を使って3パターンCW文字列送信回路を作りましたので紹介します。 このPICは128バイトのEEPROMを内蔵していますので、プログラムを焼く時に3パターンの CW文字列もEEPROMに保存しますので、電源を切っても内容は消えません。 文字送信中のスピード変更が出来ます。 右端がスタート、真ん中がパターン切替、左端がスピード変更のスイッチ 基板に組立(クリックして見て下さい) 回路図 プログラムソース ******************************** main ********************************** //////////////////////////////////////////////////////////////////////////////////////////////// // PIC12F629 8ピン IOポートGPIO0-GPIO5の6つ // // EEPROMに書き込んでいる3パターンの文字列を読み出して低周波発信器を鳴らす // // パターンの選択が出来る、スピードが変えれる。 // // GPIO1:モールス出力点滅用 GPIO2:スピード変更 GPIO3:文字送信スタート用 GPIO4:パターン切替// //////////////////////////////////////////////////////////////////////////////////////////////// #include <htc.h> #define JIKAN 50 //発信周波数は、INTIO設定しているので4MhzとなるのでOSCCONなどの設定はない __CONFIG(BOREN & UNPROTECT & MCLRDIS & PWRTEN & WDTDIS & INTIO); __IDLOC(0001); #define _XTAL_FREQ 4000000 /*4000Khz */ //WRITE No.1(0-119) __EEPROM_DATA('C','Q','C','Q',' ','D','E',' '); /* 0-7 00-07 */ __EEPROM_DATA('J','A','3','R','U','A',' ','P'); /* 8-15 08-0F */ __EEPROM_DATA('S','E',' ','K','%',0xFF,0xFF,0xFF); /* 16-23 10-17 */ __EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 24-31 18-1F */ __EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 32-39 20-27 */ __EEPROM_DATA('b','K',' ','G','A',' ','T','N'); /* 40-47 28-2F */ __EEPROM_DATA('X',' ','F','B',' ','R','P','T'); /* 48-55 30-37 */ __EEPROM_DATA(' ','U','R',' ','A','L','S','O'); /* 56-63 38-3F */ __EEPROM_DATA(' ','5','9','9',' ','b','K','%'); /* 64-71 40-47 */ __EEPROM_DATA(0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF); /* 72-79 48-4F */ __EEPROM_DATA('T','N','X',' ','F','B',' ','Q'); /* 80-87 50-57 */ __EEPROM_DATA('S','O',' ','E','S',' ','H','P'); /* 88-95 58-5F */ __EEPROM_DATA('E',' ','C','U',' ','A','G','N'); /* 96-103 60-67 */ __EEPROM_DATA(' ','7','3',' ','s','K',' ','E'); /* 104-111 68-6F */ __EEPROM_DATA(' ','E','%',0xFF,0xFF,0xFF,0xFF,0xFF); /* 112-119 70-77 */ ioport(); mojisend(); j_flug1(); j_flug2(); j_flug3(); j_flug4(); char rommoji; int r_add=0; int flug=1; int flug1=1; int cnt_add=0; int s_add=0; int cnt_speed=1; main() { INTF=0; ioport(); while(1){ if(flug==1 && GPIO4==0)j_flug1(); /*GPIO4:パターン切替*/ if(flug==0 && GPIO4==1)j_flug2(); if(flug1==1 && GPIO3==0)j_flug3(); /*GPIO3:スタート*/ if(flug1==0 && GPIO3==1)j_flug4(); } } /* 関数群 */ interrupt warikomi() { ++cnt_speed; if(cnt_speed>20)cnt_speed=1; INTF=0; /*INTCONレジスタ 入力エッジがあると1になるので0にしておく*/ } ioport() { // ANSEL=0x00; /* デジタルI/Oモードにする 12F675はこの設定がある。*/ CMCON=0x07; /* デジタルI/Oモードにする */ GPIO=0; /* PORTを初期化する */ TRISIO=0x1c; /* GPIO2,3,4は入力GPIO0,1,5は出力*/ INTEDG=1; /*OPTIONレジスタ 1:立上がり*/ INTF=0; /*INTCONレジスタ 入力エッジがあると1になるので0にしておく*/ INTE=1; /*INTCONレジスタ 1:入力エッジ使う*/ GIE=1; /*割り込みを使う*/ } j_flug1() { __delay_ms(JIKAN); flug=0; } j_flug2() { __delay_ms(JIKAN); flug=1; ++cnt_add; if(cnt_add>=3) cnt_add=0; /*cnt_add>=3 3回以上押すとS_add=0にcnt_add=0にする*/ if(cnt_add==0)s_add=0; if(cnt_add==1)s_add=40; if(cnt_add==2)s_add=80; } j_flug3() { flug1=0; } j_flug4() { flug1=1; //do while の記述方法 whileの所の(rommoji != '%')が成立中(%以外)は繰り返す。'%'なら抜ける do{ rommoji=eeprom_read(s_add+r_add); mojisend(); ++r_add; }while(rommoji != '%'); r_add=0; } ******************************** main ここまで********************************** ******************************** mojisend********************************** /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // 1つのメインプログラムで構成していたが、mojisendを別のmojisend.cとした。 // // 従って、rom_cw3b.cとmijisend.cの2つで構成している、 mojisend.cを別のプログラムから利用させたいため分離した。// // ポイントは、メインプログラムから文字が入ったrommoji変数をmojisend()に渡せばいい // // // /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <htc.h> #define _XTAL_FREQ 4000000 /*4000Khz */ #define JIKAN 500 /* 500ミリ秒 */ #define tan 5 #define tyo 15 #define port GPIO1 /*ioポートをここで設定する*/ //モールスの短点・長点関数 ra2_1tyo(); ra2_0tyo(); ra2_1tan(); ra2_0tan(); char rommoji; /*メインプログラムからのモールス符号変数をもらう*/ int scnt; /*短点・長点スピード用変数1*/ int speed=5; /*短点・長点スピード用変数2*/ int cnt_speed=1; /*短点・長点スピード用変数3 メインプログラムでスピードを設定、あるポートのoff/on回数*/ mojisend() { switch(rommoji){ case 'A': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'a': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); break; case 'B': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'b': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); break; case 'C': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'D': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'E': ra2_1tan(); ra2_0tyo(); break; case 'F': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'G': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'H': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'h': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); break; case 'I': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'J': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'K': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'L': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'M': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'N': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'O': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'P': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'Q': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'R': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 'S': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case 's': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); break; case 'T': ra2_1tyo(); ra2_0tyo(); break; case 'U': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'V': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'W': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'X': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'Y': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case 'Z': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '1': ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case '2': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case '3': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case '4': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case '5': ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '6': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '7': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '8': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '9': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; case '0': ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tyo(); ra2_0tyo(); break; case ' ': ra2_0tyo(); ra2_0tyo(); break; case '/': ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tan(); ra2_0tan(); ra2_1tyo(); ra2_0tan(); ra2_1tan(); ra2_0tyo(); break; } } ra2_1tyo() { port=1; for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo); port=0; } ra2_0tyo() { for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tyo); } ra2_1tan() { port=1; for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan); port=0; } ra2_0tan() { for(scnt=0;scnt<speed+cnt_speed;scnt++) __delay_ms(tan); } ******************************** mojisendここまで********************************** PIC12F629のCW送信 HEXファイル