ZigbeeモージュールTWE-Liteでシリアル通信のテストをしました.
PC-USBシリアルモジュール-TWE-Lite
USBシリアルモジュールのTX,RXとTWE-LiteのTX,RXをクロスして接続する.
親機:M1-GND,M2,M3オープン,BPS-GND(38400bps)
子機:M1,M2,M3オープン,BPS-GND(38400bps)
まずは,teratermでテスト.
通信速度を38400にして,TerminalのTransmitをCR+LFとしておく.
親機 (論理ID=0x00) ,子機 (論理ID=0x78)双方から約1秒間隔で,
以下のようなIO状態の通知データが送られる.
:7881150175810000380026C9000C04220000FFFFFFFFFFA7
親機からデータを送ってみる.
下記データをコピーしteratermに張り付け,Enterすれば,
子機側のPCのteraterm上に表示される.
:780100112233AABBCCDD13
最後の2バイトはチェックサムで,0x78+0x01+0x00+...0x13の下位が0x00になる.
続いてProcessingで作ったシリアル通信のテストプログラム
親機側からhello!を2秒間隔で送信する.
子機では,IO状態の通知データは無視しそれ以外のデータを表示する.
親機側の送信プログラム
import processing.serial.*;
Serial myPort;
void setup(){
myPort = new Serial( this, Serial.list()[0], 38400);
}
void draw(){
char[] data= new char[20];
int i,sum,n=7;//N of words +1
data[0] =0x78;
data[1] ='h';
data[2] ='e';
data[3] ='l';
data[4] ='l';
data[5] ='o';
data[6] ='!';
String str = ":";
sum=0;
for(i=0;i<n;i++)sum+=(int)(data[i]);
data[n]=(char)((256-sum%256)%256);
for(i=0;i<=n;i++){
if(data[i]/16>9)str+=(char)('A'+(data[i]/16-10));
else str+=(char)('0'+(data[i]/16));
if(data[i]%16>9)str+=(char)('A'+(data[i]%16-10));
else str+=(char)('0'+(data[i]%16));
}
println(str);
str+='\r'; //CR
str+='\n'; //LF
myPort.write(str);
//delay 2 sec
int t=millis();
while(millis()<t+2000){}
}//draw()
子機側の送信プログラム
import processing.serial.*;
Serial myPort;
void setup(){
size(100,100);
myPort = new Serial( this, Serial.list()[0], 38400);
}
void draw(){
int i,n;
char a;
char[] data = new char[100];
String str = "";
for(i=0;i<100;i++){
while (myPort.available()==0){};
data[i]=(char)myPort.read();
str+=data[i];
if(data[i]=='\n')break;
}//for
n=i; //50
if(n!=50)for(i=3;i<n-4;i+=2){
if(data[i]>='A')a=(char)(10+data[i]-'A');
else a=(char)(data[i]-'0');
a*=16;
if(data[i+1]>='A')a+=(char)(10+data[i+1]-'A');
else a+=(char)(data[i+1]-'0');
print(a);}
}//draw()
ATMELのAT-Tiny26,ATmega,R8Cなどのワンチップマイコン,C言語,JAVAなどのプログラミング言語の入門のためのページです.サンプルプログラムを中心に紹介します.他にもLinixや数学ソフトなどの紹介も行います.
このブログを検索
あなたは
番目のお客様です.
内容
Visual C++ Express Editionを用いたプログラミングメモ
Windows版 Mathematicaの使い方
MATLABとOctaveを使う
Fedora,Vine,Debian,KnoppixでLinux一本勝負?
CygwinやMinGWでCプログラミングを行う
C言語のプログラミング入門
R8Cで液晶SC1602BSの表示を行う
マイコンと2進数
R8CTinyマイコンの最初の一歩(Cプログラミング)
R8C/TinyシリーズのリセットとIDコードチェック機能
R8CTinyでCOMポートの通信実験
CT-208でR8CTinyの実行(アセンブラ)
R8C/Tiny29(サンハヤトのMB-8C29)の評価
サウンドファイルwavを開く
よく使うATMELのマイコンのアセンブラの比較
ATMELのATTiny26入門
Tiny26で液晶SC1602BSの表示を行う
AD変換の結果を液晶に表示する
マイコンによる電子オルゴール
Tiny2313でパルスの分周とカウンタ
Tiny2313でシリアル通信とROMリーダ
Tiny2313でGPSデータを液晶に表示
加速度センサを使う
マイコンでI2C-EEPROMの読み書きを行う
TINY13,TINY25,2313などの8ピンマイコンを使う
PSOCマイコンスタートアップ
AF,FMラジオ
Windows版 Mathematicaの使い方
MATLABとOctaveを使う
Fedora,Vine,Debian,KnoppixでLinux一本勝負?
CygwinやMinGWでCプログラミングを行う
C言語のプログラミング入門
R8Cで液晶SC1602BSの表示を行う
マイコンと2進数
R8CTinyマイコンの最初の一歩(Cプログラミング)
R8C/TinyシリーズのリセットとIDコードチェック機能
R8CTinyでCOMポートの通信実験
CT-208でR8CTinyの実行(アセンブラ)
R8C/Tiny29(サンハヤトのMB-8C29)の評価
サウンドファイルwavを開く
よく使うATMELのマイコンのアセンブラの比較
ATMELのATTiny26入門
Tiny26で液晶SC1602BSの表示を行う
AD変換の結果を液晶に表示する
マイコンによる電子オルゴール
Tiny2313でパルスの分周とカウンタ
Tiny2313でシリアル通信とROMリーダ
Tiny2313でGPSデータを液晶に表示
加速度センサを使う
マイコンでI2C-EEPROMの読み書きを行う
TINY13,TINY25,2313などの8ピンマイコンを使う
PSOCマイコンスタートアップ
AF,FMラジオ
2013年8月19日月曜日
ZigbeeモージュールTWE-LiteとProcessingでシリアル通信
2013年7月30日火曜日
USBシリアル変換モジュール(FT232RL)を使ったR8C/Tinyの書き込みと動作確認
USBシリアル変換モジュール(FT232RL)を使ったR8C/Tinyの書き込みと動作確認 R8C/1x,R8C/2xシリーズは20ピンで,ピン配置が同じ物が多いです. R8C/1Bは,「電子工作のためのR8C/Tinyスタートアップ」に付いてきます. R8C/29は,サンハヤトから販売されています. 秋月からもマイコンボードが販売されています. 回路はRESET,(外部発振),MODEの設定だけなので簡単です. TXD,RXDの接続だけ変えてやれば,秋月のM12A・M11Aマイコン開発キットで
書き込みをすることも可能です.
--------
R8C/1Bの動作確認
XOUT,XIN-外部発振子を付ける
RESET-10KΩ-VCC
RESET-0.1μF-GND
MODE-10KΩ-VCC
FlashStaでの書き込み
USBシリアルモジュールとR8C/1Bを接続する
VCC-VCC
GND-GND
TXD-P4_5
RXD-P3_7
(書き込み時はMODE-GND)
HEWでReleseで「全てをビルド」する.xxx.motができる.
FlashStaを起動し,xxx.motをE.P.Rする.
MODE-GNDの接続を外し,p1_0にLEDを接続し,
再び電源を入れれば動く.
#include "sfr_r81b.h"
void main(void)
{
unsigned int i;
//メインクロックの切替
prc0 = 1;
cm13 = 1;
cm05 = 0;
cm06 = 0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0;
prc0 = 0;
pd1_1=1; //p1_1を出力に設定
while(1){
p1_1=0;
for(i=0 ; i<50000 ; i++){};
p1_1=1;
for(i=0 ; i<50000 ; i++){};
}
}
--------
サンハヤトMB-R8C29の動作確認
MB-R8C29はP1_1にLEDが付いている
RESET-10KΩ-VCC
RESET-0.1μF-GND
MODE-10KΩ-VCC
FlashStaでの書き込み
USBシリアルモジュールとR8C/1Bを接続する
VCC-VCC
GND-GND
TXD-P4_5
RXD-P3_7
(書き込み時はMODE-GND)
HEWでReleseで「全てをビルド」する.xxx.motができる.
FlashStaを起動し,xxx.motをE.P.Rする.
MODE-GNDの接続を外し,
再び電源を入れれば動く.
#include "sfr_r829.h"
void main(void)
{
unsigned int i;
//メインクロックの切替
prc0 = 1;
cm13 = 1;
cm05 = 0;
cm06 = 0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0;
prc0 = 0;
pd1_1=1; //p1_1を出力に設定
while(1){
p1_1=0;
for(i=0 ; i<50000 ; i++){};
p1_1=1;
for(i=0 ; i<50000 ; i++){};
}
}
--------
秋月のM12A・M11Aマイコン開発キットでR8C/1x,R8C/2xシリーズに書き込みをする
マイコン開発キット-R8Cの接続
マイコン開発キット左側上から
3番ピン-3番ピン(RESET)
5番ピン-5番ピン(GND)
7番ピン-7番ピン(VCC)
8番ピン-8番ピン(MODE)
マイコン開発キット右側上から
5番ピン-2番ピン(p3_7)
7番ピン-9番ピン(p4_5)
マイコン開発キットには,写真のように丸ピンICソケットを付けて,
そこからジャンパーワイヤで接続するのが簡単です. 外部発振子の付いていないR8C/1Bのようなマイコンは,外部発振子を付けてください.
2013年2月28日木曜日
R8C M12Aサンプルプログラム
R8C/Tiny M11A およびM12Aのサンプルプログラム集
クロックは内部発振20MHzを使っています.
M11Aを使う場合#includeを書き換えてください.
M11A およびM12Aは低価格で,高速で,AD変換,シリアル通信を備えているので,簡単な作業は全部これでできてしまいます.
秋月のマイコン開発キットを買うとソフト(開発環境HEW+書き込みのFlashSta.exe)が付いています.
USBシリアルモジュールと接続するだけで,書き込み回路を自作することも可能です.
E8aエミュレータを使って書き込みをする場合,VCC,GND,RESET,MODEを接続して,書き込みができます.
//*******************************************
/*
LEDの点滅
*/
#include "sfr_r8m12a.h"
void main(void);
void main(void)
{
unsigned int i;
prc0=1;
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0;
pd3_4=1; //p3_4を出力に設定
while(1){
p3_4=0; //LED off
for(i=0 ; i<50000 ; i++){};
p3_4=1; //LED on
for(i=0 ; i<50000 ; i++){};
}
}
//*******************************************
/*
AD変換のテスト 変換値に合わせてLEDをPWM変調する
AD AN0 and PWM p3_4
m12Aは10bitのAD変換を行う
*/
#include "sfr_r8m12a.h"
void main(void);
void main(void)
{
unsigned int i,n;
//Clock=20Mhz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<2000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
pd3_4=1; //p3_4を出力に設定
//AD
mstad=0;
admod=0B00000011;
adinsel=0B00000000; //AN0
while(1){
adcon0=0b00000001; //Start AD
while(adcon0 & 0B00000001){} //wait AD finish
n=ad0;
n=n>>2;
p3_4=1; //LED on
for(i=0; i<n; i++){};
p3_4=0; //LED off
for(i=n; i<255; i++){};
}
}
//*******************************************
/*
test serial com 9600bps
PCからaを転送するとLEDがon,bを転送するとLEDがoff
その他の英小文字を転送すると大文字が帰ってきます.
*/
#include "sfr_r8m12a.h"
void Utx(char data); // 1文字送信
char Urx(void); // 1文字受信
void main(void);
void main(void)
{
unsigned int i,n;
char dat;
//Clock=20Mhz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<2000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
//Set UART0
mstuart = 0;
p15sel2=0; //P1_5:RX
p15sel1=0;
p15sel0=1;
p14sel2=0; //P1_4:TX
p14sel1=0;
p14sel0=1;
u0mr=0x05; //UART mode:8bit
u0c0=0x10; //source:f1
u0brg=129; //f1/(bps*16)-1=20M/(9600*16)-1=129.2
te_u0c1=1; //TX enable
re_u0c1=1; //RX enable
pd3_4=1; //p3_4を出力に設定
//AD
//mstad=0;
//admod=0B00000011;
//adinsel=0B00000000; //AN0
while(1){
dat = Urx();
if(dat=='a')p3_4=0; //P1_1 Lレベル(LED:on)
if(dat=='b')p3_4=1; //P1_1 Hレベル(LED:off)
if(dat>'b'){ //c以降は大文字を返す
dat=dat-'a'+'A';
Utx(dat);
}
}//while
}
void Utx(char data)
{
while(ti_u0c1 != 1){}; // データ転送待ち
u0tbl = data; // 送信バッファ(U0TBL)にデータセット
}
char Urx(void)
{
int data0;
char data; // 受信データ格納変数
// char err; // エラーデータ格納変数
while (ri_u0c1 != 1){}; // 受信待ち
data0 = u0rb; // 受信データの取り出し
data=(char)data0;
return data;
}
//*******************************************
/*
6マイクロsの遅延
*/
#include "sfr_r8m12a.h"
void main(void);
void delay(void);
void main(void)
{
unsigned int i;
// System clock Int 20MHz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
pd3_4=1;// P1_2 output
while(1){
p3_4=0;
delay();
p3_4=1;
delay();
delay();
delay();
delay();
}
}
//delay 6Us
void delay(void)
{
unsigned char i;
for(i=0;i<5;i++){}//6Us
} //delay
//*******************************************
/*
delay using Timer RB
delay()待ち関数,単位はマイクロ秒
カウンタソースf2=10MHz
関数を呼び出すと4.7Usほど余計にかかる.
*/
#include "sfr_r8m12a.h"
void main(void);
void delay(unsigned char);
void main(void)
{
unsigned int i;
// System clock Int 20MHz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
pd3_4=1;// P1_2 output
while(1){
p3_4=0;
delay(10);
p3_4=1;
delay(90);
}
}
void delay(unsigned char t)
{
// tstop_trbcr = 1;// タイマRBカウント強制停止
mstcr &= 0x71;// Timer RB2 Active
trbmr=0b00000000; //f1(20MHz) タイマモード
// trbmr=0b00110000; //f2(10MHz) タイマモード
trbpre=20-1;
trbpr=t-1;
asm("nop");
asm("nop");
tstart_trbcr=1; //カウント開始
while(trbpr!= 0);
tstop_trbcr = 1;// タイマRBカウント強制停止
} //delay
//*******************************************
/*
delay using Timer RC
delay()待ち関数,単位はms
タイマRCのカウンタソースをシステムクロック/32とし,カウンタ値が625になるまでの周期で繰り返す.
*/
#include "sfr_r8m12a.h"
void main(void);
void delay(unsigned int t);
void main(void)
{
unsigned int i;
// System clock Int 20MHz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
pd1_2=1;// P1_2 output
while(1){
p1_2=0;
delay(500);
p1_2=1;
delay(500);
}
}
void delay(unsigned int t)
{
//20MHz f32=625000Hz
unsigned int i=0;
msttrc=0; //Timer RC Active
trccr1 = 0b01000000;// f32
cclr_trccr1=1; //コンペア一致Aでカウンタクリア
trcgra = 625-1;// Period 1kHz
trccnt=0; //Timer RCクリア
imfa_trcsr=0;//コンペア一致フラグ
cts_trcmr = 1;//count start
while(i<=t){
while(imfa_trcsr==0);//カウンタとTRCGRAが一致するまで待つ
imfa_trcsr=0;//コンペア一致フラグをクリア
i++;
}
cts_trcmr = 0;//count stop
} //delay
//*******************************************
/*
test EEP
BLOCK Aでデータフラッシュの書き込みと読み出しテスト
03000h-037FFh
*/
#include "sfr_r8m12a.h"
#define BLOCK_A ((unsigned char *)0x03000) // BLOCK A first address
#define BLOCK_B ((unsigned char *)0x03400) // BLOCK B first address
void Utx(char data); // 1文字送信
char Urx(void); // 1文字受信
void eepwrite(unsigned int,unsigned char);
unsigned char eepread(unsigned int);
void main(void);
void main(void)
{
unsigned int i,n;
char dat;
//Clock=20Mhz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<2000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
//Set UART0
mstuart = 0;
p15sel2=0; //P1_5:RX
p15sel1=0;
p15sel0=1;
p14sel2=0; //P1_4:TX
p14sel1=0;
p14sel0=1;
u0mr=0x05; //UART mode:8bit
u0c0=0x10; //source:f1
u0brg=129; //f1/(bps*16)-1=20M/(9600*16)-1=129.2
te_u0c1=1; //TX enable
re_u0c1=1; //RX enable
do{ dat = Urx();
}while(dat!='s');//開始命令を待つ
//書き込み
for(i=0;i<1024*2;i++)eepwrite(i,(unsigned char)i);
//読み出し
for(i=0;i<1024*2;i++){n=eepread(i);
Utx(n/100+'0');
n=n%100;
Utx(n/10+'0');
n=n%10;
Utx(n+'0');
Utx('\n');
}
while(1){}//while
}
void Utx(char data)
{
while(ti_u0c1 != 1){}; // データ転送待ち
u0tbl = data; // 送信バッファ(U0TBL)にデータセット
}
char Urx(void)
{
int data0;
char data; // 受信データ格納変数
while (ri_u0c1 != 1){}; // 受信待ち
data0 = u0rb; // 受信データの取り出し
data=(char)data0;
return data;
}
void eepwrite(unsigned int i,unsigned char data)
{
unsigned char *addr;
// Flash control register set
fmr01 = 0;
fmr01 = 1; //CPU書き換えモード有効
fmr02 = 0;
fmr02 = 1; //EW1モード
addr = BLOCK_A;
addr+=i; //set address
*addr=0x40; //Write command
*addr=data; //Write
while(fst7 == 0);//wait until complete
fmr01 = 0; //CPU書き換えモード無効
}
unsigned char eepread(unsigned int i)
{
unsigned char *addr,data;
// Flash control register set
fmr01 = 0;
fmr01 = 1; //CPU書き換えモード有効
fmr02 = 0;
fmr02 = 1; //EW1モード
addr = BLOCK_A;
addr+=i; //set address
*addr=0xFF; //Read command
data = *addr; //Read
fmr01 = 0; //CPU書き換えモード無効
return data; //Write
}
//*******************************************
/*
m12a test Int 割り込みのテスト
通常動作はLEDの点滅,割り込みで一定時間LEDを連続点灯する
p4_5をint0として使うp45sel0=1;p45sel1=0;
優先レベル設定はILVLE5~ILVLE4
sect30.incは書き換えず,
#pragma interrupt 関数名(vect=割り込み番号)
として割り込みベクタを定義する
INT0の割り込み番号は29
*/
#include "sfr_r8m12a.h"
#pragma interrupt int0(vect=29)
void main(void);
void int0(void);
void main(void)
{
unsigned int i;
prc0=1;
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0;
int0en=1; //set Int
int0f0=1;//intf0=0b00000011;Int 0 フィルタあり、f32でサンプリング
int0f1=1;
p45sel0=1;//P4_5 をINT0に設定
p45sel1=0;
ilvle=0b00010000;//INT0 割り込み優先レベル1
asm("FSET I");//割り込み許可
pd3_4=1; //p3_4を出力に設定
while(1){
p3_4=0; //LED off
for(i=0 ; i<50000 ; i++){};
p3_4=1; //LED on
for(i=0 ; i<50000 ; i++){};
}
}
void int0(void)
{
unsigned int i,j;
p3_4=1; //LED off
for(j=0;j<10;j++)for(i=0;i<50000;i++){};
}
//*******************************************
/*
Timer RCを使い矩形波を出力する.
Output:TRCGRB
PERIOD:TRCCRA
*/
#include "sfr_r8m12a.h"
void main(void);
void clock_init(void);/* System clock setting */
void timer_rc(void);
void main(void)
{
clock_init();/* System clock Int 20MHz */
timer_rc();/* Timer RC PWM */
while(1);
}
void clock_init(void)
{
unsigned int i;
//Clock=Int 20Mhz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
}
void timer_rc(void)
{
unsigned int i;
p1= 0x00;/*All pin: Low */
pd1_2=1;/* TRCIOB P1_2 18pin: output */
pml1 = 0b00010000;/* P1_2:TRCIOB selected */
msttrc=0; //Timer RC Active **************!
pwm2_trcmr=1;//PWMモード
pwmb_trcmr=1;//TRCIOB PWMモード選択ビット
// trccr1 = 0b01000010;/* f32 TOB */
trccr1 = 0b00000010;/* f1 TOB */
cclr_trccr1=1; //コンペア一致Aでカウンタクリア
asm("nop");
asm("nop");
polb_trccr2=1;//TRDIOB output level: H
trcgra = 20000-1;// Period 20MHz/20000 = 10kHz
trcgrb = 20000/2-1;// PWM B
eb_trcoer=0;// TRCIOB Pin Output enabled
cts_trcmr = 1;// TRCCNT count start
}
//*******************************************
/*
R8C m12aを使いクロックモジュールRTC-8564NBでI2Cのテスト
m12a+RTC-8564NB
A4:SDA A5:SCL,RTC-8564NB:Slave Adress=0B1010001
"s+Enter"で秒のリセットs=0,
"tAADD+Enter"でRTC-8564NBの指定するアドレスの値を変更する.
02(Sec),03(Min),04(Hour),05(Day),07(Month),08(Year)
*/
#include "sfr_r8m12a.h"
#define s_SCL p4_2=1
#define c_SCL p4_2=0
#define s_SDA p1_0=1
#define c_SDA p1_0=0
#define SDA_IN pd1_0=0
#define SDA_OUT pd1_0=1
#define SDA_data p1_0
#define AD 0B1010001
void main(void);
void delay(void);
void start(void);
void stop(void);
void ack(void);
void i2cwrite(unsigned int add,unsigned char dat);
unsigned char i2cread(unsigned char address);
void Utx(char data);
char Urx(void);
void main(void)
{
unsigned int i;
unsigned char data,data2,a,b,x1,x2;
// System clock Int 20MHz
prc0=1; //Protect off
hocoe=1;
for(i=0;i<1000;i++){}
hscksel=1;
scksel=1;
prc0=0; //Protect on
//Set I2C
pd4_2=1;// SCL OUT
pd1_0=1;// SDA In or OUT
s_SDA;// set SDA
//Set UART0 9600bps
mstuart = 0;
p15sel2=0; //P1_5:RX
p15sel1=0;
p15sel0=1;
p14sel2=0; //P1_4:TX
p14sel1=0;
p14sel0=1;
u0mr=0x05; //UART mode:8bit
u0c0=0x10; //source:f1
u0brg=129; //f1/(bps*16)-1=20M/(9600*16)-1=129.2
te_u0c1=1; //TX enable
re_u0c1=1; //RX enable
while(1){
if(ri_u0c1 != 0){ //Serial.available
a=Urx();
//Set s =0
if(a=='s')i2cwrite(0x02,0x00);//Address,Data
//Set m h d
if(a=='t'){ a=Urx();b=Urx();
x1=(a-'0')*16+(b-'0');//Address
a=Urx(); b=Urx();
x2=(a-'0')*16+(b-'0');//Data
i2cwrite(x1, x2);
}//t
}// if(ri_u0c1 != 0)
data=i2cread(0x04);//Hour
data2=(data>>4)&0B00000011;
Utx('0'+data2);
Utx('0'+(data&0B00001111));
Utx(':');
data=i2cread(0x03);//Min
data2=(data>>4)&0B00000111;
Utx('0'+data2);
Utx('0'+(data&0B00001111));
Utx(':');
data=i2cread(0x02);//Sec
data2=(data>>4)&0B00000111;
Utx('0'+data2);
Utx('0'+(data&0B00001111));
Utx('\n');
for(i=0;i<50000;i++)delay();
for(i=0;i<50000;i++)delay();
}
}
void delay(void){
unsigned char i;
for(i=0;i<5;i++){}//delay 6Us
} //delay
void start(void){
s_SDA;// set SDA
s_SCL; // set CLK
delay();
c_SDA; // clear SDA
c_SCL; // clear CLK
delay();
}
void stop(void){
c_SDA; // clear SDA
s_SCL; // set CLK
delay();
s_SDA;// set SDA
c_SCL; // clear CLK
delay();
}
void Hclk(void){//SDAがhighで1クロック
s_SDA;// set SDA
s_SCL; // set CLK
delay();
c_SCL; // clear CLK
delay();
}
void Lclk(void){//SDAがlowで1クロック
c_SDA; // clear SDA
s_SCL; // set CLK
delay();
c_SCL; // clear CLK
delay();
}
void ack(void){
SDA_IN;
s_SCL; // set CLK
delay();
c_SCL; // clear CLK
delay();
SDA_OUT;
}
void i2cwrite(unsigned int add,unsigned char dat){//
unsigned int k;
unsigned char i;
start();
i=AD<<1;
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
i=add; //
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
i=dat; //
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
stop();//Stop
}
unsigned char i2cread(unsigned char address){
unsigned char i;
unsigned int k;
start();
i=AD<<1;
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
i=address; //
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
start();
i=(AD<<1)+0B00000001;
for(k=0B10000000;k>0;k=k>>1)if(k & i)Hclk();
else Lclk();
ack();//ACK
SDA_IN; //SDAを入力に変更
i=0;
for(k=0B10000000;k>0;k=k>>1){
s_SCL; // set CLK
delay();
if(SDA_data)i+=k;
c_SCL; // clear CLK
delay();
}
SDA_OUT; //SDAを出力に変更
ack();//ACK
stop();//Stop
return i;
}
void Utx(char data){
while(ti_u0c1 != 1){}; // データ転送待ち
u0tbl = data; // 送信バッファ(U0TBL)にデータセット
}
char Urx(void){
int data0;
char data; // 受信データ格納変数
while (ri_u0c1 != 1){}; // 受信待ち
data0 = u0rb; // 受信データの取り出し
data=(char)data0;
return data;
}
//*******************************************
/*
アセンブラプログラム
*/
;LEDtest.a30 簡単なR8/C m12Aのアセンブラプログラム
;空のプロジェクトに,XX.a30とXX.incを入れる
;スタックポインタの初期化を忘れずに
.INCLUDE sfr_r8m12a.inc
.SECTION PROGRAM, CODE
.ORG 0E000h
Start:
LDC #0500H,ISP ;スタックポインタの初期化(サブルーチンに必須)
BSET prc0 ; 外部クロック
BSET hocoe
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BSET hscksel
BSET scksel
BSET hocoe
BCLR prc0 ; 外部クロックへの切り替え完了
MOV.B #00010000b,p3 ; ポートに出力する初期値の設定
MOV.B #00010000b,pd3 ; ポートの方向を出力に設定
Loop: MOV.B #00000000b, p3 ; p3_4 on
JSR TIME
MOV.B #00010000b, p3 ; p3_4 off
JSR TIME
JMP Loop ; LED点滅を繰り返す
TIME: ;時間消費のサブルーチン
MOV.W #50, r1 ; 0.5秒ループ
LP01: MOV.W #28571, r0 ; 10ミリ秒ループ
LP02: SBJNZ.W #1, r0, LP02
SBJNZ.W #1, r1, LP01
RTS
.SECTION FIXVECTOR, ROMDATA
.ORG 0FFFCh
.LWORD Start | 0FF000000h
.END
登録:
コメント (Atom)