SH-Tiny テクニック
シリアル通信によってPCとマイコンの間で情報をやりとりできるようになると、PCをマイコンのユーザーインターフェースとして使えるためたいへん便利です。
また、それとあわせて、プログラムの一部を別のファイルに移動して、読みやすいプログラムを作成する方法も紹介してみます。
※更新が滞っているため、先にサンプルだけ置いておきます。動作未検証。
※スタンバイ解除を忘れていたので修正
以下作成中...
以下作成中...
とりあえず送信のみ。
"sci.c"というファイルと"sci.h"というファイルを作り、プロジェクトフォルダに放り込む。
[プロジェクト]>[ファイルの追加]メニューから"sci.c"を選択。
"sci.h"の内容
"sci.c"の内容
メインソースの内容
ビルドが成功すると自動的にヘッダファイルの一覧に"sci.h"が追加される。
メイン文がとてもすっきりしているのがわかる。
シリアル通信によってPCとマイコンの間で情報をやりとりできるようになると、PCをマイコンのユーザーインターフェースとして使えるためたいへん便利です。
また、それとあわせて、プログラムの一部を別のファイルに移動して、読みやすいプログラムを作成する方法も紹介してみます。
※更新が滞っているため、先にサンプルだけ置いておきます。動作未検証。
※スタンバイ解除を忘れていたので修正
#include "iodefine.h" void main(void){ int i; CPG.FRQCR.WORD = 0x16db; // Iφ=48MHz STB.CR3.BIT._SCI1 = 0; //SCI1 モジュールスタンバイ解除 PFC.PACRL3.BIT.PA11MD=0x06; //TXD0端子に設定 PFC.PACRL3.BIT.PA10MD=0x06; //RXD0端子に設定 SCI1.SCSMR.BIT.CA = 0; //調歩同期式 SCI1.SCSMR.BIT.CHR = 0; //データ長8bit SCI1.SCSMR.BIT._PE = 0; //パリティビットなし SCI1.SCSMR.BIT.STOP = 0; //ストップビット長1bit SCI1.SCSMR.BIT.CKS = 0; //クロックセレクト Pφ SCI1.SCBRR = 19; // 分周比 24MHz -> 38400bps SCI1.SCSCR.BIT.TE = 1; //送信許可 SCI1.SCSCR.BIT.RE = 1; //受信許可 while(!SCI1.SCSSR.BIT.TDRE); //送信バッファが空くまで待つ SCI1.SCTDR = 'A'; //'A'(0x41)をセット SCI1.SCSSR.BIT.TDRE = 0; //送信を通知 while(1); //無限ループ }
以下作成中...
#include "iodefine.h" //1バイト送信する関数 void putc(const char c) { while(!SCI1.SCSSR.BIT.TDRE); //送信バッファが空くまで待つ SCI1.SCTDR = c; //キャラクタをセット SCI1.SCSSR.BIT.TDRE = 0; //送信を通知 } //1バイト受信する関数 int getc(void) { int x; while (!(SCI1.SCSSR.BYTE & 0x78)); //受信バッファが埋まるのを待つ x = SCI1.SCRDR & 0xff; ////キャラクタを取得 SCI1.SCSSR.BYTE &= ~0x78; // RDRF、エラーフラグも一応0に return x; } void main(void){ int i; CPG.FRQCR.WORD = 0x16db; // Iφ=48MHz STB.CR3.BIT._SCI1 = 0; //SCI1 モジュールスタンバイ解除 PFC.PACRL3.BIT.PA11MD=0x06; //TXD0端子に設定 PFC.PACRL3.BIT.PA10MD=0x06; //RXD0端子に設定 SCI1.SCSMR.BIT.CA = 0; //調歩同期式 SCI1.SCSMR.BIT.CHR = 0; //データ長8bit SCI1.SCSMR.BIT._PE = 0; //パリティビットなし SCI1.SCSMR.BIT.STOP = 0; //ストップビット長1bit SCI1.SCSMR.BIT.CKS = 0; //クロックセレクト Pφ SCI1.SCBRR = 19; // 分周比 24MHz -> 38400bps SCI1.SCSCR.BIT.TE = 1; //送信許可 SCI1.SCSCR.BIT.RE = 1; //受信許可 while(1){ //送られてきた文字をそのまま送り返す putc(getc()); } }
以下作成中...
とりあえず送信のみ。
"sci.c"というファイルと"sci.h"というファイルを作り、プロジェクトフォルダに放り込む。
[プロジェクト]>[ファイルの追加]メニューから"sci.c"を選択。
"sci.h"の内容
extern void sci_init(); extern void sci_printstr(const char *str);
"sci.c"の内容
#include "iodefine.h" #include "sci.h" #define CHAR_NULL 0x00 #define CHAR_CR 0x0d #define CHAR_LF 0x0a void sci_init(){ PFC.PACRL3.BIT.PA11MD=0x06; //TXD0端子に設定 PFC.PACRL3.BIT.PA10MD=0x06; //RXD0端子に設定 STB.CR3.BIT._SCI1 = 0; //SCI1 モジュールスタンバイ解除 SCI1.SCSMR.BIT.CA = 0; //調歩同期式 SCI1.SCSMR.BIT.CHR = 0; //データ長8bit SCI1.SCSMR.BIT._PE = 0; //パリティビットなし SCI1.SCSMR.BIT.STOP = 0; //ストップビット長1bit SCI1.SCSMR.BIT.CKS = 0; //クロックセレクト Pφ SCI1.SCBRR = 19; // 分周比 24MHz -> 38400bps SCI1.SCSCR.BIT.TE = 1; //送信許可 SCI1.SCSCR.BIT.RE = 1; //受信許可 } void putc(const char c) { while(!SCI1.SCSSR.BIT.TDRE); //送信バッファが空くまで待つ SCI1.SCTDR = c; //キャラクタをセット SCI1.SCSSR.BIT.TDRE = 0; //送信を通知 } //文字列の送信 void sci_printstr(const char *str){ char d; while(*str != CHAR_NULL) { d = *str++; if(d == '\n'){ putc(CHAR_CR); putc(CHAR_LF); }else{ putc(d); } } }
メインソースの内容
#include "iodefine.h" #include "sci.h" void main(void){ int i; CPG.FRQCR.WORD = 0x16db; // Iφ=48MHz sci_init(); sci_printstr("Hello World!\n"); while(1); }
ビルドが成功すると自動的にヘッダファイルの一覧に"sci.h"が追加される。
メイン文がとてもすっきりしているのがわかる。
最新コメント