JA1QVM

アマチュア無線機とアンテナを作ることそして温泉が大好き。

PIC12F683/I2C・・・その1

Si5351制御、液晶画面操作をしたいが為に I2Cを勉強しはじめたのですが、何の事は無い最初から I2Cモードを内部に格納してある PICが有るじゃないですか。
しかもデバイスの価格も変わらない位、安いです。
いっぺんにヤル気が失せました・・・

・・・・・・・・・・あ〜あ、ヤダヤダ・・・・・・・・・・でも、愚痴っていてもしょうがないので一応 I2Cを 12F683で出来る様にしますが、お急ぎの人は I2C内蔵 PICを使う事をお勧めします。

I2Cでデータを送る仕組みは [SCL]と云うタイミングを計る連続パルス信号と、[SDA]と云う送りたいデータ信号の、決まりを持った絶妙な組み合わせで成り立っています。
そして同じバスライン上に複数の子機(スレーブ)が繋がっていて、そのスレーブアドレスを指定してデータを送れば、異なるアドレスのスレーブは全く感知せず、指定したスレーブだけにデータを送れると云うシステムです。
ですから今回の様に Si5351を制御しつつ、液晶画面(SCD)に周波数をほぼ同時に表示させる事が可能です。

完全に I2Cの仕組みを知りたい方は専門書をお読み下さい。
かなり読み応えが有ると思います。
私は前に買っておいた「8ピン PICマイコンの使い方がよくわかる本」を参考にしました。

下に関数として取り扱う I2Cの 8bitデータ出力プログラムを上げて置きます。
上から順に関数名で・・・

STA():スタート条件の出力
STP():ストップ条件の出力
OUT(data):1バイト・8bitデータ出力/確認信号 ACK受信
上3個の関数だけです。

 STA(){
 SDA=0;TRISSDA=0;
}

 STP(){
 SCL=0;__delay_us(1);
 SDA=0;TRISSDA=0;
 SCL=1;__delay_us(1);
 SDA=1;__delay_us(10);
}

 OUT(data){ ・・・此の関数で、スレーブに送る 8bit信号を書き込みます
 unsigned char BP,ACK,i;
 TRISSDA=0;BP=128;
 for(i=0;i<8;i++){ SCL=0;
 if((data&BP)!=0) SDA=1;
 else SDA=0;
 BP=BP>>1;SCL=1;  ・・・無事に 8bit信号を1個送りました。
}
 SCL=0;TRISSDA=1;__delay_us(2);
 SCL=1;__delay_us(2);
 ACK=SDA;return(ACK);  ・・・スレーブからの確認信号(ACK)チエック
}

以上で I2Cの基本はオシマイです。
後はスレーブの条件で色々な関数がぶら下がります。
当然ながら今回のプログラムは関数だけですから、此れだけでは動作しません。
次回から液晶画面を繋げて、実際の I2C動作の確認をしたいと思います。
尚、関数の内容プログラムは一度しか書きません。
それ以降は関数名だけの「サブルーチン」として扱います。
そうしないとプログラムが長すぎて、作った本人さえ解らなく成る・・・実際に良く起こりそう!

12F683で I2Cをやって見たい人に参考になれば幸いです。
お楽しみに・・・   by    JA1QVM

この記事に

開く コメント(0)

開く トラックバック(0)

PIC12F683/Si5351制御

PICマイコンを始めた時に、何時の日か Si5351(クロックジェネレータ)制御が出来れば良いな〜と漠然と考えていました。
色々、自分なりにプログラムを組めるようになり、そろそろ本腰を入れて「本丸」にアタックします。

Si5351:クロックジェネレータと云われるモノで PLL/分周器が内蔵されている高周波発振器と書いてあります。
アマチュア無線機の自作を趣味でやっている人は多分に興味があると思います。
5個ほど購入(@500)して現物を見ましたが・・・小さいです。

イメージ 1


プリ説によると・・・
1:2.5kHz〜200MHzの出力が可能・・・「凄い」の一言

2:3チャンネルの出力がある・・・互いのアイソレーションは如何なの?

3:出力波形は矩形波・・・高調波が沢山出るのかな?

