概要
ATOM Lite(ESP32)をマスター、PIC12F1840をスレーブとして、I2C通信を使って、ATOM LiteからPICのLEDをオンオフ。
外観
部品
- PIC12F1840
- M5Stack ATOM Lite
回路
プログラム
PIC(C言語)
#include <stdio.h>
#include <xc.h>
//config1
#pragma config FOSC=INTOSC //Oscillator Selection 内部クロック使用
#pragma config WDTE=OFF //Watchdog Timer off
#pragma config PWRTE=ON //Power up timer on(スイッチを入れた直後電源が安定するまで待つ)
#pragma config MCLRE=OFF //MCLR PIN off (ハードウェアリセットのピンの用途を無しにしてdigital pinとして使えるようにする)
#pragma config CP=OFF //CODE PROTECT OFF プログラムの読み出しのプロテクトoff
#pragma config CPD=OFF //Data Protect OFF データ領域の読み出しのプロテクトoff
#pragma config BOREN=ON // Brownout on (もし電源が不安定のとき一時停止する)
#pragma config CLKOUTEN=OFF // CLOCK 信号の外部出力をOFF
#pragma config IESO=OFF // 2段階クロックoff(立ち上がりで即安定する内部クロックを使いその後外部クロックに切り替える設定)
#pragma config FCMEN=OFF //Fale-safe Clock Monitor off(外部クロックが壊れたとき内部クロックに切り替える設定)
//config2
#pragma config WRT=OFF //Write Protection プログラム領域の書き込み禁止 off
#pragma config PLLEN=OFF //クロック逓倍off (onにすると発生したクロックが4倍になる)
#pragma config STVREN=ON //スタック領域をオーバーしたらリセットする(offは何もしない)
#pragma config BORV=HI // Brounout電圧設定 (HI:電源電圧がちょっとさがるとリセット、LO:うんと下がるとリセット)
#pragma config LVP=OFF //プログラム書き込み電圧(ON;低電圧書き込み有効 マイコンの電圧で書き込める off:低電圧書き込み無効 PICKIT3のときoffに)
#define _XTAL_FREQ 2000000 //内部clock2MHz for delay macro
#define SLVADR 0xB6 //SLAVE ADDRESS
void i_read(void); //i2c 受信要求処理
void i_write(void); //i2c 送信要求処理
//void __interrupt() i2cslave(void); //割込処理
/****************************
* 割込処理
*****************************/
void __interrupt() i2cslave(void){
char x;
x=SSP1STAT & 0x2C;
if(x==0x08){
i_read(); //受信要求
}else if(x==0x0C){
i_write(); //送信要求
}
}
/*****************************
* 受信要求処理
*****************************/
void i_read(void){
char d_val;
do{
SSP1CON1bits.CKP=1; //stretch enable
PIR1bits.SSP1IF=0; //割込フラグクリア
if(SSP1STATbits.BF==0){
if(SSP1STATbits.P==1){
break; //stop検出
}
}else{
//受信有り データ受信処理
d_val=SSP1BUF;
if(d_val == 0){
RA4 = 0;
}else{
RA4 = 1;
}
}
}while(1);
}
/*****************************
* 送信要求処理
*****************************/
void i_write(void){
do{
SSP1BUF = 0x63; //仮値
SSP1CON1bits.CKP=1; //stretch解除
PIR1bits.SSP1IF=0; //割込フラグクリア
}while((PIR1bits.SSP1IF==1)&&(SSP1STATbits.P==0));
}
/**********************************
main
**********************************/
int main(void){
OSCCON=0x60; //内部Clock 2MHz
INTCONbits.GIE=0; //割り込み禁止
INTCONbits.PEIE=0; //割り込み禁止
//PORTAをディジタルI/Oにする
PORTA=0;
LATA=0;
ANSELA=0;
TRISA=0x06; //SCL,SDAのRA1,RA2は入力
//ここからI2Cの設定
SSP1STAT=0x80; //SMP ON
SSP1CON1=0x36; //SSP1EN=ON,I2C slave mode 7bit address
SSP1ADD=SLVADR; //SLAVE ADDR SET
SSP1CON2bits.SEN=1; //stretch enabled
SSP1CON1bits.CKP=1; //stretch enabled
PIR1bits.SSP1IF=0; //割り込みフラグクリア
//ここまでI2Cの設定
// 初値設定
RA4 = 1;
// ここに割り込み許可をしてからメインループへ
INTCON=0;
INTCONbits.INTE=1; //外部割込み許可
INTCONbits.PEIE=1; //周辺割込許可
INTCONbits.GIE=1; //周辺割込許可
PIE1bits.SSP1IE=1; //i2c 割り込み 許可 Enables the MSSP interrupt
//loop
while(1){
}
return 0;
}
ATOM Lite(MicroPython)
import utime
from machine import Pin, SoftI2C
i2c = SoftI2C(scl=Pin(21), sda=Pin(25), freq=100000)
ls = i2c.scan()
print(ls)
if len(ls) == 0:
print('no slave device')
exit()
i2c.writeto(ls[0],b'\x00') #オフ
utime.sleep(1)
i2c.writeto(ls[0],b'\x01') #オン
utime.sleep(1)
v = i2c.readfrom(ls[0], 1) #1バイト読込
print(int.from_bytes(v,'big'))
詳細
ATOM Lite(ESP32)とPIC12F1840でI2C通信を介してLチカ
https://tiblab.net/blog/2022/11/i2c_test_esp32_and_pic/
参照サイト
PIC12F1840 i2cの設定とPWMの設定 (XC8編)
https://karappi.mydns.jp/kousaku/pic12f1840/pic12f1840_c.html
データシート
http://ww1.microchip.com/downloads/jp/devicedoc/41413c_jp.pdf
(PIC12F1840は英語なので、日本語のPIC12F1840の)