プレーン版のソースです
/***********************************************************************/ /* */ /* FILE :pai00.c */ /* DATE :Fri, Jul 16, 2010 */ /* DESCRIPTION :Main Program */ /* CPU TYPE :SH72620 */ /* */ /* This file is generated by Renesas Project Generator (Ver.4.16). */ /* */ /***********************************************************************/ #include <stdio.h> #include <math.h> #include "iodefine.h" #ifdef __cplusplus //#include <ios> // Remove the comment when you use ios //_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios #endif void charput(char c) { if( c == '\n' ) { while( SCIF2.SCFSR.BIT.TEND == 0 ) ; SCIF2.SCFTDR.BYTE = 0x0d; SCIF2.SCFSR.BIT.TEND = 0; while( SCIF2.SCFSR.BIT.TEND == 0 ) ; SCIF2.SCFTDR.BYTE = 0x0a; SCIF2.SCFSR.BIT.TEND = 0; } else { while( SCIF2.SCFSR.BIT.TEND == 0 ) ; SCIF2.SCFTDR.BYTE = c; SCIF2.SCFSR.BIT.TEND = 0; } } unsigned char charget(void) { unsigned char x; /*""FUNC COMMENT""************************************************************** * ID : * Outline : SCIF チャネル2 1文字受信処理 *------------------------------------------------------------------------------ * Return Value : 受信データ *------------------------------------------------------------------------------ *""FUNC COMMENT END""**********************************************************/ /* ==== 受信エラー、ブレーク信号検出、オーバランエラーの確認 ==== */ if((SCIF2.SCFSR.WORD & 0x0090u ) || (SCIF2.SCLSR.BIT.ORER == 1)) { /* 受信エラー処理(受信データの破棄) */ SCIF2.SCSCR.BIT.RE = 0; /* 受信禁止 */ SCIF2.SCFCR.BIT.RFRST = 1; /* 受信FIFO リセット */ SCIF2.SCFCR.BIT.RFRST = 0; /* 受信FIFO リセット解除 */ SCIF2.SCFSR.WORD &= ~0x0091u; /* ER,BRK,DR ビットクリア */ SCIF2.SCLSR.BIT.ORER = 0; /* ORER クリア */ SCIF2.SCFSR.BIT.RDF = 0; /* RDF ビットクリア */ SCIF2.SCSCR.BIT.RE = 1; /* 受信許可 */ return 0; } /* ==== 受信データが指定トリガ数以上か?(RDF==1?) ==== */ while(SCIF2.SCFSR.BIT.RDF == 0){ /* データ受信後、一定時間経過したか?(DR==1?) */ if(SCIF2.SCFSR.BIT.DR == 1){ /* FIFO 内にデータがあるのでRDF フラグ待ちをやめる */ break; } } /* ==== 受信FIFO データレジスタ(SCFRDR0)から受信データを読み出す ==== */ x = SCIF2.SCFRDR.BYTE; /* ==== FIFO 受信データを読み出し後、DR をクリア ==== */ SCIF2.SCFSR.BIT.DR = 0; /* FIFO が空の場合DR ビットはクリアされます */ /* ==== シリアルステータスレジスタ(SCFSR0)のRDF をクリアする ==== */ SCIF2.SCFSR.BIT.RDF = 0; /* RDF ビットクリア */ charput(x); // エコーバック return x; } /*---------------------------------------*/ /* Initialize SCIF channel 2 */ /*---------------------------------------*/ scif2_init () { short sts; /* Initialize SCIF2 */ CPG.STBCR4.BIT.MSTP45 = 0; /* Enable SCIF2 power */ /* Attach SCIF2 unit (TxD2/RxD2) to I/O pad */ PORT.PFCR0.WORD = (PORT.PFCR0.WORD & 0xF00F) | 0x0440; SCIF2.SCSCR.WORD = 0x0000; /* Stop SCIF2 */ SCIF2.SCFCR.WORD = 0x00B6; SCIF2.SCFCR.WORD = 0x00B0; /* Clear Tx/Rx FIFO */ sts = SCIF2.SCFSR.WORD; /* 受信ステータス空読み */ SCIF2.SCFSR.WORD = 0x0000; /* 受信ステータスクリア */ /* CHR=0,PE=0,STOP=0,CKS=00(Pφ/1) */ SCIF2.SCSMR.WORD = 0x0000; /* Data format (N81) */ /* Bit rate */ SCIF2.SCEMR.WORD = 0x0081; /* BGDM=1(倍速モード) ABCS=1(bpsの8倍) */ SCIF2.SCBRR.BYTE = 25; /* 分周設定 */ /* Set SCIF2 interrupt level */ INTC.IPR17.WORD = (INTC.IPR17.WORD & 0xFF0F) | 0x0010; /* level 1 */ SCIF2.SCSCR.WORD = 0x0070; /* Start SCIF2 (Set TE,RE,RIE) */ } //時計用レジスタ初期設定 void teme_init(void) { RTC.RCR1.BYTE = 0x00; //時計動作停止リセット RTC.RCR2.BYTE = 0x0A; RTC.RCR3.BYTE = 0x00; RTC.RCR5.BYTE = 0x00; // RTC_X1 RTC.RFRH.WORD = 0x0000; // RFC = X1 RTC.RFRL.WORD = 0x0000; // 32.768kHz RTC.RCR2.BYTE = 0x09; //時計動作開始 } int L, L1, L2, N, k, KETA, KEND, i, j; short s[80000], w[80000], v[80000], q[80000]; void main(void) { char T[20], YesNo[10], *p; scif2_init(); teme_init(); loop: printf("\n\n時刻を設定する場合は年月日をYYYYMMDDhhmmssの形式で入力してください。\n設定しない場合は空送信してください。"); gets(T); if ( strlen(T) < 2 ) goto pass; printf("\n\n時刻は%sでよいですか?(Yes/No)\n\n",T); gets(YesNo); if ( YesNo[0] == 'N' || YesNo[0] == 'n' ) goto loop; p = T; RTC.RYRCNT = (short)(*p++ & 0x0F)*4096 + (short)(*p++ & 0x0F)*256 + // 年設定 (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 年設定 RTC.RMONCNT = (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 月 RTC.RDAYCNT = (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 日 RTC.RHRCNT = (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 時 RTC.RMINCNT = (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 分 RTC.RSECCNT = (short)(*p++ & 0x0F)*16 + (short)(*p++ & 0x0F) ; // 秒 pass: printf("\n計算する桁数は?"); scanf("%d", &L); L = ( (L + 63) / 64 ) * 64; printf("\n\n計算桁数 L=%d(64の倍数へ)\n", L); printf("\n\n計算開始:%04x/%02x/%02x %02x:%02x:%02x.%02d ", RTC.RYRCNT,RTC.RMONCNT,RTC.RDAYCNT,RTC.RHRCNT,RTC.RMINCNT,RTC.RSECCNT,RTC.R64CNT.BYTE*100/128); L1 =(short)(L/4) ; //配列のサイズ L2 =(short)(L1+1) ; //一余分に取る N = (short)(L/1.39794+1); for(k=0 ; k<L2+2 ; k++) s[k]=w[k]=v[k]=q[k]=0; w[0]=16*5; //マチンの公式 v[0]=4*239; for (k=1 ; k<=N ; k++){ ldiv(w,(short)25,w); ldiv(v,(short)239,v); ldiv(v,(short)239,v); lsub(w,v,q);ldiv(q,(short)(2*k-1),q); if((k%2)!=0) ladd(s,q,s); else lsub(s,q,s); } printf("\n計算終了:%04x/%02x/%02x %02x:%02x:%02x.%02d \n\n", RTC.RYRCNT,RTC.RMONCNT,RTC.RDAYCNT,RTC.RHRCNT,RTC.RMINCNT,RTC.RSECCNT,RTC.R64CNT.BYTE*100/128); printf("\n\n π = 3.") ; for (k=1; k<=L1; k=k+16) // Output Pi Value { KETA = ( k - 1 ) * 4 + 1 ; printf("\n %8d %04d%04d %04d%04d %04d%04d %04d%04d %04d%04d %04d%04d %04d%04d %04d%04d", KETA, s[k],s[k+1],s[k+2],s[k+3],s[k+4],s[k+5],s[k+6],s[k+7],s[k+8],s[k+9],s[k+10],s[k+11],s[k+12],s[k+13],s[k+14],s[k+15]) ; } printf("\n\n表示終了:%04x/%02x/%02x %02x:%02x:%02x.%02d \n\n\n", RTC.RYRCNT,RTC.RMONCNT,RTC.RDAYCNT,RTC.RHRCNT,RTC.RMINCNT,RTC.RSECCNT,RTC.R64CNT.BYTE*100/128); } ladd(short a[] , short b[] , short c[]) { short i,cy=0; for(i=L2 ; i>=0 ; i--){ c[i]=(short)(a[i]+b[i]+cy); if(c[i]<10000) cy=0; else{ c[i]=(short)(c[i]-10000); cy=1; } } } lsub(short a[] , short b[] , short c[]) { short i,cy=0; for(i=L2 ; i>=0 ; i--){ if ( (a[i]-cy) >= b[i] ) { c[i] = a[i] - b[i] - cy; cy = 0 ; } else { c[i] = a[i] - b[i] + 10000 - cy; cy = 1 ; } } } ldiv(short a[] , short b, short c[]) { short i; long d,rem=0; for(i=0;i<=L2;i++){ d=a[i]; c[i]=(short)((d+rem)/b); rem=((d+rem)%b)*10000; } }
ほとんど、オマジナイですが・・・
/****************************************************************************** * DISCLAIMER * * This software is supplied by Renesas Technology Corp. and is only * intended for use with Renesas products. No other uses are authorized. * * This software is owned by Renesas Technology Corp. and is protected under * all applicable laws, including copyright laws. * * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES * REGARDING THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, * INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY * DISCLAIMED. * * TO THE MAXIMUM EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS * TECHNOLOGY CORP. NOR ANY OF ITS AFFILIATED COMPANIES SHALL BE LIABLE * FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES * FOR ANY REASON RELATED TO THE THIS SOFTWARE, EVEN IF RENESAS OR ITS * AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * Renesas reserves the right, without notice, to make changes to this * software and to discontinue the availability of this software. * By using this software, you agree to the additional terms and * conditions found by accessing the following link: * http://www.renesas.com/disclaimer ******************************************************************************** * Copyright (C) 2008(2009). Renesas Technology Corp., All Rights Reserved. *""FILE COMMENT""*********** Technical reference data ************************** * System Name : SH7264 Sample Program * File Name : resetprg.c * Abstract : Reset Program * Version : 1.01.00 * Device : SH7262/SH7264 * Tool-Chain : High-performance Embedded Workshop (Ver.4.04.01). * : C/C++ compiler package for the SuperH RISC engine family * : (Ver.9.02 Release00). * OS : None * H/W Platform: M3A-HS64G50(CPU board) * Description : ******************************************************************************** * History : Dec.03,2008 Ver.1.00.00 * : Jun.29,2009 Ver.1.01.00 Changed FILE FORMAT *""FILE COMMENT END""**********************************************************/ #include <machine.h> #include <_h_c_lib.h> #include "stacksct.h" #include "iodefine.h" #define FPSCR_Init 0x00040001 #define SR_Init 0x000000F0 #define INT_OFFSET 0x10 extern unsigned int INT_Vectors; void PowerON_Reset_PC(void); void Manual_Reset_PC(void); extern void main(void); extern void HardwareSetup(void); extern void io_cache_writeback(void); extern void _INIT_IOLIB(void); //extern void srand(unsigned int); // Remove the comment when you use rand() //extern char *_s1ptr; // Remove the comment when you use strtok() /*==== Switch section name to ResetPRG ====*/ #pragma section ResetPRG /*==== Specify the entry function ====*/ #pragma entry PowerON_Reset_PC /*""FUNC COMMENT""************************************************************** * ID : * Outline : CPU initialization function *------------------------------------------------------------------------------ * Include : iodefine.h *------------------------------------------------------------------------------ * Declaration : void PowerON_Reset_PC(void); *------------------------------------------------------------------------------ * Description : It is the CPU initialization process to register the power on * : reset exception vector table. * : This function is firstly executed after power on reset. * : Enable the processes that are commented depending on its needs. *------------------------------------------------------------------------------ * Argument : void *------------------------------------------------------------------------------ * Return Value : void *------------------------------------------------------------------------------ * Note : None *""FUNC COMMENT END""**********************************************************/ void PowerON_Reset_PC(void) { // set_fpscr( ); set_fpscr(FPSCR_Init); // set_fpscr(FPSCR_Init & FPSCR_RM); /*==== HardwareSetup function====*/ HardwareSetup(); // Use Hardware Setup /*==== B and D sections initialization ====*/ _INITSCT(); // io_cache_writeback(); /*==== Vector base register (VBR) setting ====*/ set_vbr((void *)((char *)&INT_Vectors - INT_OFFSET)); _INIT_IOLIB(); // Use stdio I/O // errno=0; // Remove the comment when you use errno // srand(1); // Remove the comment when you use rand() // _s1ptr=NULL; // Remove the comment when you use strtok() /*==== Status register setting ====*/ set_cr(SR_Init); nop(); /* ==== Bank number register setting ==== */ INTC.IBNR.BIT.BE = 0x01; /* Use the register bank in all interrupts */ /* ==== Interrupt mask level change ==== */ set_imask(0); /*==== Function call of main function ====*/ main(); /*==== sleep instruction execution ====*/ sleep(); } //#pragma entry Manual_Reset_PC // Remove the comment when you use Manual Reset /*""FUNC COMMENT""************************************************************** * ID : * Outline : Manual reset process *------------------------------------------------------------------------------ * Include : *------------------------------------------------------------------------------ * Declaration : void Manual_Reset_PC(void); *------------------------------------------------------------------------------ * Description : It is the function to register the manual reset exception vector table. * : The process is not defined in the reference program. * : Add the processes depending on its needs *------------------------------------------------------------------------------ * Argument : void *------------------------------------------------------------------------------ * Return Value : void *------------------------------------------------------------------------------ * Note : None *""FUNC COMMENT END""**********************************************************/ void Manual_Reset_PC(void) { /* NOP */ } /* END of File */「_INIT_IOLIB()」のコメントを外して有効にする必要があります
scanf()が動きません。そんな馬鹿な・・。だって、パイの計算の時、時刻入力で動いたはず。なんで!?分かりません。
日付(2011.03.06)が前後しますが、今はUSBメモリのBulk Readに挑戦しています
Bulk Readで読むLBA(Logical Block Address)とセクタ数をscanf()を使用して、外部から指定させたいのです
(1)charget()が呼ばれない
上記の「_INIT_IOLIB()」をコメントアウトを外して呼ばれるようになりました。ところが、今度はcharget()が終わりません。たぶん
でループしていると思われます。
(2)SCIF2イニシャライズ止め
行き当たりばったりに色々やりました。ヤケッパチでSCIF2イニシャライズを止めてみました
よくよく考えれば、直前に"ub"コマンドでバイナリデータを読み込ませています
つまり、TynyMonがSCIF2を初期化しているはずです。結果、charget()が完了するようになりました。理由は分かりません???
日付(2011.03.06)が前後しますが、今はUSBメモリのBulk Readに挑戦しています
Bulk Readで読むLBA(Logical Block Address)とセクタ数をscanf()を使用して、外部から指定させたいのです
(1)charget()が呼ばれない
上記の「_INIT_IOLIB()」をコメントアウトを外して呼ばれるようになりました。ところが、今度はcharget()が終わりません。たぶん
while(SCIF2.SCFSR.BIT.RDF == 0) {・・・}
でループしていると思われます。
(2)SCIF2イニシャライズ止め
行き当たりばったりに色々やりました。ヤケッパチでSCIF2イニシャライズを止めてみました
// scif2_init(); /* SCI(SCIF)初期化 */
よくよく考えれば、直前に"ub"コマンドでバイナリデータを読み込ませています
つまり、TynyMonがSCIF2を初期化しているはずです。結果、charget()が完了するようになりました。理由は分かりません???
コメントをかく