メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |
お問い合わせメールフォームが開きます。
2009年04月23日
Interface2008年5月号付録(FR60)でエレキー
既に昨年の雑誌となってしまいましたが
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キーボードを接続してメモリーキー+αにする予定です。
ソフトウエア開発の「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;
}
スクイズ機能で不用意にキーがメモリされてしまい、速度を上げると余計な符号が出る不具合があります。