JH7UBCブログ

アマチュア無線、マイコンなど趣味のブログです。

PIC

[ リスト | 詳細 ]

記事検索
検索

全16ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]

PICKit3

 2013年からPICの勉強を始め、プログラミングと製作を行ってきました。

 開発環境は、MPLAB IDE v8.92で、言語はアセンブラ。

 PICライタ(プログラマー)は全て自作で、RCDライタ、JDMライタ、Writer509、Writer509USB、PICerFTを製作し、

 Writer509USBとPICerFTは、現在も使用しています。

 しかし、使用するPICを新しい種類にしようとするとMPLABでは対応していません。

 そこで、この機会にIDEをMPLABXにして、言語はXC8にしようと思い立ちました。

 更に、PICライタも互換機が比較的安く手に入るPICKit3を購入することにして、AmazonからANBEのPICKit3互換機のセットを購入しました(2,699円)。発注すると翌日届き、箱を開けると次のようなものが入っていました。

イメージ 1

 PICKit3本体の説明書は、ここで見ることができます。

 ゼロプレッシャーソケットがついたZIFソケット基板の裏側には、PICの挿入位置とジャンパースイッチJ1,J2,J3のセットの簡単な説明が書いてあります。

イメージ 3


イメージ 2

 どのような回路になっているのか、テスターで接続を確認して回路図にしてみました。(私が調べたものです)

イメージ 4

 PICのセットの仕方とジャンパーピンのセットの仕方の説明書が入っていました。

 それによると、

 40pinと28pinのPICの場合は、PICの1番ピンをソケットの1番ピンに合わせてセットして、J1がA、J2が2-3、J3が2-3にセットします。

 8,14,18,20pinのPICの場合は、PICの1番ピンをソケットの11番ピンに合わせてセットして、J1がB、J2が2-3、J3が2-3にセットします。

 PIC16F57とPIC10EXについても説明がありますが、ここでは省略。

 さて、このPICライタ(プログラマー)を使ってみようと思います。

 1月に、回路としては完成していたPIC16F628A 883周波数カウンタをようやくケースに入れました。

 ケースは、タカチの定番のYM-150を使いました。YMシリーズは加工しやすく気に入っています。

 ただ、今回は、7セグメントLEDを使いましたので、フロントパネルに大きな窓を開けなければならず、ちょっと苦労しました。
 7セグメントLEDをの前には、LEDと同色の青色のアクリル板を取り付けました。

イメージ 1


 内部の配線の様子です。

イメージ 2

 これで、一応完成とします。

 7セグメントLED表示はたいへん見やすく、FBです。

 測定可能周波数は、40MHz程度ですが、プリスケーラをつければ、UHFまでカウント可能になるでしょう。

 電源は、5Vで、電流は、最大で40mAです。(表示する数字で変わります)

 将来は、電池を内蔵して、外部電源との2電源化も考えています。
 前の記事では、主にAD9834DDSを制御するSPI(Serial Peripheral Intrerface)について書きました。

 今回は、周波数データ(バイナリ)からDDSに送るデータをどのように生成するかを書きます。

 周波数データ f(Hz) は、4バイト(32ビット)とし、F3,F2,F1,F0に格納します。

 DDSは、f = ΔPhase ×fmclk / 2^28 という関係式で目的の周波数 f を生成します。

 ここで、ΔPhaseがDDS用のデータで、fmclkは、DDSのマスタークロックです。

 DDS用のマスタークロックは、今回 67.108864MHz=2^26Hzを使っていますので、この値をfmclkに代入すると

 f = Δphase × 2^26 / 2^28 = ΔPhase / 2^2 となります。

 従って、DDS用データは、ΔPhase = f × 2^2 となり、周波数データを4倍すれば良いことになります。

 周波数データを4倍するのは簡単で、fのデータ(F3,F2,F1,F0)を全体的に左に2ビットシフトすれば良いのです。

 周波数データは、表示などにも使いますので、一旦DDS用のデータを格納するP3,P2,P1,P0に移して、下位から、つまりP0から左に1ビットシフトします。更に1ビットシフトを繰り返し、全体的に2ビット左にシフトします。

 アセンブラでは、

 SHIFT_L2
      BCF STATUS,C ;C=0
      RLF P0,F
      RLF P1,F
      RLF P2,F
      RLF P3,F
      BCF STATUS,C ;C=0
      RLF P0,F
      RLF P1,F
      RLF P2,F
      RLF P3,F
      RETURN

 レジスタを左にシフトした場合最上位ビットがキャリーCに入ります、前のCの値は最下位ビットに入ります。
 最初にキャリーCをクリアしておいて、最下位バイトから左シフトを繰り返せば、全体的に左に1ビットシフトできます。これを2回繰り返します。

 例えば、1MHz=1000000Hz=0x00 0F 42 40 ですので、左に2ビットシフトすると0x00 3D 09 00となり、これがDDSに送るデータになります。(実際のDDSデータは28ビットですから、このデータの下位から28ビットがデータになります)

 AD9834DDSでは、制御データや周波数データは、16ビットずつMSB(最上位ビット)FirstでSPI通信で送ります。

 この送り方のパターンはいくつかあるのですが、典型的なケースについて説明します。

 最初にコントロールワード(16ビット)を送ります。上位2ビットD15,D14を00にすれば、コントロールデータになります。
 D13が、周波数データをどのように送るかを指定するビットで、1にすると28ビットの周波数データを下位、上位の順に2回送ることを指示することになります。

 D12〜D0は、全て0として、コントロールワードは、0x20とし、最上位ビットから16ビットをSPIでDDSに送ります。

 次に、周波数データの下位14ビットに、レジスタをしてするビットD15,D14を加えて送信します。D15=0.D14=1でFREQレジスタ0を指定します。(FREQレジスタは、独立して0と1があります。)

 DDS用データP3,P2,P1,P0のP1,P0の下位から14ビットを送信用データD1,D0に移し、上位2ビットに01を加えてSPIでDDSに送信します。

 次に、P3,P2,P1,P0を全体的に2ビット左にシフトし、P3,P2の下位14ビットをD1,D0に移し、上位2ビットに01を加えて、送信します。

 以上で、目的周波数のデータがDDSにセットされ、目的周波数が発生します。

 けっこう回りくどいですが、何かの参考になれば幸いです。
 
 AD9834DDSをPICで制御する実験は、一昨年、PIC16F883のMSSPモジュールを使って行いました。

 しかし、上手くいかずに中断して、Arduinoでの制御に切り替えて動作させました。

 Arduino(あちゃんでいいの)で制御したAD9834DDSを使ったVFOは、7MHz用のアカギスタンダードに搭載して実際の交信に使っています。

 今回は、PIC16F628AでAD9834DDSを制御する実験を行い、うまくいきましたので、記事を掲載したいと思います。

 今更とも思うのですが、PICを使ったAD0934DDS制御の例はWeb上には少なく、アセンブラで記述された例はほとんど見ません。


 この記事とArduinoでの制御スケッチを見て気づいたのですが、AD9834を制御するSPI信号のシリアルタイミングに問題があって、動かなかったようです。

 そこで、再度AD9834DDSの説明書(日本語版)を見ると、シリアルタイミングは次のようになっています。

