〔ArduinoとPIC16F819で通信と基礎編〕 [SPIデバイスを複数個接続する] 〔マイコンのトップに戻る〕
左図の様に接続します。
16F819からのデータは受信していません、データを送るだけのプログラムです。
---------------------------------------------------------------------
#include <pic.h>
#include <htc.h> // delay用
#define _XTAL_FREQ 4000000 // delay用に必要(クロック4MHzを指定)
// コンフィギュレーション1の設定
// CLKOUTピンをRA4ピンで使用する(CLKOUTEN_OFF):内部クロック使用する(INTIO)
// 外部クロック監視しない(FCMEN_OFF):外部・内部クロックの切替えでの起動はなし(IESO_OFF)
// 電源電圧降下常時監視機能ON(BOREN_ON):電源ONから64ms後にプログラムを開始する(PWRTEN_ON)
// ウオッチドッグタイマー無し(WDTE_OFF):
// 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(MCLRE_OFF)
// プログラムメモリーを保護しない(CP_OFF):データメモリーを保護しない(CPD_OFF)
__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
// コンフィギュレーション2の設定
// 動作クロックを32MHzでは動作させない(PLLEN_OFF)
// スタックがオーバフローやアンダーフローしたらリセットをする(STVREN_ON)
// 低電圧プログラミング機能使用しない(LVP_OFF)
// Flashメモリーを保護しない(WRT_OFF):電源電圧降下常時監視電圧(2.5V)設定(BORV_25)
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_25 & LVP_OFF);
// 指定した時間(numx10ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
int i ;
// numで指定した回数だけ繰り返す
for (i=0 ; i<num ; i++) {
__delay_ms(10) ; // 10msプログラムの一時停止
}
}
// メインの処理
void main()
{
int i ;
OSCCON = 0b01101010 ; // 内部クロックは4MHzとする
ANSELA = 0b00000000 ; // アナログは使用しない(すべてデジタルI/Oに割当てる)
TRISA = 0b00001100 ; // RA2ピン以外を全て出力に割当てる(RA3は入力専用)
PORTA = 0b00000000 ; // 出力ピンの初期化(全てLOWにする)
// SPIモードの設定と初期化
SDOSEL = 1 ; // 3番ピン(RA4)をSDOピンに設定
SSP1CON1 = 0b00100001 ; // クロック極性はLOW マスタモードでFOSC/16のクロックに設定
SSP1STAT = 0b00000000 ; // クロック位相は0、アイドル(0V)→アクティブ(5V)時にデータ送信 *2)
SSP1IF = 0 ; // SPIの割込みフラグを初期化する
SSP1IE = 1 ; // SPIの割込みを許可する
PEIE = 1 ; // 周辺装置割込み有効
GIE = 1 ; // 全割込み処理を許可する
Wait(500) ; // 5秒後に開始
while(1) {
// LCDに表示しやすい用にキャラクター文字を送っています。
for (i = 0x30 ; i < 0x7b ; i++) {
SSP1BUF = (char)i ;
Wait(100) ; // 1秒毎に送る
}
}
}
---------------------------------------------------------------------
こんな感じでテストしました。
記事一部変更(*2) 2016/06/13
追記(*1) 2012/02/27
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.