PIC24FJ32GA002 で使える通信方式 デジタル通信 *UART (Universal Asynchronous Receiver Transmitter) 3 線方式 (Tx, Rx, Gnd) 下の 2 つに比べて, 比較的遠方までデータを送受信するのに使う. 調歩同期方式 ( 事前に通

Similar documents
本日の内容 導入 回路の作製 回路図から配線図へ ブレッドボードを使った試作回路の作製 マイコンへのプログラム書き込み GPIOの実験

CoIDE 用 STM32F4_UART2 の説明 V /03/30 STM32F4 Discovery の非同期シリアル通信ポート UART2 の送受信を行うプログラムです Free の開発ツール CoIDE で作成したプロジェクトサンプルです プログラムの開始番地は 0x08000

1. A/D 入力について分解能 12bit の A/D コンバータ入力です A/D 入力電圧とディジタル値との対応は理論上 入力電圧 0V : 0 入力電圧 +3V : 4095 です 実際はオフセットと傾きがあり ぴったりこの数値にはなりません 2. A/D 入力に使用する信号 STM32L_A

割り込み 今までのプログラムは 順番にそって命令を実行していくのみ それはそれで良いが 不便な場合もある 例えば 時間のかかる周辺機器を使う場合 その周辺機器が動作を終了するまで CPU は待たなければいけない 方法 1( ポーリング ) 一定時間毎に 周辺機器の動作が終了したか調べる 終了していれ

1. UART について UART は Universal Asynchronous Receiver Transmitter の頭文字をとったもので 非同期シリアル通信と呼ばれます シリアル通信とは 一本の信号線でデータをやりとりするために 1bit ずつデータを送出することをいいます データを受

1. 使用する信号 1.1. UART 信号 UART 通信に使用する信号と接続相手との接続は以下の通りです UART 信号表 番号 CPU 機能名 CPU 信号名 基板コネクタピン番号 方向 接続相手の信号名 1 USART1_TX PA9 CN > RxD 2 USART1_R

RTC_STM32F4 の説明 2013/10/20 STM32F4 内蔵 RTC の日付 時刻の設定および読み込みを行うプログラムです UART2( 非同期シリアル通信ポート 2) を使用して RTC の設定および読み込みを行います 無料の開発ツール Atollic TrueSTUDIO for

arduino プログラミング課題集 ( Ver /06/01 ) arduino と各種ボードを組み合わせ 制御するためのプログラミングを学 ぼう! 1 入出力ポートの設定と利用方法 (1) 制御( コントロール ) する とは 外部装置( ペリフェラル ) が必要とする信号をマイ

CoIDE 用 F4D_VCP の説明 V /07/05 USB の VCP( 仮想 COM ポート ) による非同期シリアル通信を行うプログラムです Free の開発ツール CoIDE で作成した STM32F4 Discovery 用のプロジェクトです プログラムの開始番地は 0x

1. USB の VCP( 仮想 COM ポート ) について USB の VCP( 仮想 COM ポート ) は USB を非同期シリアル通信として使用するための USB のドライバです PC には VCP ドライバをインストールする必要があります USB の VCP( 仮想 COM ポート )

スライド 1

目次 1 I2Cとは 13 結線写真 2 センサの多くがI2Cに対応 14 WHO_AM_I 3 マイコンでのI2C通信例 15 I2C読込みプログラム 4 とは 16 I2C読込みスクリプト概要① 5 タイミングパラメータ 17 I2C読込みスクリプト概要② 6 書込み 18 センサ読込みプログラ

スライド 1

1. プログラム実行時の動作プログラムを実行すると以下のように動作します 1) NUCLEO-F401RE 上の LED LD2( 緑 ) が 200mSec 間隔で点滅します 2. プロジェクトの構成 2.1. プロジェクト F401N_BlinkLD2 の起動画面 TrueSTUDIO で作成し

スライド 1

スライド 1

スライド 1

memo

RL78開発環境移行ガイド R8C/M16C, H8S/H8SXからRL78への移行(統合開発環境編)(High-performance Embedded Workshop→CS+)

