Arduino続き(ロータリー、DDS、LCD) RIT機能
- 2015/04/19
- 01:03
つぶやいたら、
WRKさんからRITに関するツーイートを頂いた、、
そういや、RIT実装していなかった、、
よし、ついでにやっちゃおう!
と思って取り掛かりました、、、
が、結構苦戦しました、
やっぱしちゃんとフロー図とか書かないでやっていると限界
あるのかな、、途中で何をやっているのか分からんようになってきた、、
という事で、
とりあえず動くようにはなったけど、
コードが全くイケテないというか、、
よく分からないモードに突入です。
とりあえず、下記の様な機能は実装できたww
・ロータリーエンコーダー機能
・VFO・表示周波数変換機能
・周波数ステップ変更機能
・オーとスキャン機能
・RIT機能
・TX/RXステータス識別機能

/*
/*
DDSコントローラーシステム
DDS: AD9850
ロータリーエンコーダー:EC12PLRGBSDVBF-D-25K-24-24C-61 秋月
2015/04/12-2
使用IOポート
0: AD9850 FQ_UD
1: AD9850 CLK
2: ロータリーエンコーダーA
3: ロータリーエンコーダーB
4: LCD , Refer to P186 Arduinoを始めよう
5: LCD , Refer to P186 Arduinoを始めよう
6: LCD , Refer to P186 Arduinoを始めよう
7: LCD , Refer to P186 Arduinoを始めよう
8: AD9850 DATA
9: AD9850 RESET
11: LCD , Refer to P186 Arduinoを始めよう
12: LCD , Refer to P186 Arduinoを始めよう
13:周波数ステップ切替スイッチ(ロータリエンコーダスイッチ利用) ロータリー側コネクター6、5はGへ
14: A0 スキャン開始、停止用押しボタンスイッチ
15: A1 デバッグ用LED接続
16: A2 RIT ONスイッチ
17: A3 TX検出、受信時にのみRIT-ON
18: A4 CWモード(検出受信時600Hz程度シフトしたい)
*/
// ヘッダー関連 -----------------------------------
#include /// 1mS割り込み用
#include /// LCD表示用
#include //AD9850を使うためのライブラリ
// 初期設定関連 -----------------------------------
// 初期周波数設定
volatile long X=35840000; ///液晶に表示する数字、周波数Hz
volatile long Y=35840000; /// RIT時のテンポラリー
volatile long DISP_FREQ=50150000; /// LCD表示周波数
volatile long DELTA_FREQ = DISP_FREQ-X; ///差分記憶
volatile long RIT_FREQ=0; ///RIT用周波数
volatile long OLD_RIT_FREQ; ///RIT変化チェック用
// LCDのポート設定
LiquidCrystal lcd(12,11,10,7,6,5,4); // デジタルポート番号、本参照
// 周波数ステップの切替ボタン設定
const int BUTTON = 13; /// ボタン、ステップ切替用
int val = 0; /// 状態変数、0か1、1の場合は10ステップ、0時は100ステップ
int old_val=0; /// 前の状態を記憶
int state = 0; /// 現在のステート
int freq_step =10; /// 周波数ステップ
String TMP; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP1; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP2; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP3; //周波数表示に小数点入れるためのテンポラリ計算用
///スキャン用ボタン設定
const int LED = 15; //実験用LED
const int SCAN_BUTTON = 14; ///スキャンON/OFF用ボタン
int val2 = 0; /// 仮ステータス
int old_val2=0; /// 仮ステータス
int state2=0; /// 仮ステータス
///RIT用ボタン設定
const int RIT_BUTTON = 16; ///スキャンON/OFF用ボタン
int val3 = 0; /// 仮ステータス
int old_val3=0; /// 仮ステータス
int state3=0; /// 仮ステータス
///TX検出用ボタン設定
const int TX_DETECT = 17; ///スキャンON/OFF用ボタン
int val4 = 0; /// 仮ステータス
int old_val4=0; /// 仮ステータス
int state4=0; /// 仮ステータス
//AD9850 DDSモジュールとArduinnoの接続
int clock = 1;//W_CLK
int fqup = 0;//FQ_UD
int data = 8;//DATA
int ddsreset = 9;//RESET
EF_AD9850 AD9850(clock, fqup, ddsreset, data);
// セットアップ、初回のみ実行 ----------------------------
void setup(void) {
// Serial.begin(9600); // シリアル出力 ★シリアルOFFにしておく★
pinMode(2, INPUT); // ロータリーエンコーダーA デジポート2
digitalWrite(2, HIGH); // プルアップ
pinMode(3, INPUT); // ロータリーエンコーダーB デジポート3、Cはグラウンドへ!
digitalWrite(3, HIGH); // プルアップ
pinMode(BUTTON, INPUT); // ボタン、ステップ切替用
pinMode(SCAN_BUTTON, INPUT); /// スキャン用のボタン、トグル化する
pinMode(LED, OUTPUT); // デバッグ用LED
pinMode(RIT_BUTTON, INPUT); /// RIT用のボタン、トグル化する
pinMode(TX_DETECT, INPUT); /// TX検出用ボタン、トグル化する
// LCDのセットアップ
// 16文字×2行のLCDを使用します
lcd.begin(16,2);
MsTimer2::set(1, timerIRQ); // ロータリーエンコーダ読取りのために割込み,1mS毎に割り込み実行
MsTimer2::start();
// AD9850セットアップ関連
AD9850.init();//AD9850の初期化
AD9850.reset();//AD9850リセット
AD9850.wr_serial(0x00, X); //周波数データを送る、初期周波数Xを設定
}
// ループ、実行部分 --------------------------------ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー-
void loop(void) {
// Serial.println(X); ///シリアル出力、RIG作成時不要? ★シリアルOFFにしておく★
// delay(100); 、
// LCDに文字を表示するための処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
DISP_FREQ=DELTA_FREQ+X; // DDSと表示周波数の差分を計算している
TMP = String(DISP_FREQ,DEC); /// 数値→テキスト変換
TMP1=TMP.substring(0,2); // VFOとMHz部分表示VFOして、ピリオド
lcd.home();
lcd.print("VFO:");
lcd.print(TMP1);
lcd.print(".");
TMP2=TMP.substring(2,5); // その後のKHZ表示
lcd.print(TMP2);
lcd.print(".");
TMP3=TMP.substring(5,9); // その後のHz表示
lcd.print(TMP3);
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
/// lcd.print("JQ1SRN YOKOHAMA"); // 表示、後でモードや他の情報表示に使う
// 周波数ステップ切替ボタン ---------------------------------
val = digitalRead(BUTTON); /// ステップ切替ボタン用シーケンス
if ((val == HIGH) && (old_val==LOW)) { /// ボタンが押されたの検出
state = 1-state; /// 前とステート変更
delay(10);
}
old_val = val;
if (state==1){ /// ステート1ならば、、、 ステップ10 暫定として
freq_step=10;
} else { /// ステート0ならば、、、 ステップ100 暫定として
X=X/100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
X=X*100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
freq_step=300;
}
// スキャン開始終了ボタン ---------------------------------
val2 = digitalRead(SCAN_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val2 == HIGH) && (old_val2==LOW)) { /// ボタンが押されたの検出
state2 = 1-state2; /// 前とステート変更
delay(10);
}
old_val2 = val2;
if (state2==1){ /// ステート1ならば、、、 処理A
/// digitalWrite(LED, HIGH);
X=X+500;
/// X=X+freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
if (X>36040000) { /// 36040000=50.350MHzでスキャンを50.150から再スキャン
X=35840000; /// 35840000=50.150から再スキャン
}
} else { /// ステート0ならば、、、 処理B
/// digitalWrite(LED,LOW);
/// スキャンスイッチをもう一度押すと、なにもしない、スキャン停止する
}
// RITボタン ---------------------------------
val3 = digitalRead(RIT_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val3 == HIGH) && (old_val3==LOW)) { /// ボタンが押されたの検出
state3 = 1-state3; /// 前とステート変更、RITがONの時State3は1となる
if(state3==1){
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:ON "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(8,1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
}
delay(10);
}
old_val3 = val3;
if (state3==1){ /// RITがONであれば
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:ON "); // 表示、後でモードや他の情報表示に使う
if (RIT_FREQ!=OLD_RIT_FREQ) {
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(7,1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
OLD_RIT_FREQ=RIT_FREQ;
}
} else { /// /// RITがOFFであれば
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:OFF "); // 表示、後でモードや他の情報表示に使う
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
Y=X;
RIT_FREQ=0;
}
// TX検出 ---------------------------------
val4 = digitalRead(TX_DETECT); /// ステップ切替ボタン用シーケンス
if (val4 == HIGH) { /// ボタンが押されたの検出 val4は送信時「1」となる
/// digitalWrite(LED, HIGH);
lcd.setCursor(14,1); // 横に14、下に1、の位置にカーソル移動
lcd.print("TX"); // 送信時にLCDにTXと表示
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
delay(10);
} else {
/// digitalWrite(LED, LOW);
lcd.setCursor(14,1); // 横に14、下に1、の位置にカーソル移動
lcd.print("RX"); // 受信時にLCDにRXと表示
if(state3 == HIGH){
AD9850.wr_serial(0x00, Y); /// RIT補正の周波数データを送る アップ
}
delay(10);
}
}
// 割り込み時に実行されるプログラム ロータリー処理、周波数変更、AD9850アップデート --ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void timerIRQ() { // MsTimer2割込み処理
static byte bp = 0; // ビットパターン記録バッファ
bp = bp << 1;
if (digitalRead(2) == HIGH) { // A相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp << 1;
if (digitalRead(3) == HIGH) { // B相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp & 0x0F; // 下位4ビット残して上位を消す
if (bp == 0b0111) { // このビットパターンと一致していたら /// ロータリー右回し
// if ((bp == 0b0111) | (bp == 0b1000)) { // 場合によってはこちら、
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ=RIT_FREQ+10;
Y=X+RIT_FREQ;
AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
}else{ /// RITモードでない場合
X=X+freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
if (bp == 0b1011) { // このビットパターンと一致していたら、 /// ロータリー左回し
// if ((bp == 0b1011) | (bp == 0b0100)) { // 場合によってはこちら
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ=RIT_FREQ-10;
Y=X+RIT_FREQ;
AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
}else{ /// RITモードでない場合
X=X-freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
}
//------------------------------------------
WRKさんからRITに関するツーイートを頂いた、、
そういや、RIT実装していなかった、、
よし、ついでにやっちゃおう!
と思って取り掛かりました、、、
が、結構苦戦しました、
やっぱしちゃんとフロー図とか書かないでやっていると限界
あるのかな、、途中で何をやっているのか分からんようになってきた、、
という事で、
とりあえず動くようにはなったけど、
コードが全くイケテないというか、、
よく分からないモードに突入です。
とりあえず、下記の様な機能は実装できたww
・ロータリーエンコーダー機能
・VFO・表示周波数変換機能
・周波数ステップ変更機能
・オーとスキャン機能
・RIT機能
・TX/RXステータス識別機能

/*
/*
DDSコントローラーシステム
DDS: AD9850
ロータリーエンコーダー:EC12PLRGBSDVBF-D-25K-24-24C-61 秋月
2015/04/12-2
使用IOポート
0: AD9850 FQ_UD
1: AD9850 CLK
2: ロータリーエンコーダーA
3: ロータリーエンコーダーB
4: LCD , Refer to P186 Arduinoを始めよう
5: LCD , Refer to P186 Arduinoを始めよう
6: LCD , Refer to P186 Arduinoを始めよう
7: LCD , Refer to P186 Arduinoを始めよう
8: AD9850 DATA
9: AD9850 RESET
11: LCD , Refer to P186 Arduinoを始めよう
12: LCD , Refer to P186 Arduinoを始めよう
13:周波数ステップ切替スイッチ(ロータリエンコーダスイッチ利用) ロータリー側コネクター6、5はGへ
14: A0 スキャン開始、停止用押しボタンスイッチ
15: A1 デバッグ用LED接続
16: A2 RIT ONスイッチ
17: A3 TX検出、受信時にのみRIT-ON
18: A4 CWモード(検出受信時600Hz程度シフトしたい)
*/
// ヘッダー関連 -----------------------------------
#include
#include
#include
// 初期設定関連 -----------------------------------
// 初期周波数設定
volatile long X=35840000; ///液晶に表示する数字、周波数Hz
volatile long Y=35840000; /// RIT時のテンポラリー
volatile long DISP_FREQ=50150000; /// LCD表示周波数
volatile long DELTA_FREQ = DISP_FREQ-X; ///差分記憶
volatile long RIT_FREQ=0; ///RIT用周波数
volatile long OLD_RIT_FREQ; ///RIT変化チェック用
// LCDのポート設定
LiquidCrystal lcd(12,11,10,7,6,5,4); // デジタルポート番号、本参照
// 周波数ステップの切替ボタン設定
const int BUTTON = 13; /// ボタン、ステップ切替用
int val = 0; /// 状態変数、0か1、1の場合は10ステップ、0時は100ステップ
int old_val=0; /// 前の状態を記憶
int state = 0; /// 現在のステート
int freq_step =10; /// 周波数ステップ
String TMP; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP1; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP2; //周波数表示に小数点入れるためのテンポラリ計算用
String TMP3; //周波数表示に小数点入れるためのテンポラリ計算用
///スキャン用ボタン設定
const int LED = 15; //実験用LED
const int SCAN_BUTTON = 14; ///スキャンON/OFF用ボタン
int val2 = 0; /// 仮ステータス
int old_val2=0; /// 仮ステータス
int state2=0; /// 仮ステータス
///RIT用ボタン設定
const int RIT_BUTTON = 16; ///スキャンON/OFF用ボタン
int val3 = 0; /// 仮ステータス
int old_val3=0; /// 仮ステータス
int state3=0; /// 仮ステータス
///TX検出用ボタン設定
const int TX_DETECT = 17; ///スキャンON/OFF用ボタン
int val4 = 0; /// 仮ステータス
int old_val4=0; /// 仮ステータス
int state4=0; /// 仮ステータス
//AD9850 DDSモジュールとArduinnoの接続
int clock = 1;//W_CLK
int fqup = 0;//FQ_UD
int data = 8;//DATA
int ddsreset = 9;//RESET
EF_AD9850 AD9850(clock, fqup, ddsreset, data);
// セットアップ、初回のみ実行 ----------------------------
void setup(void) {
// Serial.begin(9600); // シリアル出力 ★シリアルOFFにしておく★
pinMode(2, INPUT); // ロータリーエンコーダーA デジポート2
digitalWrite(2, HIGH); // プルアップ
pinMode(3, INPUT); // ロータリーエンコーダーB デジポート3、Cはグラウンドへ!
digitalWrite(3, HIGH); // プルアップ
pinMode(BUTTON, INPUT); // ボタン、ステップ切替用
pinMode(SCAN_BUTTON, INPUT); /// スキャン用のボタン、トグル化する
pinMode(LED, OUTPUT); // デバッグ用LED
pinMode(RIT_BUTTON, INPUT); /// RIT用のボタン、トグル化する
pinMode(TX_DETECT, INPUT); /// TX検出用ボタン、トグル化する
// LCDのセットアップ
// 16文字×2行のLCDを使用します
lcd.begin(16,2);
MsTimer2::set(1, timerIRQ); // ロータリーエンコーダ読取りのために割込み,1mS毎に割り込み実行
MsTimer2::start();
// AD9850セットアップ関連
AD9850.init();//AD9850の初期化
AD9850.reset();//AD9850リセット
AD9850.wr_serial(0x00, X); //周波数データを送る、初期周波数Xを設定
}
// ループ、実行部分 --------------------------------ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー-
void loop(void) {
// Serial.println(X); ///シリアル出力、RIG作成時不要? ★シリアルOFFにしておく★
// delay(100); 、
// LCDに文字を表示するための処理ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
DISP_FREQ=DELTA_FREQ+X; // DDSと表示周波数の差分を計算している
TMP = String(DISP_FREQ,DEC); /// 数値→テキスト変換
TMP1=TMP.substring(0,2); // VFOとMHz部分表示VFOして、ピリオド
lcd.home();
lcd.print("VFO:");
lcd.print(TMP1);
lcd.print(".");
TMP2=TMP.substring(2,5); // その後のKHZ表示
lcd.print(TMP2);
lcd.print(".");
TMP3=TMP.substring(5,9); // その後のHz表示
lcd.print(TMP3);
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
/// lcd.print("JQ1SRN YOKOHAMA"); // 表示、後でモードや他の情報表示に使う
// 周波数ステップ切替ボタン ---------------------------------
val = digitalRead(BUTTON); /// ステップ切替ボタン用シーケンス
if ((val == HIGH) && (old_val==LOW)) { /// ボタンが押されたの検出
state = 1-state; /// 前とステート変更
delay(10);
}
old_val = val;
if (state==1){ /// ステート1ならば、、、 ステップ10 暫定として
freq_step=10;
} else { /// ステート0ならば、、、 ステップ100 暫定として
X=X/100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
X=X*100; // 100ステップ時に10の桁をゼロにリセットして見た目をよくする
freq_step=300;
}
// スキャン開始終了ボタン ---------------------------------
val2 = digitalRead(SCAN_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val2 == HIGH) && (old_val2==LOW)) { /// ボタンが押されたの検出
state2 = 1-state2; /// 前とステート変更
delay(10);
}
old_val2 = val2;
if (state2==1){ /// ステート1ならば、、、 処理A
/// digitalWrite(LED, HIGH);
X=X+500;
/// X=X+freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
if (X>36040000) { /// 36040000=50.350MHzでスキャンを50.150から再スキャン
X=35840000; /// 35840000=50.150から再スキャン
}
} else { /// ステート0ならば、、、 処理B
/// digitalWrite(LED,LOW);
/// スキャンスイッチをもう一度押すと、なにもしない、スキャン停止する
}
// RITボタン ---------------------------------
val3 = digitalRead(RIT_BUTTON); /// ステップ切替ボタン用シーケンス
if ((val3 == HIGH) && (old_val3==LOW)) { /// ボタンが押されたの検出
state3 = 1-state3; /// 前とステート変更、RITがONの時State3は1となる
if(state3==1){
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:ON "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(8,1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
}
delay(10);
}
old_val3 = val3;
if (state3==1){ /// RITがONであれば
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:ON "); // 表示、後でモードや他の情報表示に使う
if (RIT_FREQ!=OLD_RIT_FREQ) {
lcd.print(" "); // 表示、後でモードや他の情報表示に使う
lcd.setCursor(7,1); // 横に0、下に1、の位置にカーソル移動
lcd.print(RIT_FREQ); // 表示、後でモードや他の情報表示に使う
lcd.print("Hz"); // 表示、後でモードや他の情報表示に使う
OLD_RIT_FREQ=RIT_FREQ;
}
} else { /// /// RITがOFFであれば
lcd.setCursor(0,1); // 横に0、下に1、の位置にカーソル移動
lcd.print("RIT:OFF "); // 表示、後でモードや他の情報表示に使う
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
Y=X;
RIT_FREQ=0;
}
// TX検出 ---------------------------------
val4 = digitalRead(TX_DETECT); /// ステップ切替ボタン用シーケンス
if (val4 == HIGH) { /// ボタンが押されたの検出 val4は送信時「1」となる
/// digitalWrite(LED, HIGH);
lcd.setCursor(14,1); // 横に14、下に1、の位置にカーソル移動
lcd.print("TX"); // 送信時にLCDにTXと表示
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
delay(10);
} else {
/// digitalWrite(LED, LOW);
lcd.setCursor(14,1); // 横に14、下に1、の位置にカーソル移動
lcd.print("RX"); // 受信時にLCDにRXと表示
if(state3 == HIGH){
AD9850.wr_serial(0x00, Y); /// RIT補正の周波数データを送る アップ
}
delay(10);
}
}
// 割り込み時に実行されるプログラム ロータリー処理、周波数変更、AD9850アップデート --ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
void timerIRQ() { // MsTimer2割込み処理
static byte bp = 0; // ビットパターン記録バッファ
bp = bp << 1;
if (digitalRead(2) == HIGH) { // A相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp << 1;
if (digitalRead(3) == HIGH) { // B相の状態を
bp |= 0x01; // bpの末尾に記録
}
bp = bp & 0x0F; // 下位4ビット残して上位を消す
if (bp == 0b0111) { // このビットパターンと一致していたら /// ロータリー右回し
// if ((bp == 0b0111) | (bp == 0b1000)) { // 場合によってはこちら、
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ=RIT_FREQ+10;
Y=X+RIT_FREQ;
AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
}else{ /// RITモードでない場合
X=X+freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
if (bp == 0b1011) { // このビットパターンと一致していたら、 /// ロータリー左回し
// if ((bp == 0b1011) | (bp == 0b0100)) { // 場合によってはこちら
if ((state3 == HIGH) && (val4 == LOW)) { /// RITモードがONでRX状態ならば
RIT_FREQ=RIT_FREQ-10;
Y=X+RIT_FREQ;
AD9850.wr_serial(0x00, Y); /// 周波数データを送る アップ
delay(10);
}else{ /// RITモードでない場合
X=X-freq_step;
AD9850.wr_serial(0x00, X); //周波数データを送る アップ
}
}
}
//------------------------------------------
- 関連記事
-
-
ロータリーエンコーダー用のArduinoライブラリ
-
割り込み実験
-
AE-ATMEGA328-MINIの入力電圧MAXは本当に12Vなんですか?
-
備忘録: LCD 2004 20x4 Display Shield Blue Backlight
-
RTCモジュール、PC時間を自動に時間設定
-
ATMEGA328P I/Oの電圧
-
AE-ATMEGA328-MINIが供給可能な消費電流→150mA
-
EEPROM実験
-
TMGA328Pブートローダー入り
-
LCDチカチカ TX/RX
-
Arduino続き(ロータリー、DDS、LCD) RIT機能
-
アナログピンをデジタルで使う
-
Arduino続き
-
Arduino購入
-