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
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年2月28日木曜日
R8C M12Aサンプルプログラム
登録:
コメント (Atom)