App_TweLiteプログラムの変更箇所
(1)App_TweLiteプログラムの変更のポイント
*ToCoStick(トコスティック)のプログラムは気象観測レコーダとアース抵抗レコーダ共通としました。
*ToCoStick(トコスティック)のプログラムがApp_TweLiteで、ZigBeeワイヤレスモジュール TWE−LiteのプログラムがSamp_PingPongとした場合のプログラム修正方法がわかりませんでした。
*App_TweLiteはAD変換機能が実装済みであるが、標準のAD変換機能は割込み制御を使用しているため、アース抵抗測定、臭い測定のようにタイミングが重要な測定では、信頼性のある結果がえられませんでした。
*App_TweLiteの標準AD変換機能を有効にしたまま、待ちループ方式のAD変換を行うとエラーが発生しました。
*このためApp_TweLiteのAD変換割込みを禁止しました。
*アース抵抗測定、臭い測定は測定に時間がかかるため、タイマー制御による並列処理としましたが、出力のタイミングズレが発生します。
(2)AD変換割込みの禁止
adc.cファイルで以下の修正をしました。
void vADC_Init(tsObjData_ADC *pData, tsSnsObj *pSnsObj, bool_t bInitAPR)
vAHI_ApConfigure(E_AHI_AP_REGULATOR_ENABLE,
E_AHI_AP_INT_DISABLE,//***変更2で割込み禁止
//E_AHI_AP_INT_ENABLE,
E_AHI_AP_SAMPLE_2,
E_AHI_AP_CLOCKDIV_500KHZ,
E_AHI_AP_INTREF);
(3)AD変換レンジ設定の変更
adc.cファイルで以下の修正をしました。
u8rng = E_AHI_AP_INPUT_RANGE_2;//***変更2で追加
(4)EEPROMと全体シーケンス変更(//***変更1)
//***変更1
int gbCond=0;
uint16 EPROM_A=0x0000;
uint8 gMyData[256];
int W_24FC256(uint16 EPROM_A,uint8 *(pu8Dest),int Ns,int Nd);
int R_24FC256(uint16 EPROM_A,uint8 *(pu8Dest),int Ns,int Nd);
bool_t MyBusWait(void);
void START_WRITE_ACK(void);
void WRITE_ACK(void);
void STOP_WRITE_ACK(void);
void STOP_READ_NACK(void);
void STOP_READ_ACK(void);
void READ_ACK(void);
void START_READ_ACK(void);
void STOP_WRITE_NACK(void);
uint16 gMySTime=19200;//19200;//320
uint16 gCTnew=0;//書込みデータNo
uint16 gCTold=0;//読出しデータNo
uint16 gNc=0x03FF;//サイクル記録データ数マスク(4*16*16=1024)
int gCRst_F=0;//カウンタリセットフラグ
uint8 gPC=0;//パケットカウンタ
int gPkt01;//読出しデータNo補正
int CondF =0;
// ボタンに変化あり
if (!bCond && sAppData.sIOData_now.u32BtmChanged) {
//bCond = TRUE;//***変更1
}
// ADC に変化あり
if (!bCond && !IS_APPCONF_OPT_NO_ADC_BASED_TRANSMIT() && sAppData.bUpdatedAdc) {
//bCond = TRUE;//***変更1
}
// ON PRESS TRANSMIT
if (!bCond && IS_APPCONF_OPT_ON_PRESS_TRANSMIT()) {
// どれかボタンが押されているときは送信を続ける
if (sAppData.sIOData_now.u32BtmBitmap && sAppData.sIOData_now.u32BtmBitmap != 0xFFFFFFFF) {
//bCond = TRUE;//***変更1
if ((!sAppData.sIOData_now.u32BtmBitmap) && (u32TickCount_ms - u32TxLastDiClear < ON_PRESS_TRANSMIT_KEEP_TX_ms)) {
// ボタンが離されてから 1000ms 未満
//bCond = TRUE;//***変更1
}
}
if (!bCond
&& sAppData.u8Mode == E_IO_MODE_CHILD_CONT_TX
&& ((sAppData.u32CtTimer0 & sAppData.u8FpsBitMask) == sAppData.u8FpsBitMask)) {
// 打って打って打ちまくれ!のモード
//bCond = TRUE;//***変更1
//bRegular = TRUE;//***変更1
}
// レギュラー送信 // TODO レギュラー送信しないオプション
//if (!bCond && (sAppData.u16CtRndCt == 0))
//***変更1
if (sAppData.u16CtRndCt == 0 || sAppData.u16CtRndCt > gMySTime)
{
sAppData.u16CtRndCt = gMySTime;
if (!IS_APPCONF_OPT_REGULAR_PACKET_NO_TRANSMIT() && gbCond == 0)
{
bCond = TRUE;
bRegular = TRUE;
}
}
// ADC値を処理する。
//***変更1
//bool_t bUpdated = bUpdateAdcValues();
bool_t bUpdated;
bUpdated = bUpdateAdcValues();
if ((sAppData.u8IOFixState & 2) == 0) {
sAppData.bUpdatedAdc = 0;
// 確定情報
sAppData.u8IOFixState |= 0x2;
} else {
if (!IS_APPCONF_OPT_NO_ADC_BASED_TRANSMIT()) {
//sAppData.bUpdatedAdc |= bUpdated;//***変更1
}
}
//***変更1 以下にデータを追加
S_BE_WORD(gMySTime); // 測定周期
S_BE_WORD(gCTold-gPkt01); // データNo
S_BE_WORD(gCTnew); // データNo
for(i=0;i< 15;i++){S_OCTET(gMyData[i]);}//測定データ
//***変更1 以下にコマンド条件を記載
if(PWMDuty[0] > 0xAA00){vPortSetLo(PORT_OUT1);}//OFF設定
if(PWMDuty[0]==0xAA11)
{
vfPrintf(&sSerStream, "gMySTime%4X\r\n",gMySTime);
gMySTime=PWMDuty[1];//サイクル時間変更
vfPrintf(&sSerStream, "gMySTime%4X\r\n",gMySTime);
gbCond=0;
}
if(PWMDuty[0]==0xBB11)
{
gbCond=1;//データ送信開始
vfPrintf(&sSerStream, "gbCond=1\r\n");
}
if(PWMDuty[0]==0xCC11)
{
vfPrintf(&sSerStream, "gCTold%4X\r\n",gCTold);
gCTold=PWMDuty[1];//読出しデータNo
vfPrintf(&sSerStream, "gCTold%4X\r\n",gCTold);
gbCond=0;
}
if(PWMDuty[0]==0xDD11)
{
vfPrintf(&sSerStream, "gCTnew=0;gCTold=0;\r\n");
gCTnew=0;
gCTold=0;
sAppData.u16CtRndCt=gMySTime;
gbCond=0;
}
if(PWMDuty[0]==0xEE11)
{
vfPrintf(&sSerStream, "gCTnew%4X\r\n",gCTnew);
gCTnew=PWMDuty[1];//測定データNo
vfPrintf(&sSerStream, "gCTnew%4X\r\n",gCTnew);
gbCond=0;
}
if(PWMDuty[0]==0xFA11)
{
vfPrintf(&sSerStream, "gCTold%4X\r\n",sAppData.u16CtRndCt);
sAppData.u16CtRndCt=gMySTime;//時間カウンタを遅延
vfPrintf(&sSerStream, "gCTold%4X\r\n",sAppData.u16CtRndCt);
gbCond=0;
}
if(PWMDuty[0]==0xFB11)
{
vfPrintf(&sSerStream, "gCTold%4X\r\n",sAppData.u16CtRndCt);
sAppData.u16CtRndCt=6;//時間カウンタを進める
vfPrintf(&sSerStream, "gCTold%4X\r\n",sAppData.u16CtRndCt);
gbCond=0;
}
//***変更1
int W_24FC256(uint16 EPROM_A,uint8 *(pu8Dest),int Ns,int Nd)
{
int i;
uint8 AH =(uint8) (EPROM_A /256) & 0xFF;
uint8 AL = (uint8) EPROM_A & 0xFF;
vPortSetLo(PORT_OUT1);//OFF設定
vAHI_InterruptSetPriority(0xFFFF,0);//全割り込みを禁止
vAHI_SiMasterWriteSlaveAddr(0x50, FALSE);
START_WRITE_ACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
vAHI_SiMasterWriteData8(AH);
WRITE_ACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
vAHI_SiMasterWriteData8(AL);
WRITE_ACK();
while(bAHI_SiMasterPollTransferInProgress());/* busy wait */
for(i=0;i< Nd;i++)
{
vAHI_SiMasterWriteData8(pu8Dest[Ns+i]);
WRITE_ACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
}
STOP_WRITE_NACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
vAHI_InterruptSetPriority(0xFFFF,8);//全割り込みをレベル8で解除
return 0;
}
//***変更1
int R_24FC256(uint16 EPROM_A,uint8 *(pu8Dest),int Ns,int Nd)
{
int i;
uint8 AH =(uint8) (EPROM_A /256) & 0xFF;
uint8 AL = (uint8) EPROM_A & 0xFF;
vPortSetLo(PORT_OUT1);//OFF設定
vAHI_InterruptSetPriority(0xFFFF,0);//全割り込みを禁止
vAHI_SiMasterWriteSlaveAddr(0x50, FALSE);
START_WRITE_ACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
vAHI_SiMasterWriteData8(AH);
WRITE_ACK();
if(!MyBusWait()){return 1;}
vAHI_SiMasterWriteData8(AL);
WRITE_ACK();
if(!MyBusWait()){return 1;}
vAHI_SiMasterWriteSlaveAddr(0x50, TRUE);
START_WRITE_ACK();
if(!MyBusWait()){return 1;}
for(i=0;i<Nd;i++)
{
READ_ACK();
if(!MyBusWait()){return 1;}
pu8Dest[Ns+i]=u8AHI_SiMasterReadData8();
}
STOP_READ_NACK();
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
vAHI_InterruptSetPriority(0xFFFF,8);//全割り込みをレベル8で解除
return 0;
}
//***変更1
void START_WRITE_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_START_BIT,
E_AHI_SI_NO_STOP_BIT,
E_AHI_SI_NO_SLAVE_READ,
E_AHI_SI_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
void START_READ_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_START_BIT,
E_AHI_SI_NO_STOP_BIT,
E_AHI_SI_SLAVE_READ,
E_AHI_SI_NO_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
void WRITE_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_NO_STOP_BIT,
E_AHI_SI_NO_SLAVE_READ,
E_AHI_SI_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
void STOP_WRITE_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_STOP_BIT,
E_AHI_SI_NO_SLAVE_READ,
E_AHI_SI_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
void STOP_WRITE_NACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_STOP_BIT,
E_AHI_SI_NO_SLAVE_READ,
E_AHI_SI_SLAVE_WRITE,
E_AHI_SI_SEND_NACK,
E_AHI_SI_NO_IRQ_ACK);
}
void STOP_READ_NACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_STOP_BIT,
E_AHI_SI_SLAVE_READ,
E_AHI_SI_NO_SLAVE_WRITE,
E_AHI_SI_SEND_NACK,
E_AHI_SI_NO_IRQ_ACK);
}
void STOP_READ_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_STOP_BIT,
E_AHI_SI_SLAVE_READ,
E_AHI_SI_NO_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
void READ_ACK(void)
{
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_NO_STOP_BIT,
E_AHI_SI_SLAVE_READ,
E_AHI_SI_NO_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
}
bool_t MyBusWait(void)
{
while(bAHI_SiMasterPollTransferInProgress()); /* busy wait */
//vfPrintf(&sSerStream, "%d %d ", bAHI_SiMasterPollArbitrationLost(),bAHI_SiMasterCheckRxNack());
if (bAHI_SiMasterPollArbitrationLost() | bAHI_SiMasterCheckRxNack()) {
/* release bus & abort */
vAHI_SiMasterSetCmdReg(E_AHI_SI_NO_START_BIT,
E_AHI_SI_STOP_BIT,
E_AHI_SI_NO_SLAVE_READ,
E_AHI_SI_SLAVE_WRITE,
E_AHI_SI_SEND_ACK,
E_AHI_SI_NO_IRQ_ACK);
return(FALSE);
}
return(TRUE);
}
(5)温度測定
if(sAppData.u16CtRndCt == 8 )
{
//****変更2温度測定
vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT,E_AHI_AP_INPUT_RANGE_1,E_AHI_ADC_SRC_ADC_1);
vAHI_AdcStartSample();//測定開始
while(bAHI_AdcPoll());//AD変換待ち
uint16 ADC=u16AHI_AdcRead();//結果読み込み
gMyData[0]=ADC >> 8;
gMyData[1]=ADC;
}
(6)アース抵抗測定
//***変更3アース抵抗
void fOhm(void);
uint8 gOhm_F=0;//抵抗測定フラグ
uint16 gOhm_C=0;//TickTimerカウンタ
uint16 gOhm_N=5;//総和回数
uint16 gOhm_NC=0;//総和カウンタ
uint32 gOhm_S1;//ADC総和1
uint32 gOhm_S2;//ADC総和
if(sAppData.u16CtRndCt == 7 )
{
//変更3
vfPrintf(&sSerStream,"Ohm-TEST=\tgOhm_S1\tgOhm_S2\tR2\r\n");//TEST表示
gOhm_F=1;//フラグON
}
//***変更3アース抵抗
int i;
for(i = 0;i < 16;i++){gMyData[i]=i;}
vPortSetLo(PORT_OUT3);//OFF設定
vPortSetLo(PORT_OUT4);//OFF設定
case E_AHI_DEVICE_TICK_TIMER: //比較的頻繁な処理
//***変更3 アース抵抗
if(gOhm_F == 1)
{
fOhm();//***変更3 アース抵抗
}
//***変更3アース抵抗
void fOhm(void)
{
gOhm_C++;
if(gOhm_C == 1)
{
vPortSetLo(PORT_OUT3);//OFF設定
vPortSetHi(PORT_OUT4);//ON設定
}
if(gOhm_C == 20)
{
vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT,E_AHI_AP_INPUT_RANGE_2,E_AHI_ADC_SRC_ADC_2);
vAHI_AdcStartSample();//測定開始
while(bAHI_AdcPoll());//AD変換待ち
gOhm_S1=gOhm_S1+ u16AHI_AdcRead();//結果読み込み
//vAHI_AdcDisable();
}
if(gOhm_C == 40)
{
vPortSetHi(PORT_OUT3);//ON設定
vPortSetLo(PORT_OUT4);//OFF設定
}
if(gOhm_C ==60)
{
vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT,E_AHI_AP_INPUT_RANGE_2,E_AHI_ADC_SRC_ADC_2);
vAHI_AdcStartSample();//測定開始
while(bAHI_AdcPoll());//AD変換待ち
gOhm_S2=gOhm_S2+ u16AHI_AdcRead();//結果読み込み
//vAHI_AdcDisable();
}
if(gOhm_C > 80)
{
gOhm_C=0;
gOhm_NC++;
//vfPrintf(&sSerStream,"Ohm-TEST=\t%d\t%d\r\n",gOhm_S1,gOhm_S2);//TEST表示
if(gOhm_NC > gOhm_N)
{
gOhm_NC=0;
uint32 R2=3300*gOhm_S2/gOhm_S1;
vfPrintf(&sSerStream,"Ohm-TEST=\t%d\t%d\t%d\r\n",gOhm_S1,gOhm_S2,R2);//TEST表示
gMyData[2]=gOhm_S1 >> 8;
gMyData[3]=gOhm_S1;
gMyData[4]=gOhm_S2 >> 8;
gMyData[5]=gOhm_S2;
gOhm_S1=0;
gOhm_S2=0;
gOhm_F=0;//これを有効にすると1回で終了!!
}
}
}
(7)音速測定
//***変更4 音速
void HC_SR04(void);
if(sAppData.u16CtRndCt == 6 )
{
//変更4
vfPrintf(&sSerStream,"HC-SR04 -TEST\r\n");//TEST表示
HC_SR04();
}
//***変更4 音速
void HC_SR04(void)
{
//vfPrintf(&sSerStream,"HC-SR04-TEST\r\n");//TEST表示
vPortAsInput(PORT_INPUT1);//入力設定
vPortAsOutput(PORT_INPUT2);//出力設定
vPortSetLo(PORT_INPUT2);//トリガOFF
vAHI_TimerEnable(E_AHI_TIMER_4,3,FALSE,FALSE,FALSE);//プレスケール1/8設定
vAHI_TimerStartSingleShot(E_AHI_TIMER_4,0x0000,0x0000);//タイマー4スタート
while(u16AHI_TimerReadCount(E_AHI_TIMER_4) < 20);//10μsディレイ
vPortSetHi(PORT_INPUT2);//トリガON
vAHI_TimerStop (E_AHI_TIMER_4);//タイマー4ストップ
vAHI_TimerStartRepeat(E_AHI_TIMER_4,0x0000,0x0000);//タイマー4スタート
while(u16AHI_TimerReadCount(E_AHI_TIMER_4) != 20);//10μsディレイ
vPortSetLo(PORT_INPUT2);//トリガOFF
vAHI_TimerStop (E_AHI_TIMER_4);//タイマー4ストップ
vAHI_TimerStartRepeat(E_AHI_TIMER_4,0x0000,0x0000);//タイマー4スタート
while(bPortRead(PORT_INPUT1) && u16AHI_TimerReadCount(E_AHI_TIMER_4) != 0xffff);//エコーON
vAHI_TimerStop (E_AHI_TIMER_4);//タイマー4ストップ
vAHI_TimerStartRepeat(E_AHI_TIMER_4,0x0000,0x0000);//タイマー4スタート
while(!bPortRead(PORT_INPUT1) && u16AHI_TimerReadCount(E_AHI_TIMER_4) != 0xffff);//エコーOFF
uint16 TimerReadCount=u16AHI_TimerReadCount(E_AHI_TIMER_4);
vfPrintf(&sSerStream,"TimerReadCount=%d\r\n",TimerReadCount);//結果出力
vAHI_TimerStop (E_AHI_TIMER_4);//タイマー4ストップ
gMyData[6]=TimerReadCount >> 8;
gMyData[7]=TimerReadCount;
vPortAsInput(PORT_INPUT2);//入力設定
}
(8)臭い測定
//***変更5
void MyDelay(long Tu);
uint16 TTC=0;//TickTimerカウンタ
uint8 gTGS_F=0;//TGS2450フラグ
uint16 gTGS_N=20;//総和回数
uint16 gTGS_NC=0;//総和カウンタ
uint32 gADC;//ADC総和
void TGS2450();
if(sAppData.u16CtRndCt == 5 )
{
//変更5
vfPrintf(&sSerStream,"TGS2450-TEST\r\n");//TEST表示
gTGS_F=1;//フラグON
}
//****変更5
vPortSetLo(PORT_OUT1);//OFF設定
vPortSetLo(PORT_OUT2);//OFF設定
//***変更5
if(gTGS_F == 1)
{
TTC++;
if(TTC > 62)
{
TTC=0;
gTGS_NC++;
TGS2450();
if(gTGS_NC > gTGS_N)
{
gTGS_NC=0;
vfPrintf(&sSerStream,"TGS2450-TEST=\t%d\r\n",gADC);//TEST表示
gMyData[8]=gADC >> 8;
gMyData[9]=gADC;
gADC=0;
gTGS_F=0;//これを有効にすると1回で終了!!
}
}
}
//***変更5 臭い
void MyDelay(long Tu)
{
vAHI_TimerEnable(E_AHI_TIMER_4,4,FALSE,FALSE,FALSE);//プレスケール1/16設定
vAHI_TimerStartSingleShot(E_AHI_TIMER_4,0x0000,0x0000);//タイマー4スタート
while(u16AHI_TimerReadCount(E_AHI_TIMER_4) < Tu);//Tuμsディレイ
vAHI_TimerStop (E_AHI_TIMER_4);//タイマー4ストップ
vAHI_TimerDisable (E_AHI_TIMER_4);//タイマー開放
}
//***変更5 臭い
void TGS2450()
{
vPortSetHi(PORT_OUT1);//ON設定
MyDelay(3000);
vPortSetHi(PORT_OUT2);//ON設定
MyDelay(5000);
vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT,E_AHI_AP_INPUT_RANGE_2,E_AHI_ADC_SRC_ADC_2);
vAHI_AdcStartSample();//測定開始
//MyDelay(1000);
while(bAHI_AdcPoll());//AD変換待ち
gADC=gADC + u16AHI_AdcRead();//結果読み込み
//MyDelay(1000);
vPortSetLo(PORT_OUT1);//OFF設定
vPortSetLo(PORT_OUT2);//OFF設定
}