CommCheckerManual_Ver.1.0_.doc

Microsoft PowerPoint - CproNt02.ppt [互換モード]

ファイル入出力

81 /******************************************************************************/ 82 /* スレーブアドレスの設定 */ 83 /*****************************************

tri_s_tg12864_vcp の説明 2014/02/05 飛石伝ひ CPU 基板 の LCD TG12864 の表示プログラムです 漢字表示 (JIS208) を行うことができます USB の VCP ( 仮想 COM ポート ) を使用して非同期シリアル通信により 表示試験を行うことができ

GR-SAKURA-SAのサンプルソフト説明

Taro-ファイル処理(公開版).jtd

ブート領域、フラッシュ領域の分割方法 RL78ファミリ用Cコンパイラ CC-RL

まず,13 行目の HardwareTimer Timer(1); は,HardwareTimer というクラスを利用するという宣言である. この宣言によって Timer というインスタンスが生成される.Timer(1) の 1 は,OpenCM に 4 個用意されているタイマのうち,1 番のタイマ

PSoC5LP で USBMIDI 2015/5/23 第 2 回 PSoC まつり (Sat) 於 本サイプレス本社 ( 中野 ) PSoC5LP で USBMIDI ectoyfan ectoyfan アラフィフ ( 電 回路玩具ファン ) Electronic Circui

MPL115A

訂正 _ 第 1 回 1 Arduino Arduino を用意する 入力 アナログ Analog 入出力 任意の電圧を扱える 電源系 外部入力 7 12V デジタル digital 入出力 リセットボタン Low High いわゆる 01 が入出力される 通常は Low 0V GND High 5

SDC_SDIO_STM32F4 の説明 2013/09/17 SDIO インターフェースで SD カードをアクセスするプログラムのプロジェクトサンプルです FAT でファイルアクセスするために FatFs( 汎用 FAT ファイルシステム モジュール ) を使用しています VCP(USB 仮想 C

PowerPoint プレゼンテーション

スライド 1

MINI2440マニュアル

作成 承認 簡単取扱説明書 (S&DL 水位計 ) 応用計測サービス株式会社 (1.1)

Microsoft Word - no15.docx

表 信号端子 端子名 入出力 機能 DTR 出力 COM ポート DTR (Data Terminal Ready Control Output / Handshake Signal) RXD 入力 COM ポート RXD (Receiving Asynchronous Data Input) TX

PowerPoint プレゼンテーション

本日の内容 導入 回路の作製 回路図から配線図へ ブレッドボードを使った試作回路の作製 マイコンへのプログラム書き込み GPIOの実験

スライド 1

画像ファイルを扱う これまでに学んだ条件分岐, 繰り返し, 配列, ファイル入出力を使って, 画像を扱うプログラムにチャレンジしてみよう

Timers_JP.fm

1. LCD LS027B4DH01 について LS027B4DH01 は 400dot x 240dot のグラフィック LCD です 秋月電子通商で購入できます 外形サイズ : 62.8 x x 1.53mm LCD のフレキシブルケーブルの根元の部分はちょっと力を加えただけで表示が

Microsoft Word - Cプログラミング演習(10)

AKI-PIC16F877A開発キット (Ver1

Java講座

RsMulti の取扱説明 「RS232C で直接接続する(LAN を使用しない場合)」

1.1 シリアル通信 Fig. 1 にあるように 通信は大きく分けてシリアル通信とパラレル通信に分かれる シリアル通信は基本的に送受信に各 1 本のデータ線を使い 全てのビットを順番にデータ線に流すことによ り通信が行われる このため TxD,RxD の最低 2 本の線を繋げば通信できる (Fig.

PIC


回路 : Vdd GND 回路図と呼べるようなものではありません オシレータは外部 ( セラミック発振子 ) なので GP4 と GP5 は使えません 四角の枠内はモジュールなので ここから VDD GND TX RX の4 本をつなぐだけです 測定端子 (GP0) は 1MΩの抵抗と 2MΩの半固

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

Microsoft Word - PIC-P14マニュアル.doc

Microsoft Word - USB60F_Raspi_ doc

法政大学小林一行研究室 PSoC ドキュメント資料 Gerox(c) 10/12/ PSoC (49466 単体 ) で設定できるシリアル通信の最大クロックは? PSoC の UART のマニュアルによれば,6Mbits/second まで設定できる

プログラミング実習I

PowerPoint Presentation

A&D社製データロガーを初めてお使いになる方へ

情報処理演習 B8クラス

商品番号 : UTS-422 USB-RS422( シリアル ) 変換ケーブル (USB1.1 規格対応 ) 概要 UTS-422 は RS-422 インターフェースを持つ外部周辺機器をパソコンの USB ポートを介してコントロールするための USB-RS422 変換ケーブルです 最大 3Mbps

Arduino UNO IS Report No. Report Medical Information System Laboratory

User's Manual

Microsoft PowerPoint - prog04.ppt

Rev.1.1 S1V50300 サンプルプログラムマニュアル

Baud Rate 9600 Parity NONE Number of Data Bits 8 Number of Stop Bits 1 Flow Control NONE 1 RS232C 200mm 2,000mm DIMM ( ) Telescope East/West LX200 * 1

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

ESP32-KEY-KIT-R1 (ESP-WROOM-32 ) Copyright c 2

スライド 1

プログラミング基礎

コンピュータ工学講義プリント (7 月 17 日 ) 今回の講義では フローチャートについて学ぶ フローチャートとはフローチャートは コンピュータプログラムの処理の流れを視覚的に表し 処理の全体像を把握しやすくするために書く図である 日本語では流れ図という 図 1 は ユーザーに 0 以上の整数 n

Transcription:

本日の内容 UART とは? UART によるデータ送信 UART によるデータ受信 & 送信 第 3 回

PIC24FJ32GA002 で使える通信方式 デジタル通信 *UART (Universal Asynchronous Receiver Transmitter) 3 線方式 (Tx, Rx, Gnd) 下の 2 つに比べて, 比較的遠方までデータを送受信するのに使う. 調歩同期方式 ( 事前に通信速度 ( ボーレート ) を送受信側で合わせておく必要がある ) 通信速度の上限, 電圧の違いを除けば RS232C と同じ. USB RS232 コンバータ等を使って PC と直接データをやりとりできる. *SPI (Serial Peripheral Interface ) 5 線方式 (SDO, SDI, SCK, CS, Gnd) 線の数が多くなるが, 高速通信ができる. *I2C (Inter Integrated Circuit) 3 線方式 (SCK, SDA, Gnd) 線の数が少なく, 同じバス上に沢山のデバイスをつなぐことができる.( 回路が簡略化 ) ただし,SPI に比べて遅い.

UART (Universal Asynchronous Receiver Transmitter) 自分の送信 (TxD) と相手の受信 (RxD) をつなぐ TxD RxD デバイス 1 ( マイコン ) RxD TxD デバイス 2 (PC 等 ) GND この時間間隔は送受信で合わせておかないとうまく通信できない Start bit Bit 0 Bit 2 Bit 4 Bit 6 Bit 1 Bit 3 Bit 5 Bit 7 転送開始 Stopt bit

UART (Universal Asynchronous Receiver Transmitter) Start bit 受信側は, スタートビットが始まったら, 事前にきめた転送速度 ( ボーレート ) にしたがって, データを読み取る なので, 送受信側でボーレートが合っていないとうまく通信できない

最近では,,, TxD RxD デバイス 1 ( マイコン ) RxD GND TxD シリアルー USB 変換 IC (FT230 等 ) USB PC として使うことが多い

USB-Serial module UART 用コネクタ Connector for MPU USB UART 変換用 IC USB connector

USB-Serial module Already prepared Tx Rx 5V Gnd

回路 注 ) +5V と +3.3V があるので, 間違えて接続しないように Module +5V

USB UART module 端子レギュレータ oltage regulator USB cable

ファイルの分割 いままでは main.c のみを使ってプログラムを作ってきたけど プログラムが複雑になってくると 見づらくなってくる そこで 機能毎にファイルを分けると見やすくなるし 他のプログラムでも再利用が簡単になる main.c などの拡張子が c のものは プログラムの本体 main.h などの拡張子が h のものは 関数のプロトタイプなどが書いてある File1.c オブジェクトファイル File1.o Header1.h Header2.h File2.c File2.o File.hex Header3.h #includeで読み込む コンパイル File3.c File3.o リンク Library.o ライブラリ

main.h の中身 #include <xc.h> #include <p24fj32ga002.h> #include <stdio.h> #include "MyDefs.h" #pragma config OSCIOFNC = ON #pragma config FNOSC = FRCPLL #pragma config FWDTEN = OFF #pragma config JTAGEN = OFF #pragma config WUTSEL = LEG 必要なヘッダファイルの読み込み マイコンのコンフィギュレーションの設定 ( 内部オシレータ等の設定 )

MyDefs.h #define INPUT_PIN 1 #define OUTPUT_PIN 0 define 文...( 例 ) 本文中で INPUT_PIN という文字が現れたら 1 に置換される TRIS の設定用 //IO Remap (Output) #define OUTMAP_U1TX 3 #define OUTMAP_SDO1 7 #define OUTMAP_SCK1OUT 8 #define OUTMAP_SS1OUT 9 #define OUTMAP_OC1 18 #define OUTMAP_SDO2 10 IO リマップの設定用 (UART 等の内蔵モジュールの入出力をどのピンに割り当てるかの設定 )

LED.h #define EnableLED0() TRISBbits.TRISB6=OUTPUT_PIN #define EnableLED1() TRISBbits.TRISB7=OUTPUT_PIN LED の初期化 GPIO のピンの設定 #define LED0_on() LATBbits.LATB6 = 1 #define LED0_off() LATBbits.LATB6 = 0 #define LED1_on() LATBbits.LATB7 = 1 #define LED1_off() LATBbits.LATB7 = 0 LED の ON/OFF

uart.h #include <xc.h> #include <p24fj32ga002.h> extern char *TxBuf; extern char TxBufPos; void attribute ((interrupt, no_auto_psv)) _U1TXInterrupt(void); void UART1_init(); void UART1_init(); int UART1_puts(unsigned char str[]); int UART1_puts_wait(unsigned char str[]);

uart.c( 一部 ) #include <xc.h> #include <p24fj32ga002.h> #include "MyDefs.h" //#include "UART.h" #include "LED.h" #define UART1_TXD_Enable() TRISBbits.TRISB1 = OUTPUT_PIN #define BR_9600_16MHz 103 #define BR_19200_16MHz 51 #define BR_115200_16MHz 8 #define BR_1000000_16MHz 0 #define BR_500000_16MHz 1 ボーレート設定のための定数定義 #define TX_BUF_LEN 128 char TxBuf[TX_BUF_LEN]; unsigned char TxBufPos; 送信用バッファの定義 void attribute ((interrupt, no_auto_psv)) _U1TXInterrupt(void) { LED0_on(); 送信割り込み ISR (1 バイト送信するごとに呼ばれる ) if( TxBuf[TxBufPos] ){ U1TXREG = TxBuf[TxBufPos]; TxBufPos++; 送信文字が Null 文字 (=0, 文の終わりを意味する ) じゃないならば 送信用レジスタ (U1TXREG) にデータを入れる }else{ //End of string } TxBufPos = 0; IEC0bits.U1TXIE = 0; //Disable Tx Interrupt Null 文字ならば 送信おわりなので 割り込みを禁止する } LED0_off(); IFS0bits.U1TXIF = 0; //Clear flag 割り込みフラグをクリアする

uart.c( つづき ) void UART1_init(){ UART 初期化用関数 //UART (connected to FT230) UART1_TXD_Enable(); UART の入出力をピンに割り当てる //IO-pins (UART) RPINR18bits.U1RXR = 0; //UART1 RX -> RP0 RPOR0bits.RP1R = OUTMAP_U1TX; //UART1 TX -> RP1 } //baud rate U1MODEbits.BRGH = 0; U1BRG = BR_1000000_16MHz; U1MODEbits.RTSMD = 1;// simple mode(don't use flow control) U1MODEbits.UEN = 0; U1MODEbits.ABAUD = 0; U1MODEbits.PDSEL = 0; //NO parity, 8bit U1MODEbits.STSEL = 0; //1-stop bit U1MODEbits.UARTEN = 1; //Enable UART module U1MODEbits.RXINV = 0; TxBufPos = 0; ボーレートの設定 (1000000 bps) U1STAbits.UTXEN=1;//Enable Transmit ( 入力ピンの設定 ) RPINR レジスタの U1RXR ビットにピン番号 (RP* の * の部分 ) を設定すると RP* が Rx に接続される ( 出力ピンの設定 ) RPOR0 レジスタの RP1R ビットに機能名 (UART の Tx) を設定すると RP1 が Tx に接続される RTS 等を使わない (3 線式通信 ) パリティを使わない 8 ビット転送 ストップビットの長さは 1 ビット UART モジュールを起動 送信を許可

uart.c( つづき ) int UART1_puts(unsigned char str[]){ char *buf; if(txbufpos > 0){ //Tx buffer is in use return -1; } 文字列出力 もし TxBufPos がすでに設定されているなら まだ前回の送信が終了していないー > 何もしない buf = TxBuf; while(*str) *(buf++) = *(str++); *(buf) = '\0'; TxBufPos=1; // UART1_putc( *TxBuf ); U1TXREG = *(TxBuf); strの内容をtxbufにコピーするまずは 1 文字送信する TxBufPos(TxBufPos[] TxBufPos(TxBuf[] の中の 次に送信する場所を記憶 ) ) を 1 にする } IFS0bits.U1TXIF = 0; //Clear Interrupt IEC0bits.U1TXIE = 1; //Enable interrupt return 0; 割り込みを許可する これにより 上で U1TXREG に設定したデータが送信完了したら 割り込みが発生する ISR へ飛ぶ int UART1_puts_wait(unsigned char str[]){ int ret, i; } while( (ret = UART1_puts(str)) < 0){ for(i=0; i<1000; i++) // If buffure is already in use asm("nop"); // -> wait } return ret; もし TxBufが使用中だったら retには 1が入るの その場合は 少し待って再送信

UART1_puts (char str[]) str[] Transmit Text\0 内容をコピー TxBuf[] Transmit Text\0 最初の文字を U1TXREG に書き込む割り込みを許可しておく UARTがデータ送信を開始送信完了で割り込みが発生する 割り込みルーチン _U1TXInterrupt(void) TxBuf[] TxBufPos ( 次に送信する文字の位置 ) Transmit Text\0 TxBufPos を +1 する TxBufPosが示す位置の文字を UARTがデータ送信を開始送信完了で割り込みが発生する U1TXREG に書き込む 文字列が終了するまで繰り返す文字列が終了したら 割り込みを禁止にして終了

main.c void init(){ //IO-Remap Unlock asm volatile ( "MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BCLR OSCCON, #6"); IO リマップ ( モジュールの入出力をピンに割り当てる ) するために ピンアサインの変更ができるようにする AD1PCFG = 0xffff; //ALl digital IOs EnableLED0(); EnableLED1(); //oscillator CLKDIV = 0x00; // CPU clock 1:1, FRC PS = 1, PLL enabled (i.e. 32MHz), //f_cpu = f_peripheral = 32MHz //TMR1 (1ms) T1CON = 0b0000000000010000; //Fcy=Fosc/2(=16MHz), Prescaler(1/8) -> 2MHz PR1 = 200; // 200/2MHz = 0.1ms TMR1 = 0; IPC0bits.T1IP = 7; //INterrupt priority = 7 IEC0bits.T1IE = 1; //Enable Interrupt T1CONbits.TON = 1; //start //UART UART1_init(); UART の初期化 //IO-Remap Lock asm volatile ( "MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BSET OSCCON, #6"); } これ以降 ピンアサインの変更ができない

main.c( つづき ) unsigned long sys_ticks; システム時計 タイマー ISR //TMR1 Interrupt void attribute ((interrupt, no_auto_psv)) _T1Interrupt(void) { sys_ticks++; システム時計を +1 する } IFS0bits.T1IF = 0;

main.c( つづき ) char str[64]; unsigned char str2[64]; 文字列出力用の変数領域の確保 int main(){ int len; unsigned long next_time=0; unsigned long dt = 1000; sys_ticks = 0; init(); LED0_off(); LED1_off(); next_time = sys_ticks + dt; while(1){ if(sys_ticks > next_time){ len = sprintf(str,"current ticks:%ld\n", sys_ticks); UART1_puts_wait(str); next_time = sys_ticks + dt; } } //Never comes here return 0; } 文字を出力するインターバルを設定 TMR1 が 0.1ms 毎に呼ばれるので 1000 と設定すると 1000 X 0.1 ms = 0.1 s 毎になる 次に文字を出力する時刻を設定 ( 現時刻 (sys_ticks) + インターバル ) 文字列を出力する 次に文字を出力する時刻を設定 ( 現時刻 (sys_ticks) + インターバル )

Linux でのボーレートの確認 設定 stty -F /dev/ttyusb0 -a で現在の設定値を見ることができる 例えば ボーレートを 1Mbps (1000000 bps, bit per second) にするには stty -F /dev/ttyusb0 1000000 -echo とする Linux では デバイスは通常のファイルと同じように読み書きできる 例えば USB ー RS232C は /dev/ttyusb0, dev/ttyusb1,... や /dev/ttyacm0, dev/ttyacm1,... などのファイル名になる データを PC から RS232 に送信するには echo Transmit text > /dev/ttyusb0 などとする RS232 から受信したデータを表示するには cat /dev/ttyusb0 などとする C 等のプログラムからも通常のファイルと同じように読み書きできる

1.USB ケーブルを PC につなぐ 2. ターミナル (gnome-terminal, lxterminal 等 ) を開く 3. シリアルポートの設定を行う stty -F /dev/ttyusb0 1000000 -echo 等 4.PIC からのデータを読み込んで表示する. cat /dev/ttyusb0 このように,PIC から送られてきたデータが画面に表示される.

main 関数の一部 if(sys_ticks > next_time){ len = sprintf(str,"current ticks:%ld\n", sys_ticks); UART1_puts_wait(str); next_time = sys_ticks + dt; } この文字列が表示されている sys_ticks は 0.1ms ごとに +1 するのだったよって, 例えば systicks=135438 は 13.5438 秒を意味する. main() 内でdt=1000としているから 0.1004 秒毎に出力されている

UART からの受信 大まかな流れ 割り込み処理割り込み 1 文字データを受信受信バッファ (RxBuf) にデータを保存 No 文字列終わり?( 改行文字?) Yes フラグ (FLAG_RX_READY) を立てる 受信処理 フラグ (FLAG_RX_READY) が立ってるか? Yes No UART1_gets(str, len) 関数を使って, RxBuf の内容を文字列 str にコピーする この関数を呼ぶと,FLAG_RX_READY はクリアされる str の内容を UART に送信する

ターミナルを 2 つ開く ( 送信用と受信用 ) はじめに, 受信側ターミナルで先ほどと同じように cat /dev/ttyusb0 としておく. 送信側では, echo Hello World! > /dev/ttyusb0 とすると, シリアルポートに文字列 Hello World! を送信できる. 受信側ターミナル そうすると, 受信側ターミナルに, 今送信した文字列が表示されるはず. echo Hello World! > /dev/ttyusb0 送信側ターミナル cat /dev/ttyusb0 データ :Hello World! USB UART PIC データ :Received str Is >>Hello World!<<