イメージ 1
まず、FSYNCをLOWにしてから、SDATAを有効にして、クロックSCLKの立下りで、DDSにデータが読み込まれます。

次のようなアセンブラプログラム(サブルーチン)を作って試してみました。
D1,D0にDDSに送るデータ(8+8=16ビット)を入れておきます。

SPI_SEND
    MOVLW d'16'  ;送信ビット数
    MOVWF DCNT  ;カウンタにセット
    BCF  SPI_FS  ;FSYNC=LOW SPI start
SPI_LOOP
    BCF  STATUS,C ;Cクリア
    RLF  D0,F  ;左に1ビットシフト
    RLF  D1,F
    BTFSC STATUS,C ;C=0ならスキップSDATA=0
    GOTO DATA1  ;C=1ならSDATA=1
    BCF  SPI_DA
    GOTO NEXT
DATA1
    BSF  SPI_DA
NEXT
    BCF  SPI_CK  ;SCLK=LOW
    BSF  SPI_CK  ;SCLK=HIGH
    DECFSZ DCNT  ;DCNT=0ならスキップ
    GOTO SPI_LOOP
    BSF  SPI_FS  ;FSYNC=HIGH SPI end
    RETURN

 MPLAB IDEのロジックアナライザでシミュレーションしてみると次のようになります。

イメージ 2

 一見、説明書の図とは違って見えますが、タイミングは指定どおりです。

 PIC16F628Aは、内部クロック4MHzで動作させますので、1サイクルは1usです。従ってSCLKのパルス幅は、1usです。

 実験回路の回路図です。

イメージ 3

 AD9834DDSの制御方法については、私のホームページ(JH7UBCホームページ)の記事をご覧ください。

 今回は、1MHzを発生させるプログラムを作りました。

 ブレッドボードと周波数カウンタの様子です。

イメージ 4

 なお、プログラムの詳細は、次回掲載します。

 これにディスプレイとロータリーエンコーダを加えて、VFOに仕上げてみたいと思っています。

PIC16F628A/648A動かない?

 PIC16F628A PIC16F883周波数カウンタのプログラミングが終わりましたが、もう少しPICで遊んでみようと思います。
 一昨年、AD9834DDSをPIC16F883のSPIでコントロールしようと思ってやったのですが、うまくいかず、結局Arduinoでコントロールすることになりました。このVFOは、7MHz用のアカギスタンダードに使用しました。

 もう一度PICでのAD9834DDSのコントロールに挑戦してみようと思います。

 PICは、カウンタにも使用したPIC16F628Aを使ってみましょう。

 PIC16F628Aの様々なテストをするために、電池(3V)駆動で、簡単なプログラムを組んでみましたが、動きません。
 プログラムのチェック、配線のチェックをしても、うんともすんとも言いません。

 うーーーん。

 ひょっとして、電源か、と思い、5Vの電源をつないだら、動きました!

 Webで調べてみるとPIC16F628A/648Aでは、ブラウンアウトリセットがON(有効)になって入ると4.5V以下では動作しないんだそうです。ふーーんそうなんだ。

 __CONFIG で _BROREN_OFFとしてみたら、電池3Vでちゃんと動きました。

 PICも気が付かないところに落とし穴があるものですね。

全16ページ

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11]

[ 次のページ ]


.
JH7UBC
JH7UBC
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

よしもとブログランキング

もっと見る

[PR]お得情報

ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事