0.お約束
念のため。確認ください。
1.回路
以下で動作したので、これでよしとする。
2.製作
・QN8027のピッチは0.5mmピッチなので、変換基盤を使う。
変換基盤への半田付けは、フラックス塗でべた付け後、フラックスを吸わせた半田吸い取り線で余分な半田を除去した(トラ技式)。
・0.12uHのコイルは、エイヤでφ8のドリルに10回巻。
・LEDは動作チェック用。省略可。
・回路上にはICPSのコネクタを書いたが、現物では省略した。
写真:製作した基盤。一部1uFのチップコンを使ったため、すべての部品は見えない。
電源は、本機の移動が不要なことから、スマホ用の5V電源を利用した。
3.ソフト
・周波数は88.6MHzとした。
88.6=76+0.05*252 なので、レジスタ値は0xFCとする。
・無音後約58秒で電源を切れるようにした。
・I2C通信の前の100msウェイトは必須。無いと不安定になったり、データの書き込みができなかったりする。
・WatchDock TimerをOffにしないと、途中で突然リセットがかかることがある。
4.動作確認
・PIC16F1503にプログラムが正常に書き込まれていれば、LEDが0.5秒程度光った後消える
・5V電源を使った場合の電流は13mA、無音1分後(電波発射なし)の時で5mA程度。
5.注意
電波法に違反せぬよう利用のこと。
6.プログラム
XC8 V1.34用。
/*
* transmit.C
* By Shiro_46
* 2021.2
*/
// --PIC16F1503--
// SDA : PORTC(1) pin 9 I2Cで使う場合は入力にすること
// SCL : PORTC(0) pin10 I2Cで使う場合は入力にすること
// 他IOは、RA0~5、RC2~5
// 4MHz
#include <xc.h>
#define _XTAL_FREQ 4000000
#define PL PORTCbits.RC4 //チェック用LED
//************* Config ***********************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = ON
// Watch Dog timer をOffにしないと、途中でリセットがかかる可能性あり
#pragma config BOREN = ON, CLKOUTEN = OFF
#pragma config WRT = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF
//********************************************************
void i2cStart(void); // Start Condition
void i2cStop(void); //Stop Condition
void i2cTxData(char); // i2c 8Bitデータ送信
void QN8027Send(unsigned char,unsigned char);
void Init(void);
//////////// Main //////////////////////////////////
void main(void){
OSCCON = 0b01101000; // CLOCK 4Mhz
ANSELA = 0x0; // PortAをすべてデジタルにする
ANSELC = 0x0; // PortCをすべてデジタルにする
TRISC = 0b11000011; // RC0,1が入力(2~5は出力)
TRISA = 0b00000000; // RAはすべて出力
SSPCON1 = 0x28; // I2Cマスターとする
SSPSTAT = 0x00; // I2Cバスをオープンにする
SSPADD = 0x09; // I2C Clock 100KHz for 4MHz
__delay_ms(100); //送信の前にWaitを入れること。入れないと不安定になる。
PL=0; //LED消灯
Init();
SLEEP();
}
void Init(void){
PL=1;
QN8027Send(0x00,0x80); //reset to default
QN8027Send(0x01,0xfc); //Freq=88.6MHz F=76+0.05*0xFC
QN8027Send(0x02,0x09); //PreEmphasis50 etc 0x09にすると、58秒無音でOffになる 0x39ならOnのまま
QN8027Send(0x04,0xd9); //RegVga Xtal=24MHz Input Gain 12dB Z=10k
QN8027Send(0x10,45); //TXPow Setting
QN8027Send(0x00,0x20); //Transmit On
__delay_ms(500);
PL=0;
}
// QN8027 のアドレスにデータを送る
// アドレス、データを渡す
//QN8027 のデバイスIDは0x2C
void QN8027Send(unsigned char reg,unsigned char data){
i2cStart(); //i2c Start
//QN8027のデバイスID 0X2C+PICからの送信(0)=0x58
i2cTxData(0x58); //
i2cTxData(reg); // レジスタ番号の送信
i2cTxData(data); // データの送信
i2cStop(); //i2c Stop
}
void i2cStart(void){
SEN = 1; // Start condition 送信
while(SEN); // Start condition 終了待ち
}
void i2cStop(void){ //i2c STOP
SSP1IF = 0; // 終わり
PEN = 1; // Stop condition 送信
while(PEN); // Stop condition 終了待ち
}
//-------- SSPBUFに1文字保存し送信終了を待つ -----------------
void i2cTxData(char data){
SSP1IF = 0; // 終了フラグクリア
SSPBUF = data; // データセット
while(!SSP1IF); // 送信終了待ち
}