4:周波数は I2Cで設定する・・・何ですか[I2C]って?

以上ですが、2:については1信号だけを目的にすれば関係ないです。
3:は LPFを入れれば良いかな?特に DBMをドライブするには矩形波の方が良いとノタマウ人も居るくらいですから・・・
問題は4:です。
う〜ん「I2C・I2C・I2C・・・・・」と連呼しても全く前に進みません。
そう云えば「使い方がよくわかる」に書いてあった様な・・・
早速、調べて見ました。
読み方は「アイツーシー」と云うらしい・・・フムフム。
I2Cインターフェース内蔵のデバイス(当に Si5351)間のシリアル通信?を行う為のもの・・・だそうです。
因みに Si5351と一緒に購入した「小型8文字*2行液晶」にも I2C接続と書いてあります。
つまり此処で I2Cを得とくすれば、液晶画面に周波数を表示させながら自在にロータリーエンコーダ等で Si5351の周波数制御が可能(そのプログラムが組めれば)な訳です。

此れはもう、やるっきゃないですね!(高価な DDSVFOを買う必要が無い)凄〜い楽しみ・・・
by    JA1QVM

この記事に

開く コメント(2)

開く トラックバック(0)

W-DBM

題目の [W-DBM]とは特性の揃った2個のバランスド・モジュレータの意味です。

ひょんな事から 7MHzダイレクトPSN/SSBジェネレータの実験をやる羽目になりました。
当然ダイレクトですからキャリア周波数=運用周波数(今回は 7000-7200kHz)になります。
つまりバンド幅を持つ訳で、長い自作の経験でも初めてです。
実験と思いつつ、取りあえずバランスド・モジュレータ(BM)を2個組んでみます。
PSN式では後段に RFフィルタが在りませんから、キャリアサプレッションはBMの性能に支配されます。
そこで自分で一番自信のある、ダイオードDBMを2こ作った場面を自慢げに?公表します。
イメージ 1
トランスコアは定番のフェライトビーズ FB801を使います。
今回は扱う周波数が 7MHzですから巻数は 5回にして、線径は 0.15mmを使いました。
20cm/3本の線を・・・
イメージ 2
指先で軽くヨジリます。
イメージ 3
ビーズに通して(巻数が奇数ですから、ほぼ真ん中にビーズを持ってくる)爪楊枝で型を揃えます。
イメージ 10
5回巻いた結果が・・・
イメージ 4
後は線を短くして、各々のコイルの巻き始め・終りをテスターで確認して
イメージ 5
センタータップを作って、コイルは出来上がりです。
イメージ 6
予め一刀彫しておいた基板と、クワッド・ダイオード/487C-1です。
イメージ 7
先にダイオードを基板に半田付けします。
イメージ 8
そして最後に先程作ったトランスを乗っけてオシマイです。
イメージ 9
PSNですから和算(今回は引き算)用のトランス(BM用と同じ)も取り付けました。

実験用として軽い気持で作りましたが、果たして陽の目を見る日が来るのか興味津々で終ります。
by    JA1QVM

この記事に

開く コメント(0)

開く トラックバック(0)

その1でVRの中点から来ている 7pinに低周波信号を入力すれば、それで終りのはずです。
でも考えて見れば交流ですから、プラス・マイナス両方共に同じ様にしなくては・・・と気付きました。
これは 7pinに直流バイアスを掛けると云うことです。
つまり 6pinの基準電圧の半値を加えます。
そして、なるべく 10bit全てを利用したい訳で、何か細工をしないとマズイでしょう。
其処で入力電圧に比例して基準電圧も変化する、オートゲインコントロール (AGC)回路を付けました。
下に配線図を・・・
イメージ 1
5Vの電源接続を書き忘れました・・・上の横ラインです。
非常に怪しげな回路ですが巧く動作するようです。

原理は入力信号を整流した直流電圧で FET(2SK192)のソース電圧を変化させています。
其の先の Sid*3は、いわゆるゲタを履かして見かけ上の変化を大きくしています。

出来具合は・・・
イメージ 2
何時もの通り酷いです。

