モールス出力 8チャネル版 2006.04.11
|
モールス出力(1チャネル) を、8チャネルへ拡張したものです。チャネル数が増えた以外、基本的には1チャネルのものと変わりません。( #define MORSE_CH_N の部分を変更すれば、1〜8の任意のチャネル数で動作します) |
|
複数チャネルになったので、起動/停止関数へ「チャネル番号(0〜7)の指定」が追加されました。 MorseON(ch, TabelTopAdr); // 起動 MoseOFF(ch); // 停止これだけです。 |
|
ワーク 1チャネル時と同じ物を8チャネルへ拡張しました。モールス出力は、直接ドライバを呼ぶのではなく、出力チャネルのON/OFFをフラグにセットする形式になりましたので、出力フラグ MorseO が追加になっています。(ドライバは後でまとめて呼びます) #define MORSE_CH_N 8 // モールス出力チャネル数 0 - 8(max)
struct morse_wk {
byte *tbladr; // モールス出力用 テーブルアドレス
byte *tblp; // モールス出力用 テーブル読出ポインタ
byte rect; // モールス出力用 繰返しカウンタ
byte onct; // モールス出力用 ON 時間カウンタ
byte offct; // モールス出力用 OFF
} ;
union morse_out { // モールス出力レベル(ON/OFF)
byte out;
struct {
byte ch7 : 1 ;
byte ch6 : 1 ;
byte ch5 : 1 ;
byte ch4 : 1 ;
byte ch3 : 1 ;
byte ch2 : 1 ;
byte ch1 : 1 ;
byte ch0 : 1 ;
} ch ;
};
struct morse_wk MorseW[MORSE_CH_N];
union morse_out MorseO;
起動関数
引数へ(操作対象の)チャネル番号が追加になっています。他は1チャネル時と同じです。 void MorseON(byte ch, byte *tbl_adr)
{
if (ch > MORSE_CH_N -1) return;
InterruptSave(); // CCR 保存、割込禁止
MorseW[ch].onct = 0;
MorseW[ch].offct = 0;
MorseW[ch].tbladr = tbl_adr;
InterruptLoad(); // CCR 復帰(割込フラグも)
}
停止関数
引数へ(操作対象の)チャネル番号が追加になっています。他は1チャネル時と同じです。 void MorseOFF(byte ch)
{
if (ch > MORSE_CH_N -1) return;
MorseW[ch].tbladr = 0;
MorseO.out &= ~(0x01 << ch); // 出力フラグ
MorseDrv(); // ポート駆動
}
本体関数 ( 10mS 毎に駆動されます)
チャネル数が増えた部分以外は1チャネル時と変わりません。 void Morse(void)
{
byte ch;
for (ch=0; ch < MORSE_CH_N; ch++) {
if (MorseW[ch].tbladr == 0) { // 出力停止中?
MorseO.out &= ~(0x01 << ch); // 出力OFF
continue;
}
// -----------------------------------
if (MorseW[ch].onct != 0) { // ON時間カウント中?
// -----------------------------------
if (--MorseW[ch].onct == 0) { // ON時間カウントアップなら
MorseO.out &= ~(0x01 << ch); // 出力OFF
MorseW[ch].offct = *(MorseW[ch].tblp++);// OFF時間セット
} else {
MorseO.out |= 0x01 << ch; // 出力ON
}
// -----------------------------------
} else if (MorseW[ch].offct != 0) { // OFF時間カウント中?
// -----------------------------------
if (--MorseW[ch].offct == 0) { // OFF時間カウントアップなら
MorseW[ch].onct = *(MorseW[ch].tblp++); // ON時間セット
if (MorseW[ch].onct == 0) { // テーブルエンドなら
if (MorseW[ch].rect != 0) { // 無限繰返しではなくて
if (--MorseW[ch].rect == 0) { // 繰返し回数終了なら
MorseW[ch].tbladr = 0; // 出力停止
MorseO.out &= ~(0x01 << ch);// 出力OFF
continue;
} else {
startMorse(ch); // テーブルTopから再動作開始
}
} else {
startMorse(ch); // テーブルTopから再動作開始
}
}
MorseO.out |= 0x01 << ch; // 出力ON
} else {
MorseO.out &= ~(0x01 << ch); // 出力OFF
}
// -----------------------------------
} else { // 新規出力開始(今までは停止中だった)
// -----------------------------------
MorseW[ch].rect = *MorseW[ch].tbladr; // 繰返し回数
startMorse(ch); // テーブルTopから新規動作開始
}
}
}
// ------------------------------------
// テーブルTopから動作開始
// ------------------------------------
void startMorse(byte ch)
{
MorseW[ch].tblp = MorseW[ch].tbladr +1; // テーブル読み出しP
MorseW[ch].onct = *(MorseW[ch].tblp++); // ON時間
MorseO.out |= 0x01 << ch; // 出力ON
}
|
|
チャネル0から7までを順にドライブします。本体関数 Morse() に続いて呼びます。 void MorseDrv()
{
MorseCH0drv(MorseO.ch.ch0); if (MORSE_CH_N < 2) return;
MorseCH1drv(MorseO.ch.ch1); if (MORSE_CH_N < 3) return;
MorseCH2drv(MorseO.ch.ch2); if (MORSE_CH_N < 4) return;
MorseCH3drv(MorseO.ch.ch3); if (MORSE_CH_N < 5) return;
MorseCH4drv(MorseO.ch.ch4); if (MORSE_CH_N < 6) return;
MorseCH5drv(MorseO.ch.ch5); if (MORSE_CH_N < 7) return;
MorseCH6drv(MorseO.ch.ch6); if (MORSE_CH_N < 8) return;
MorseCH7drv(MorseO.ch.ch7);
}
void MorseCH0drv(byte out)
{
if (out != 0) P50 = 0;
else P50 = 1;
}
void MorseCH1drv(byte out)
{
if (out != 0) P51 = 0;
else P51 = 1;
}
void MorseCH2drv(byte out)
{
if (out != 0) P52 = 0;
else P52 = 1;
}
void MorseCH3drv(byte out)
{
if (out != 0) P53 = 0;
else P53 = 1;
}
void MorseCH4drv(byte out)
{
if (out != 0) P54 = 0;
else P54 = 1;
}
void MorseCH5drv(byte out)
{
if (out != 0) P55 = 0;
else P55 = 1;
}
void MorseCH6drv(byte out)
{
if (out != 0) P56 = 0;
else P56 = 1;
}
void MorseCH7drv(byte out)
{
if (out != 0) P57 = 0;
else P57 = 1;
}
|
|
簡単にテストするためのものです。H8/3694(3664)で動作します。 ポート5(全ビット)をモールス出力に、P85を10mS毎の反転出力に割当てています。 (これらのポートが既に使用中ならソフトの変更で空きポートへ振ってください) 他のポートには何もしていませんので、空きポートがあれば処理をお願いします。 |
|
2007.07.12 エエカゲンな書き方をしていたポインタ操作部分を修正しました。 |