このサイトを参考に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
}
No.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
}
//========ここまで========
No.1
- 回答日時:
「全部がうまくいってはじめて成功する」のですから
どこか1箇所でも不具合があれば「全く動かない」結果となります。
部分部分を調べてつぶしていくしかありません。
まずはPICのTXとRXを折り返して
自分が出したシリアルを自分で受け取れるかを確認すれば
PICのプログラミングは大丈夫だ、と判断できます。
>232CドライバーのADM3202ANZ
のハードウェアが大丈夫か、は質問文だけでは何とも言えませんが
ここも同様にパソコン→ADM3202で折り返し→パソコン
と折り返してやり、パソコン上ターミナルソフトで
自分で打った文字が折り返して画面に表示されるか、で判断できます。
こんな具合に絞り込んでいきます。
シリアル端子がLowでLEDが点灯する治具を付けておけば
シリアルデータが出ればチラチラと点灯するので、
こういう簡単な治具でもかなり役に立ちます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Windows 10 (続質問です No.3)Windows 10 ノートで電源OFF してもWinfi ランプが消えない 14 2023/07/22 19:48
- 電気・ガス・水道 電気温水器の電計契約 3 2022/04/06 10:24
- iPhone(アイフォーン) iPhone初心者です 3 2022/07/28 21:49
- Visual Basic(VBA) VBAのトグルボタンでのマクロについて質問です 3 2022/10/10 17:23
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- Excel(エクセル) セルに設定した[コメント]、表示のON/OFFは正常なるも印刷されない! 3 2022/09/18 21:56
- サーバー メールサーバーについて詳しい方、メールサーバーの管理業務経験のある方、教えてください。 3 2022/11/12 18:24
- 車検・修理・メンテナンス 4GR-FSE 電動ファンが止まらない 3 2022/09/10 17:35
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PLC間の信号のやりとりについて...
-
USBからの電源供給をコントロー...
-
Picマイコンについて質問します...
-
H8マイコンでルーレットゲーム
-
シーケンスのプログラムについ...
-
汎用入出力ポートの制御方法
-
Xilinx ISE 分周波形シミュレー...
-
コンピューターでラジコン操作?
-
H8/3664Fでパルス幅測定
-
フィードバック制御とフィード...
-
ディスプレイ上で起こる2重表...
-
パソコンのWi-Fiについてご相談...
-
HyperVで仮想マシンがネットワ...
-
【EX2510S】HDMIとDisplayPort...
-
IIS環境にてJAVAを使用したいの...
-
MIL40-20とは??
-
目を左右別々に動かす
-
インターネットに接続できなく...
-
Cpkのk(偏り)値をExcelで出す...
-
マイクロ波放射装置
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PLC間の信号のやりとりについて...
-
USBからの電源供給をコントロー...
-
シーケンスのプログラムについ...
-
PIC16F1827でPCとシリアル接続
-
PCのUSBバスパワーの制御
-
C++でLEDを点灯させるプログラム
-
arduinoで複数のサーボを動かし...
-
マイコンボード上のポートと端...
-
EnumとType
-
<単安定マルチバイブレータ> 単...
-
デジタル時計(アラーム付)を...
-
picマイコンより簡単に扱えるマ...
-
Visual BasicでGP-IBの通信を制...
-
PID制御について
-
家電のcpu
-
Picマイコンについて質問します...
-
MS-DOS のソフトをWindows XPで...
-
AVRマイコンの未使用ピンの処理...
-
PICマイコンボード自作について
-
AVRマイコンの未使用ピンの...
おすすめ情報