v0901およびv0902で自動生成されるレジスタ定義ファイル iodefine.hの一部に問題があるようです。 現時点で確認しているのはR8C/2Aのみですが、もしかすると、 他のデバイスにも同様の問題が存在する可能性があります。 以下のソースコードはR8C/2Aの場合です。 282行目からのタイマーCのレジスタ定義に指定されている型が間違っています。 タイマーCは16ビットタイマーなのでtrc,trcgra,trcgrb,trcgrc,trcgrdは、 (*(volatile unsigned short *)で定義されるはずです。 チェックしきれてませんがほかのレジスタ定義にも問題があるかもしれません。
#define trc (*(volatile union byte_def *) (0x0126)) /* Timer RC counter register */ #define trcgra (*(volatile union byte_def *) (0x0128)) /* Timer RC general register A */ #define trcgrb (*(volatile union byte_def *) (0x012A)) /* Timer RC general register B */ #define trcgrc (*(volatile union byte_def *) (0x012C)) /* Timer RC general register C */ #define trcgrd (*(volatile union byte_def *) (0x012E)) /* Timer RC general register D */
v0901およびv0902で自動生成されるスタートアップルーチン start.asmに変更がありました。 以下のソースコードはR8C/2Aの場合です。 38行目の可変ベクタテーブルの開始アドレスが0xFEDCに変更されました。 Linkerの設定の.var_vectsの項目をこのアドレスと一致させる必要があります。
_start: ldc #_istack, isp /* set interrupt stack pointer */ mov.b #0x02,0x0a /* write enable in protect register */ mov.b #0x00,0x04 /* set processer mode :single chip mode */ /* 0x04 is the address of processor mode register 0 */ mov.b #0x00,0x0a /* write disable in protect register */ ldc #0x0080,flg /* select USER STACK POINTER (BIT7=1,USP) (BIT7=0,ISP) */ ldc #_ustack,sp /* set user stack pointer */ /* INTERRUPT VECTOR ADDRESS definition */ ldc #0x0, intbh ldc #0xFEDC, intbl /* 変更点load variable vector address in intbl */ fset I /* ADD THIS TO ENABLE INTERRUPTS */ /* call the hardware initialiser */ jsr.a _hw_initialise