H8,SH,マイコン,ぼやき川柳,ダウンロード

最初のソース

プレーン版のソースです

/***********************************************************************/
/*                                                                     */
/*  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;
  }
}
 

resetprg.c

ほとんど、オマジナイですが・・・
/******************************************************************************
*   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()

scanf()が動きません。そんな馬鹿な・・。だって、パイの計算の時、時刻入力で動いたはず。なんで!?分かりません。
日付(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()が完了するようになりました。理由は分かりません???

補足


パイ計算の美しいコーディングが、シリアルIOやRTCの処理で台なしにしてしまっています
goto文まで使って、スパゲッティに・・・。
HEWはとっくに評価期間が終了し256KB未満モジュールしか作成できませんが、初期化していない配列はカウント外のようです。幸いロードモジュール(DEBUG版ですが)は28,212Bしかありません
 
(1)計算開始、終了、表示終了時刻を表示するようにしました
(2)64Hzカウンタで16ms計を表示するようにしました
 
それにしてもパイの計算部分は美しい、エレガントです 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます