プロが教える店舗&オフィスのセキュリティ対策術

このサイトを参考にPIC16F1827でシリアル通信をしようと思い
http://www.geocities.jp/zattouka/GarageHouse/mic …
232CドライバーのADM3202ANZと繋いでみましたがハイパーターミナルで
9600bps
パリティーなし
ストップビット1
フロー制御なし
で設定しましたが、全くデータを受信しません。
ドライバーICの接続が悪いのかとTx,RxをPIC側とPC側で入れ替えてみましたがいずれもダメでした。
現状のソースを載せますので、アドバイスお願いします。

----------------------------------------
/*USART_16F1827_V1
Last_Updete:2017/10/30
USART通信
*/

#include <xc.h>
#define _XTAL_FREQ 7987200 // delay用(クロック7.9872MHzで動作時)

// コンフィギュレーション1の設定
#pragma config FOSC = HS // 外部クロックを使用する(HS)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF)

// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)

// 指定した時間(num x 10ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
int i ;

// numで指定した回数だけ繰り返す
for (i=0 ; i < num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
}

// メインの処理関数
void main() {

char i ;


/*
*
16F1827のUSARTピンは以下の様に利用します。
TX:11番ピン(RB5)と8番ピン(RB2)のどちらかで TXCKSELレジスターで選択します。
RX:7番ピン(RB1)と8番ピン(RB2)のどちらかで RXDTSELレジスターで選択します。
TXCKSEL 0=RB2 1=RB5   RXDTSEL 0=RB1 1=RB2
RXはデジタル入力に設定します。
*
*/

OSCCON = 0b00000000; // 内部クロックは7.9872MHzとする
ANSELA = 0b00000000; // AN0-AN4は使用しない全てデジタルI/Oとする
ANSELB = 0b00010000; // AN5-AN11はAN8のみアナログで使用し他はデジタルI/Oとする
TRISA = 0b00000000; // ピン(RA)は全て出力に割当てる(RA5は入力のみとなる)
TRISB = 0b11010010; // ピン(RB)はRB1(RX入力),RB6,RB4(AN8)とRB7(AN6)は入力で他は出力に割当てる
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
ADCON0 = 0b00100001; // アナログ変換情報設定(AN8から読込む)
__delay_us(10); // アナログ変換情報が設定されるまでとりあえず待つ
PORTA = 0b00000000; // RA出力ピンの初期化(全てLOWにする)
PORTB = 0b00000000; // RB出力ピンの初期化(全てLOWにする)

// USART機能の設定を行う
RXDTSEL = 0; // 7番ピン(RB1)をRX受信ピンとする
TXCKSEL = 0; // 8番ピン(RB2)をTX送信ピンとする

TXSTA = 0b00100100 ; // 送信情報設定:非同期モード 8ビット・ノンパリティ
RCSTA = 0b10010000 ; // 受信情報設定
BRGH=0;
SPBRG=12; //BRGH=0, 8MHz, 9600baud

Wait(500) ; // 5秒後に開始する
i = 0x30 ;

while (1) { // メインループ開始

while(TXIF==0) ; // 送信可能になるまで待つ *1)
TXREG = i ; // 送信する
// 送信データを作成する(モニターに表示しやすい用に文字データを作成)
i++ ;
if (i > 0x7b) i=0x30 ;

Wait(100) ; // 1秒後に処理を繰り返す



}//while end
}

A 回答 (2件)

少しプログラムを変えてみましたがどうでしょうか?


あと確認する手段として、プログラムの合間にPORTBの出力を入れ、LEDの点灯で何処までプログラムの命令が実行されているかをやってみるといいですね。
//========ここから========
#include <xc.h>
#define _XTAL_FREQ 7987200 // delay用(クロック7.9872MHzで動作時)

// コンフィギュレーション1の設定
#pragma config FOSC = HS // 外部クロックを使用する(HS)
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF)
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON)
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF)
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF)
#pragma config CPD = OFF // データメモリーを保護しない(OFF)
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON)
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF)
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF)
#pragma config FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF)

// コンフィギュレーション2の設定
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF)
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF)
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON)
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI)
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF)

// 指定した時間(num x 10ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
int i ;

// numで指定した回数だけ繰り返す
for (i=0 ; i < num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
}

// メインの処理関数
void main() {

char i ;


/*
*
16F1827のUSARTピンは以下の様に利用します。
TX:11番ピン(RB5)と8番ピン(RB2)のどちらかで TXCKSELレジスターで選択します。
RX:7番ピン(RB1)と8番ピン(RB2)のどちらかで RXDTSELレジスターで選択します。
TXCKSEL 0=RB2 1=RB5   RXDTSEL 0=RB1 1=RB2
RXはデジタル入力に設定します。
*
*/

OSCCON = 0b00000000; // 内部クロックは7.9872MHzとする
ANSELA = 0b00000000; // AN0-AN4は使用しない全てデジタルI/Oとする
ANSELB = 0b00010000; // AN5-AN11はAN8のみアナログで使用し他はデジタルI/Oとする
TRISA = 0b00000000; // ピン(RA)は全て出力に割当てる(RA5は入力のみとなる)
TRISB = 0b11010010; // ピン(RB)はRB1(RX入力),RB6,RB4(AN8)とRB7(AN6)は入力で他は出力に割当てる
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
ADCON0 = 0b00100001; // アナログ変換情報設定(AN8から読込む)
__delay_us(10); // アナログ変換情報が設定されるまでとりあえず待つ
PORTA = 0b00000000; // RA出力ピンの初期化(全てLOWにする)
PORTB = 0b00000000; // RB出力ピンの初期化(全てLOWにする)

// USART機能の設定を行う
RXDTSEL = 0; // 7番ピン(RB1)をRX受信ピンとする
TXCKSEL = 0; // 8番ピン(RB2)をTX送信ピンとする

TXSTA = 0b00100100 ; // 送信情報設定:非同期モード 8ビット・ノンパリティ
RCSTA = 0b10010000 ; // 受信情報設定
BAUDCONbits.BRG16=0;//ボーレート8ビット
SPBRG=12; //BRGH=0, 8MHz, 9600baud

Wait(500) ; // 5秒後に開始する
i = 0x30 ;

while (1) { // メインループ開始
TXREG = i ; // 送信する
while(TXSTAbits.TRMT==0) ; // 送信完了確認

// 送信データを作成する(モニターに表示しやすい用に文字データを作成)
i++ ;
if (i > 0x7b) i=0x30 ;

Wait(100) ; // 1秒後に処理を繰り返す



}//while end
}
//========ここまで========
    • good
    • 0

「全部がうまくいってはじめて成功する」のですから


どこか1箇所でも不具合があれば「全く動かない」結果となります。
部分部分を調べてつぶしていくしかありません。

まずはPICのTXとRXを折り返して
自分が出したシリアルを自分で受け取れるかを確認すれば
PICのプログラミングは大丈夫だ、と判断できます。

>232CドライバーのADM3202ANZ
のハードウェアが大丈夫か、は質問文だけでは何とも言えませんが
ここも同様にパソコン→ADM3202で折り返し→パソコン
と折り返してやり、パソコン上ターミナルソフトで
自分で打った文字が折り返して画面に表示されるか、で判断できます。

こんな具合に絞り込んでいきます。
シリアル端子がLowでLEDが点灯する治具を付けておけば
シリアルデータが出ればチラチラと点灯するので、
こういう簡単な治具でもかなり役に立ちます。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!