2015年05月02日

ISPでArduinoを楽しむ! U

連休で時間があると一気に進みます。
とりあえず、LCD表示、タイマー割り込みによるロータリーエンコーダーのカウント取り込み、中華製DDS(AD9850)の制御による出力周波数可変まで出来上がりました。

DSC01108.jpg

プログラムの書式など、今までのBASICとは勝手が違い、書式エラーを沢山出しながらでしたが、なんとなく雰囲気がつかめて来ました。
LCD表示、タイマー割り込み、DDS(AD9850)については、サイト検索でライブラリーが見つかり、簡単に実現することができました。特に、DDSのライブラリは中華製DDSの基準クロック125MHzをベースに作ってあり、周波数データとして必要な周波数を10進数で記述するだけで(ex.7000000で7MHzとなる)簡単に出力することができます。途中の計算プログラムを考える必要がありません。

DSC01110.jpg

ローカルのOMさんが言われていた、ライブラリのコピペで簡単にできますよ!が、確かにそうだな〜と言った印象です。
ただ、ロータリーエンコーダーの取り込みのプログラムは自分で作りました。ライブラリは沢山見つかるのですが、殆どが外部割込みによるライブラリです。
当局の経験的には、外部割込みでエンコーダーを使用すると殆どの仕事が割り込み処理になってしまいほかの仕事に影響が出るのと、チャタリングの処理で結構苦労します。(ライブラリにはチャタの処理つきが多いですが)
これまでは、タイマー割り込みでうまく動いていたので今回もそれで作ってみました。割り込みは1mSとしていますが、1回転20パルス程度でしたらもっと遅くても問題は出ないと思います。ただ、今までは4倍速でカウントしていたのですが、今回は4倍速は実現できていません。もう少しソフトのコマンドを勉強しないとダメです。



ライブラリは別になりますが、今回のプログラムを参考のために記載しておきます。
(goto文を多用するなどCライクではありませんがあしからず)
これだけの記述で機能が実現できているよ!という参考程度にお願いします。

/*

The circuit:
* LCD RS pin to digital B0
* LCD Enable pin to digital B1
* LCD D4 pin to digital B2
* LCD D5 pin to digital B3
* LCD D6 pin to digital B4
* LCD D7 pin to digital B5
* LCD R/W pin to ground

*/

// include the library code:
#include
#include
#include

#define enc0 A4
#define enc1 A5

#define led0 A0
#define led1 A1

int enccnt = 0;
int encold = 0;
long fcnt = 7000000;
int intcnt = 0;


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
EF_AD9850 AD9850(7, 6, 4, 5);// (CLK,F-UP,RST,Data)

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);

pinMode(enc0,INPUT_PULLUP);
pinMode(enc1,INPUT_PULLUP);

pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);

MsTimer2::set(1, timer2int); // 1ms period
MsTimer2::start();

AD9850.init();
AD9850.reset();
AD9850.wr_serial(0x00, 1000000); //1000000Hz
// initialize serial communications at 115200 bps:
Serial.begin(115200);

}


void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
lcd.print("JN3XBY/1");

lcd.setCursor(9, 0);
// print the number of seconds since reset:
//lcd.print(millis() / 500);
lcd.print("Arduino");

lcd.setCursor(0, 1);
lcd.print("FREQ=");

AD9850.wr_serial(0x00,fcnt);

// lcd.setCursor(0,1);
lcd. print(fcnt);
lcd. print("Hz");

}

//*** Timer2 INT Routine***************************
void timer2int() {

//*** Encoder Count Routine ***
if (digitalRead(enc0) == LOW) {goto ret;}
if (encold == 1) {goto ret1;}
encold = 1;
if (digitalRead(enc1) == HIGH) {fcnt = fcnt + 10;}
if (digitalRead(enc1) == LOW) {fcnt = fcnt -10;}
goto ret1;
ret:
encold = 0;
ret1:
//*******************************

//*** 100mS LED ON/OFF **********
intcnt = intcnt + 1;
if (intcnt < 100){goto ret2;}
static boolean output = HIGH;
digitalWrite(led1, output);
output = !output;
intcnt = 0;
ret2:
//*******************************
;
}
//************************************************
posted by ja6irk at 11:43| Comment(4) | TrackBack(0) | AVR&Arduino
この記事へのコメント
こんばんは。
早速、やってますね。いつも仕事?が早いので感心しています。
今日は風邪をひいてしまい、体調が優れません。秋葉原の懇親会には参加されたのでしょうか。

arduinoはハードウエアを隠蔽しているので、内部のレジスターとかタイマーカウンターを意識しなくてもできてしまうとこがいいですね。PICのレジスターは少しは分かるのですが、AVRはサッパリわからないのですが、内部のハードを意識することなく動かすことができました。

また、やる気になれば直接ハードをたたくこともできるし、色々と応用が効きそうですね。
何と言っても、ライブラリーが揃っているのがいいです。

私はDDSのVFOにつなげる受信機をやり始めました。9MHzのIFアンプですが3段にしたのでしっかり発振しています。この連休中にIFアンプぐらい仕上げたいのですが・・・。まだまだ楽しめそうです。

それではまた。
Posted by JK1LSE/本田 at 2015年05月02日 21:00
LSE 本田さん、こんばんは。
先ほどQRP懇親会から帰りました。
本田さんとお会いできなくて残念でした。
体調不良との事、ご自愛ください。
Arduinoha、本田さんの刺激を受け後押しされて、始めてみました。BASCOMで数ヶ月掛かったところが、2日足らずでできてしまい驚きです。
書式とコマンドをちゃんと覚えないと、と思っています。
今日、aitendoによって、UNOのkitを買ってきました。ブートローダのテスト用です。普通は逆ですよね! ALIEXPRESSからも面白そうなボードを注文しておきました。使わないかもしれませんが!
先日入手したSi5351の制御もやってみたいのですが、明日からは野暮用があってできません。
しばらくおあ付けです。
TRXの完成楽しみですね!
Posted by jn3xby 岩永 at 2015年05月02日 22:12
岩永さん、こんにちは。連休も終わりそうですね。
Arduino活用がずいぶん進んできましたね! ハードの統一で安価に供給、ソフトのライブラリ公開と合わせてマイコン工作の敷居を低くしてくれましたね。組み込み用にはどうかなあと思ったので、私はパスしてきました。hi hi ぜひ面白いものを製作されて下さい。 岩永さんの活用を注目しています。
Posted by JATTT/1 加藤 at 2015年05月06日 15:49
TTT 加藤さん、こんばんは。
コメントありがとうございます。
そうなんです。Arduinoは専用ボードで組み込みには不向きかと思って当局も避けていたのですが、なんとそうでないことがわかりました。
素のAVRにISPで書き込みができるんですよ!
USBで書き込むだけのために、専用ボード化されています。これによってポートのI/Fが統一され、誰でも使えるライブラリが増殖しているのです。
実際のAVRのピン番号と、専用ボードのポート番号をあわせれば、組み込みでライブラリがそのまま動きます。ライブラリによっては、ポートを変更することも可能です。
今回も実験は、ATMEGA168を使用して、ブレッドボードでISP書き込みで行いました。
ハード的には、これまでのBASCOMとなんら変わらないです。
ライブラリが沢山あるだけ、可能性が広がりそうです。
当面は、これまで作ったものの焼き直しで練習になると思いますが。

Posted by jn3xby 岩永 at 2015年05月06日 21:41
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/125654799

この記事へのトラックバック