2009年04月23日

Interface2008年5月号付録(FR60)でエレキー

Interface 2008年5月号付録でエレキー

Interface 2008年5月号付録でエレキー

既に昨年の雑誌となってしまいましたが
Interface (インターフェース) 2008年5月号は、富士通マイコンFR60(MB91FV310A)搭載基板のおまけ付です。
人気がないためか、CQ出版社のWebサイトでは、まだバックナンバーとして購入可能です。
http://shop.cqpub.co.jp/hanbai/magazine/stocklist/#IF

富士通のマイコンを使うのは15年以上ぶりになります。
今回もエレキープロジェクト(?)第6ステージとして試作してみたいと思います。

まず、ポート配置と配線です。
(配線は、いつものように基板に直接半田付けです。)
LED出力 → P35(ボード上のLED)
Buzzer出力 → P33(Trバッファ)
Dot入力 → P30(要プルアップ)
Dash入力 → P31(要プルアップ)
速度調整 → AIN0(VR入力・1kΩ程度が適当)


ソフトウエア機能としては下記を使用しています。
A/D変換
タイマ割り込み
ポートの入出力

このマイコンはUSBホスト機能が使えるので、USB10キーボードを接続してメモリーキー+αにする予定です。

Interface 2008年5月号付録でエレキー

ソフトウエア開発の「SOFTUNE Workbench」は、使い勝手が他の日本メーカの環境と似ているので操作性が良いです。
少し動作速度が遅いのが気になります。
(最新マシンでは気にならないかも知れませんが)

関連記事
http://micom.hamazo.tv/e1147179.html

動作の様子(Youtube)


ソースコードはこちらです。(追加したメインモジュール)
ADC、Timerは雑誌のサンプルコードを流用しました。
全プロジェクトファイルご希望の方は「お問合せフォーム」よりご連絡ください。(無償です。)


//----------------------------------------------------------------------------.
//   Sample program : Elekey
//----------------------------------------------------------------------------.

#include "_fr.h"

//----------------------------------------------------------------------------.
//  グローバル変数の定義
//----------------------------------------------------------------------------
char adc_ch;

//----------------------------------------------------------------------------
//  関数のプロトタイプ宣言
//----------------------------------------------------------------------------
void title();                               /* タイトル表示関数 */
void uart_rec(char rec_data,char rec_err);  /* 受信データ処理関数*/
char num_convert(char buf2);                /* コード変換関数 */
void adc_fin();                             /* AD変換終了処理関数*/
void prgtimer_init(void);
void key_sequence(void);


//----------------------------------------------------------------------------
//  Define Code Parameter
//----------------------------------------------------------------------------
#define PARA_ALL_OFF    0x00
#define PARA_DOT_ON     0x01
#define PARA_DOT_OFF    0x02
#define PARA_DASH_ON    0x03
#define PARA_DASH_OFF   0x04

#define LIMIT_VALUE     0x03
#define LIMIT_VALUE2    0x02

#define MAX_SPEED       35
#define MIN_SPEED       80


//----------------------------------------------------------------------------
//  Define User Memory
//----------------------------------------------------------------------------
unsigned int    ParaTime;
unsigned int    ADCData;
unsigned char   TimerTest;
unsigned char   Timer100ms;

unsigned char   ParaCode;
unsigned char   CntDotOn;
unsigned char   CntDashOn;

unsigned char   CodeData;

unsigned char   CntP10_On;
unsigned char   CntP10_Off;
unsigned char   P10_buf;


//----------------------------------------------------------------------------
//  LEDを点灯する処理
//----------------------------------------------------------------------------
void LED_ON() {
    IO_PDR3.bit.P35 = 0;    /* P35=Low設定(LED点灯)  */
}

//----------------------------------------------------------------------------
//  LEDを消灯する処理
//----------------------------------------------------------------------------
void LED_OFF() {
    IO_PDR3.bit.P35 = 1;    /* P35=High設定(LED消灯)  */
}

//----------------------------------------------------------------------------
//  Buzzer On する処理
//----------------------------------------------------------------------------
void BUZZER_ON() {
    IO_PDR3.bit.P33 = 1;
}

//----------------------------------------------------------------------------
//  Buzzer Off する処理
//----------------------------------------------------------------------------
void BUZZER_OFF() {
    IO_PDR3.bit.P33 = 0;
}

//----------------------------------------------------------------------------
//  Dotポートチェック
//----------------------------------------------------------------------------
char ChkDotPort() {
    if (IO_PDR3.bit.P30 == 0)   return 1;
    return 0;
}

//----------------------------------------------------------------------------
//  Dashポートチェック
//----------------------------------------------------------------------------
char ChkDashPort() {
    if (IO_PDR3.bit.P31 == 0)   return 1;
    return 0;
}

//----------------------------------------------------------------------------
//  Set Output port
//----------------------------------------------------------------------------
void SetOutput()
{
    if ((ParaCode == PARA_DASH_ON) || (ParaCode == PARA_DOT_ON)) {
        LED_ON();
        BUZZER_ON();
    }
    else {
        LED_OFF();
        BUZZER_OFF();
    }
}

//----------------------------------------------------------------------------
//  Check Input port
//----------------------------------------------------------------------------
void ChkInputPort()
{
    // for Dot
    if (ParaCode != PARA_DOT_ON) {
        if (CntDotOn < LIMIT_VALUE) {
            if (ChkDotPort())           //  Dotポートチェック
                CntDotOn ++;
            else
                CntDotOn = 0;
        }
    }
   
    // for Dash
    if (ParaCode != PARA_DASH_ON) {
        if (CntDashOn < LIMIT_VALUE) {
            if (ChkDashPort())          //  Dashポートチェック
                CntDashOn ++;
            else
                CntDashOn = 0;
        }
    }
}

