当サイトのコンテンツはご自身の判断と責任においてご利用ください。営利目的の利用は固くお断りします

更新2022/05/05

UARTの使い方例

マイコンを使うと、他のデバイスとデータのやり取りをしたい時があります。
PIC16F690をはじめほとんどのマイコンにはUART機能が内蔵されており、他デバイスとシリアル通信が可能です。
UARTの詳しいフォーマット・ビットの割り付けや電位などはUARTの基本UARTの電圧を参照してください。
本章では、PIC16F690で作る汎用モジュールPIC16F690汎用Cソースコードを使い、PIC16F690を使ったUARTの具体的な使い方を説明します。

機能の想定

例として、以下のような機能を持ったモジュールで説明します。
・SWの変化を検出・確定し、SWオンで0xff、SWオフで0x00の1バイトデータをUARTで外部に送信します。
・LEDの点消灯指示データを、UARTの割り込みを使って外部から受信し、0xffのデータを受信でPWMを使いLEDを点灯、0x00のデータを受信でLEDを消灯させます。

全体の配線例

PIC16F690で作る汎用モジュールのマイコンモジュールを中心に、以下のように配線したと想定します。
PIC16F690 UART利用回路例

プログラム例

PIC16F690汎用Cソースコードを使い、その一部を下記のように書き換えます。
記載されていない他の部分は、そのまま使用します。

void main(void){

  usartinit(207); //USARTの設定 9600bps
  unsigned char temp=0; //テンポラリー変数
  unsigned char qportc=0; //過去値記憶用

  //メインルーチン開始------------------------------------------
   while(1){
    while(temp==(qportc & 0x01)){ //信号変化街待ち
      temp=PORTC & 0x01;
    }

    wait(30); //30mS待機

    if((PORTC & 0x01) != temp){
      break; //一致しない場合は、最初に戻る
    }

    qportc=temp; //過去値更新

    if(temp==0x01){
      tx1byte(0xff); //オンデータ送信
    }else{
      tx1byte(0x00); //オフデータ送信
    }

  }

}

void interrupt checkint(void){
  //USART受信割り込み判定
  if(RCIF==1){ //受信割り込みフラグ判定
    unsigned char tempusart=0x00;

    if(FERR==1){ //フレーミングエラー判定
      tempusart=rx1byte(); //空読み エラーフラグクリア処理 RCIFクリア
    }else if(OERR==1){ //オーバーランエラー判定
      CREN=0;CREN=1; //エラーフラグクリア処理
      tempusart=rx1byte(); //空読み RCIFクリア
    }else{
      rxdata=rx1byte(); //受信データ取り込み&RCIFクリア

      //受信処理エリア-------------------------
      if(rxdata==0xff){
        pwmsetduty(0xff); //LEDを点灯
      }else if(rxdata==0x00){
        pwmsetduty(0x00); //LED消灯
      }
    }

  }

}

UARTを使いこなすことができれば、他と連携することができるようになるので、電子工作の範囲がグンと拡がります。

(最新)

(中の人)


電子回路とファームウェア専門の元エンジニアが、初心者の頃の疑問や勉強・経験で知った「そうだったのか」を2009年から書いています。 ⇒続き

ページの先頭へ戻る
シェア
Tweet このエントリーをはてなブックマークに追加