実際に低周波を入力した時の出力波形を・・・
1000Hz
イメージ 3
此の辺までは綺麗です。
2000Hz
イメージ 4
う〜ん・・・
3000Hz
イメージ 5
何でこうなるの?
4000Hz
イメージ 6
周波数が高くなると振幅が小さくなるのは、出力側のローパスフィルタの影響かと思いますが、波形が何重にも重なって見えるのは如何してか?
オシロのシングルパルスで観測するとマトモです。
おそらく、A/Dコンバータの精度がいい加減で、其の都度変化しているのでしょう。
此の程度の PICでは音声信号の ADCまでは考えて無いと思います。

最後に女性ボーカルの曲を入力して聴いてみましたが、ソコソコ聞えるのでビックリしました。
そして AGC回路が巧く動作するので他に流用できるかもしれません。

途中のデジタル部分で何も細工が出来なかったのは、私の実力不足で残念です。
by    JA1QVM

この記事に

開く コメント(6)

開く トラックバック(0)


12F683に付随している PWMモードを、自分勝手に「高速」と決めているだけですので笑って下さい。
色々勉強して解ったのですが、決められたレジスタ?に数値を入れれば、後は勝手に其れに見合った周波数、デューティー比の矩形波が出力されると云う・・・簡単ジャン・・・らしいです。
ただ其の数値を決める計算式が、古希の爺さんには楽しかったかな?
下に基本となるプログラムと回路を乗っけて置きます。

#include <pic.h>

__CONFIG(FOSC_HS&WDTE_OFF  ・・・今回は外付Xtal使用
&PWRTE_ON&BOREN_ON&MCLRE_OFF
&CP_OFF&IESO_ON&FCMEN_ON);


#define _XTAL_FREQ 20000000  ・・・最高速の 20MHz
unsigned int adconv(),t0;

void main(){
ANSEL    =0b00100011;  ・・・これも 20MHzで使える最高値に設定
CMCON0 =0b00000111;
TRISIO   =0b00000011;
GPIO      =0b00000000;
CCP1CON=0b00001100;
T2CON    =0b00000100;
INTCON  =0b10000000;
PR2=255;   ・・・20MHz/10bitの最高値に設定

while(1){
t0=adconv();  ・・・A/DCで得られた 10bit数値を t0に代入
CCPR1L=t0>>2; ・・・CCPR1Lに t0の上位8bitの内容が入る
CCP1CON=((t0<<4)&48)|12; ・・・t0の下位 2bitの内容がCCP1CONの
}                    ・・・の上位4bitに入り、下位4bitに 12が入る
}

unsigned int adconv(){
ADCON0=0b11000001; ・・・A/DCの基準電圧は6pinの電圧とする
__delay_us(12);GO=1;  ・・・A/DC最速の 12usに設定
while(GO);
return((ADRESH<<8)+ADRESL); ・・・bitシフトで [*256]の演算を[<<8]で
}                       ・・・する(計算結果は同じ)

A/DC,PWM共に最大 10bitまでです。
今回は bit操作(シフト)にチャレンジしました。
イメージ 1

クロック用の 20MHzは手持ちの水晶発振子を使いました。
動作は・・・

1:入力 (7pin)のアナログ信号電圧を、基準電圧 (6pin)と比較した結果をデジタル信号として [adconv()]に 10bitで格納する。(A/D変換モード)

2:PWMモードの周波数は [PR2]レジスタで設定。 今回は PR2=255で周波数は計算上 19.531kHzになりました。

3:デューティー比は [CCPR1L]レジスタに adconv()の 10bitの内、上位 8bitを格納する。

4:残りの下位 2bitは [CCP1CON]レジスタの 4,5bit(右端から 5,6番目)に格納する。・・・この辺はヤヤコしいです。

実際の計算は複雑ですが、プログラムはエレキーより簡単かな?
VRを廻して 7pinの入力電圧を可変すると、当たり前の様に出力の 19kHz矩形波のデューティー比が変化します。
イメージ 2

イメージ 3

次回は此処に音声信号を入れてみます。  by    JA1QVM

この記事に

開く コメント(4)

開く トラックバック(0)

[ すべて表示 ]


.


みんなの更新記事