//----------------------------------------------------------------------------
//  Set Parameter Dash
//----------------------------------------------------------------------------
char SetParaDash()
{
    if (CntDashOn >= LIMIT_VALUE) {
        CntDashOn = 0;
        ParaCode = PARA_DASH_ON;
        ParaTime = (ADCData * 3);
        return 1;
    }
    return 0;
}

//----------------------------------------------------------------------------
//  Set Parameter Dot
//----------------------------------------------------------------------------
char SetParaDot()
{
    if (CntDotOn >= LIMIT_VALUE) {
        CntDotOn = 0;
        ParaCode = PARA_DOT_ON;
        ParaTime = ADCData;
        return 1;
    }
    return 0;
}


//----------------------------------------------------------------------------
//  キー処理メイン関数
//----------------------------------------------------------------------------
void key_sequence(void)
{
    Timer100ms ++;
    if (Timer100ms > 100) {
        Timer100ms = 0x00;
        adc_start(0);
    }

    if (ParaTime != 0) {
        ParaTime --;
        if (ParaTime == 0) {
            if (ParaCode == PARA_DOT_ON) {
                ParaCode = PARA_DOT_OFF;
                ParaTime = ADCData;
            }
            else if (ParaCode == PARA_DASH_ON) {
                ParaCode = PARA_DASH_OFF;
                ParaTime = ADCData;
            }
            else if (ParaCode == PARA_DOT_OFF) {
                if (!SetParaDash())
                    ParaCode = PARA_ALL_OFF;
            }
            else if (ParaCode == PARA_DASH_OFF) {
                if (!SetParaDot())
                    ParaCode = PARA_ALL_OFF;
            }
            else {
                ParaCode = PARA_ALL_OFF;
            }
            SetOutput();
        }
    }

    ChkInputPort();
    if (ParaCode == PARA_ALL_OFF) {
        if (!SetParaDot())
            SetParaDash();
    }
    SetOutput();
}


//----------------------------------------------------------------------------
//  Main関数
//----------------------------------------------------------------------------
void main()
{
    uart_init();                    /* UARTの初期化関数読出し */
    adc_init();
    prgtimer_init();
   
    IO_PORT.IO_PFR2.bit.TOE2 = 0;   /* P35汎用I/Oポート設定          */
    IO_PDR3.bit.P35 = 1;            /* P35=High設定(LED消灯)         */
    IO_PORT.IO_DDR3.bit.P35 = 1;    /* P35出力許可                   */

    IO_PORT.IO_PFR2.byte = 0;       /* P3*汎用I/Oポート設定          */
    IO_PORT.IO_DDR3.bit.P33 = 1;    /* P33出力許可                   */

    // ユーザメモリの初期化
    CntDashOn = 0;
    CntDotOn = 0;
    ADCData = MAX_SPEED;
    ParaTime = 0;
    ParaCode = PARA_ALL_OFF;

    __EI();                         /* 割込み許可 I-flag=1*/
    __set_il(31);                   /* 割込みレベルマスク ILM=31  */

    title();                        /* コメントを表示 */

    while(1)
    {
        ;
    }                               /* UART受信待ち */
}




//----------------------------------------------------------------------------
//  タイトル表示関数
//----------------------------------------------------------------------------
void title()
{
    char sentence1[20],sentence2[20],flag,size;
    size=20;
   
    strcpy(sentence1,"-------------------");        /* 送信データの設定 */
    strcpy(sentence2,"[Eleky sample prog]");        /* 送信データの設定 */
    sentence1[18]=0x0d;sentence1[19]=0x0a;      /* 改行データ */
    sentence2[18]=0x0d;sentence2[19]=0x0a;      /* 改行データ */
    for(flag=1;flag==1;){flag=uart_display(size,sentence1);}/*表示設定関数呼び出し*/
    for(flag=1;flag==1;){flag=uart_display(size,sentence2);}/*表示設定関数呼び出し*/
    for(flag=1;flag==1;){flag=uart_display(size,sentence1);}/*表示設定関数呼び出し*/
}

//----------------------------------------------------------------------------
//  受信データ処理関数
//----------------------------------------------------------------------------
void uart_rec(char rec_data,char rec_err){
}

//----------------------------------------------------------------------------
//  AD変換終了処理関数
//----------------------------------------------------------------------------
void adc_fin(){
    ADCData = adc_read(0);
}

//----------------------------------------------------------------------------
//  コード変換関数
//----------------------------------------------------------------------------
char num_convert(char buf2){
    char    buf_out;
   
    switch(buf2){
        case 0x09: buf_out=0x39;break;
        case 0x08: buf_out=0x38;break;
        case 0x07: buf_out=0x37;break;
        case 0x06: buf_out=0x36;break;
        case 0x05: buf_out=0x35;break;
        case 0x04: buf_out=0x34;break;
        case 0x03: buf_out=0x33;break;
        case 0x02: buf_out=0x32;break;
        case 0x01: buf_out=0x31;break;
        case 0x00: buf_out=0x30;break;
    }
    return buf_out;
}




スクイズ機能で不用意にキーがメモリされてしまい、速度を上げると余計な符号が出る不具合があります。



同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
Interface2008年5月号付録(FR60)でエレキー
    コメント(0)