2015年9月14日

NISA口座開設

そろそろ、NISA口座開設しちゃおうかな。 ぼくはMONEXにしました。
NISA口座開設までの流れはこんな感じ。

 1)MONEX証券から申込書を請求 
 2)申込書に必要事項を記載しMONEX証券へ返送
  3)審査後に、MONEX証券 口座開設
 4)WebからNISA口座開設の申請を実施
 5)住民票の写し等、必要な書類をMONEX証券へ郵送
  6)審査後、NISA 口座開設 


 本日はポストへ投稿し、2)まで完了しました~。

あと、申込書記載時にわかりにくい個所があったので記載します。

 「お届け印」欄について

申込書内に「お届け印」という欄があります。
そこには「お届け印は不要です」と記載がありました。
じゃあ、「お届け印」欄はいらないじゃんと思っていました???

結局、お届け印はいるのか、いらないのか?
下記の理由より、不要でしたが、非常に分かりにくい。

なぜ、「お届け印」欄の枠ごと消さないの? MONEXさん。
マネックス証券では、2015年8月24日以降に証券総合取引口座を開設される個人のお客様については、印鑑の登録は不要(お届印の廃止)となりました。 (法人のお客様は、お届印の登録が必要です)

2015年8月29日

1.簡単なOSを作成する ~タイマー割込み編その2~

前回(1.簡単なOSを作成する ~タイマー割込み編~)からの続き

0.04sec で満了するので、250回して1secタイマー作ってみました。
でもこれだと、満了した時すぐに次のタイマーが開始されるので、
if(T_TISRA.BIT.IMF == 0x01) 文の判定タイミングとずれが生じてしまう。

オシロスコープを使って、そのズレの検証を行ってた。

  • そーす
int main(void)
{
    serial_init(SERIAL_DEFAULT_DEVICE);

    puts("-----------------Led1 and 2 is Light start!!\n");   
    /* p4ddr(P46 and P47) output setting 0x0c = 1100 0000  */
    /* p4dr (P46 and P47) output         0x0c = 1100 0000  */

    P4DDR.BYTE        = 0;
    P4DDR.BIT.B6    = ENABLE;
    P4DDR.BIT.B7    = ENABLE;

    P4DR.BYTE        = DISABLE;
   
    P4DR.BIT.B6     = LED_ON;
    P4DR.BIT.B7     = LED_OFF;
   
    /**
     * カウンター
    */
    int T_16TCR0_COUNTER = 0;
    int secCount = 0;
   
    /**
     * カウントクロック設定 φ/8
     */
    T_16TCR0.BIT.TPSC = 0x03;
    //T_16TCR1.BIT.TPSC = 0x03;
   
    /**
     * カウンタクリア要因の選択
     */
    T_16TCR0.BIT.CCLR = 0x01; // GRA
    //T_16TCR1.BIT.CCLR = 0x01; // GRA
   
    /**
     * アウトプットコンペアレジスタの選択
     */
    T_TIOR0.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
    //T_TIOR1.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
   
    /**
     * IMF フラグ割込 要求許可
    T_TISRA.BIT.IMIE = 0x01; //割込 要求許可
    T_TISRB.BIT.IMIE = 0x01; //割込 要求許可
     */
   
    /**
     * 周期設定
     */
    T_GRA0_H.BYTE = 0x27; // 10000
    T_GRA0_L.BYTE = 0x10;
    //T_GRA1_H.BYTE = 0x00; //   250
    //T_GRA1_H.BYTE = 0xFA;
   
    /**
     * TIMER START
     */
    T_TSTR.BYTE = 0x01; // 16TCNT0 Start
   
    while(1)
    {
        puts("T_16TCNT0:");   
            putxval(T_16TCNT0_H.BYTE,2);
            putxval(T_16TCNT0_L.BYTE,2);
        puts("\n");   
        if(T_TISRA.BIT.IMF == 0x01)
        {
           
            T_16TCR0_COUNTER++;
            puts("T_16TCR0_COUNTER:");   
                putxval(T_16TCR0_COUNTER,3);
            puts("\n");   
           
            if(T_16TCR0_COUNTER >= 25)
            {
               
                P4DR.BIT.B6     =~ P4DR.BIT.B6;
                P4DR.BIT.B7     =~ P4DR.BIT.B7;
                T_16TCR0_COUNTER = 0;
                secCount++;
                puts("----------------secCount:");   
                    putxval(secCount,3);
                puts("\n");   
               
                if(secCount > 10)
                {
                    break;
                }
            }
           
        }
    }
   
  return 0;   
}

  • オシロスコープ計測
ズレを計測してみた。
 右上のdx:が1.018secになっている。交差0.98%なのでこれくらいならOKかな。




次は、タイマー割り込みをCPUに割り込みを行い、
割り込みハンドラを使ってオシロスコープで計測してみる。

交差はもっと正確なのか?



  • GitHub

sto@sto-PC ~/src
$ git commit -m "LED 1sec Lighting"
[master a66b547] LED 1sec Lighting
 2 files changed, 247 insertions(+), 73 deletions(-)
 rewrite 02-1/bootload/main.c (81%)

sto@sto-PC ~/src
$ git push origin master:master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 1.97 KiB | 0 bytes/s, done.
Total 6 (delta 2), reused 0 (delta 0)
To https://github.com/satoshishimizu/mae_h8_3069f.git
   4f11c2d..a66b547  master -> master
 


2015年7月29日

1.簡単なOSを作成する ~タイマー割込み編~

前回、~LED点灯編~を実施しました。

p4ddr = 0xffになっていた理由についてはライト専用レジスタで、リードは無効(リードした場合1が読みだされる)という事でした(笑) 。すみません。。。

仕切りなおし、今回は~タイマー割込み編~になります。
タイマー割込みでLED点滅させるプログラムを作っていきましょう。

では、1secタイマーでLEDをON/OFFできるように作ってみよう。




まず、1secタイマーを作るためには8bit/16bitタイマーどちらを使うか?どのように使うか?

8bitタイマーの場合、タイマーカウンタが8bitの為、255がMAXになる。
8bitタイマーのカウントクロックは分周比8/64/8192の3種類が存在する。

H8-3069Fの動作周波数は20MHzなので、各分周比で割ってやると、
1秒間にカウントアップする回数が算出される。

この1秒間にカウントアップする回数が、TCNTで表現される整数範囲以下でなければ、
カウントできない。分周比8/64は溢れてしまう。分周比8192は割り切れない為、使えない。

なので、16bitタイマーを使用する。
16bitタイマーの分周比は1/2/4/8が存在する。

1秒間にカウントアップする回数は下記の通り。
ここでもTCNTの整数範囲を溢れてしまうので、2段階カウントアップ方式を使って
1secタイマーを実現する。

分周比:8/TCNT0:10000/TCNT1:250

TCNT0が10000になった時にもう一つのタイマーをスタートさせ、
TCNT1が250になった時に割り込みを発生させる事とする。

イメージ的には分周、分周していくイメージになる。

20MHz = 20000000 Hz /8 = 2500000 Hz

2500000 Hz / 10000 / 250 = 1Hz




下記に考え方と、フローチャートを作ってみたので、プログラミングしてみる。

こんな感じ。
main.cmain.c
int main(void)
{
    serial_init(SERIAL_DEFAULT_DEVICE);

    puts("-----------------Led1 and 2 is Light start!!\n");   
    /* p4ddr(P46 and P47) output setting 0x0c = 1100 0000  */
    /* p4dr (P46 and P47) output         0x0c = 1100 0000  */
   
    P4DDR.BYTE        = 0;
    P4DDR.BIT.B6    = ENABLE;
    P4DDR.BIT.B7    = ENABLE;

    P4DR.BYTE        = DISABLE;
   
    P4DR.BIT.B6     = LED_ON;
    P4DR.BIT.B7     = LED_OFF;
   
    /**
     * カウントクロック設定 φ/8
     */
    T_16TCR0.BIT.TPSC = 0x03;
    T_16TCR1.BIT.TPSC = 0x03;
   
    /**
     * カウンタクリア要因の選択
     */
    T_16TCR0.BIT.CCLR = 0x01; // GRA
    T_16TCR1.BIT.CCLR = 0x01; // GRA
   
    /**
     * アウトプットコンペアレジスタの選択
     */
    T_TIOR0.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
    T_TIOR1.BIT.IOA = 0x02; // GRA コンペアマッチ 1出力
   
    /**
     * IMF フラグ割込 要求許可
     */
    T_TISRA.BIT.IMIE = 0x01; //割込 要求許可
    T_TISRB.BIT.IMIE = 0x01; //割込 要求許可
   
    /**
     * 周期設定
     */
    T_GRA0_H.BYTE = 0x2710; // 10000
    T_GRA1_H.BYTE = 0x00FA; //   250
   
    /**
     * TIMER START
     */
    T_TSTR.BYTE = 0x01; // 16TCNT0 Start
   
    while(1)
    {
        puts("T_16TCNT0:");   
            putxval(T_16TCNT0_H.BYTE,2);
            putxval(T_16TCNT0_L.BYTE,2);
        puts("\n");   

        puts("T_16TCNT1:");   
            putxval(T_16TCNT1_H.BYTE,2);
            putxval(T_16TCNT1_L.BYTE,2);
        puts("\n");   

        puts("T_GRA0:");
            putxval(T_GRA0_H.BYTE,2);
            putxval(T_GRA0_L.BYTE,2);
        puts("\n");   

        puts("T_GRA1:");
            putxval(T_GRA1_H.BYTE,2);
            putxval(T_GRA1_L.BYTE,2);
        puts("\n");   

        puts("T_TISRA IMF:");
            putxval(T_TISRA.BIT.IMF,2);
        puts("\n");   

        puts("T_TISRB IMF:");
            putxval(T_TISRB.BIT.IMF,2);
        puts("\n");   

        if(T_TISRA.BIT.IMF == 0x01)
        {
            P4DR.BIT.B6     = LED_ON;
            P4DR.BIT.B7     = LED_ON;
            break;
           
        }else{

            P4DR.BIT.B6     =~ P4DR.BIT.B6;
            P4DR.BIT.B7     =~ P4DR.BIT.B7;

        }
       
    }
   
  return 0;   
}

<実行結果>

-----------------Led1 and 2 is Light start!!
T_16TCNT0:10c7
T_16TCNT1:0000
T_GRA0:10ff
T_GRA1:faff
T_TISRA IMF:01
T_TISRB IMF:00

GRA0:0x10FF = dec4351になっている。期待値は0x2710 = dec10000なのに。
とりあえず、本日はここまで。次回デバッグです。
ひとつひとうみていこう。

2015年7月16日

1.簡単なOSを作成する~LED点灯~

今回はLED点灯について学習します。

git clone:
$ git clone https://github.com/satoshishimizu/mae_h8_3069f.git  
 
src/02/bootloaderソースをベースに変更していきます。

まず最初にLED1/LED2を点灯させる為に回路図を確認。


 H8-3069FマイコンとCN2との接続は作成中ですが、下記接続であることを確認。

LED1<->21port (LCD-LED-DIP)22port<-> 11port (CN2A) <->11port (CN2) <->25port D6/P46 (H8-03069)

LED2<->23port (LCD-LED-DIP)24port<-> 12port (CN2A) <->12port (CN2) <->26port D7/P47 (H8-03069)

次にD6/P46とD7/P47はポート4に含まれるので、付属のCD-ROM内の入っている「H8/3069 ハードウェアマニュアル」の8.5 ポート4  のレジスタ構成を参照する。


ポート4 レジスタ構成

Address Name 略称 R/W init
H'EE003 ポート4データディレクションレジスタ P4DDR W H'00
H'FFFD3 ポート4データレジスタ P4DR R/W H'00
H'EE03E ポート4入力プルアップMOSコントロールレジスタ P4PCR R/W H'00

P4DDR:(ポート4データディレクションレジスタ)
 ポート4端子の入出力をビットごとに指定することができるようです。
   P40~P47の8portに対して入出力をport毎に設定できる。

P4DDR register input output
value 0 1

P4DR:(ポート4データレジスタ)
 8bit のR/Wレジスタ。P4DRはリセット、またはハードウェアスタンバイモード時にH'00に初期化される。ソフトウェアスタンバイモード時には、直前の状態を保持するようです。

P4PCR:(ポート4入力プルアップMOSコントロールレジスタ)
H8マイコンには、プルアップ回路が内蔵されている。各端子毎にプルアップをON/OFFできる。

つまり、P4DDR = 1100 0000 = 0xC0 / P4DR = 1100 0000 = 0xC0に設定
7bit 6bit 5bit 4bit 3bit 2bit 1bit 0bit
Port P47
(LED2) 緑
P46
(LED1) 赤
P45 P44 P43 P42 P41 P40
P4DDR register value 1 1 0 0 0 0 0 0
P4DR register value 1 1 0 0 0 0 0 0

ソース:
int main(void)
{
    serial_init(SERIAL_DEFAULT_DEVICE);

    puts("-----------------Led1 and 2 is Light start!!\n");
  
    unsigned char *p4ddr = (unsigned char *)0xfee003;
    unsigned char *p4dr  = (unsigned char *)0xffffd3;
  
    puts("*p4ddr=");    putxval(*p4ddr, 0);       puts("\n");
    puts("*p4dr=");      putxval(*p4dr, 0);          puts("\n");
    puts("----------------------------------------------\n");

    /* p4ddr(P46 and P47) output setting 0x0c = 1100 0000  */
    /* p4dr (P46 and P47) output          0x0c = 1100 0000  */

    *p4ddr = 0xc0;
    *p4dr  = 0xc0;

    puts("----------------------------------------------\n");  
    puts("*p4ddr=");     putxval(*p4ddr, 0);      puts("\n");
    puts("*p4dr=");        putxval(*p4dr, 0);         puts("\n");

    puts("-----------------end\n");

  return 0;
}



実行結果(シリアル通信):

p4ddrの値が0xC0を書き込んでいるつもりが、0xffとなり書き変わっていない??なぜ??
p4drはP47/46に該当するbitが1出力されている。

-----------------Led1 and 2 is Light start!!
*p4ddr=ff
*p4dr=0
----------------------------------------------
----------------------------------------------
*p4ddr=ff
*p4dr=c0
-----------------end



p4ddr出力設定、p4dr該当bit出力されいるので、LED1/2点灯しました。

















次回は、LED点灯ができたので、LED点滅をさせてみたいと思う。
タイマー割り込みを使い一定時間点灯、消灯を繰り返し点滅制御に進んでみよう。
 
でも、なぜp4ddrが書き変わらないのか?
初期値0のはずだが、なぜ0xffなのかについてもちょこちょこ調べていく予定。

この時点のソースをpushしておく。こんな感じでできました。

git cmd:
sto@sto-PC ~/src
$ git add 02-1/

sto@sto-PC ~/src
$ ll
合計 0
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 01/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 02/
drwxr-xr-x+ 1 Administrators None 0 7月   5 21:35 02-1/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 03/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 04/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 05/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 06/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 07/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 08/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 09/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 10/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 11/
drwxr-xr-x+ 1 Administrators None 0 6月  28 11:39 12/
drwxr-xr-x+ 1 Administrators None 0 7月   5 17:31 tools/

sto@sto-PC ~/src
$ git commit -m "LED1 and LED2 Ligth"
[master 4f11c2d] LED1 and LED2 Ligth
 12 files changed, 553 insertions(+)
 create mode 100755 02-1/bootload/KL-01
 create mode 100755 02-1/bootload/LICENSE
 create mode 100755 02-1/bootload/Makefile
 create mode 100755 02-1/bootload/defines.h
 create mode 100755 02-1/bootload/ld.scr
 create mode 100755 02-1/bootload/lib.c
 create mode 100755 02-1/bootload/lib.h
 create mode 100755 02-1/bootload/main.c
 create mode 100755 02-1/bootload/serial.c
 create mode 100755 02-1/bootload/serial.h
 create mode 100755 02-1/bootload/startup.s
 create mode 100755 02-1/bootload/vector.c

sto@sto-PC ~/src
$ git log
commit 4f11c2d201b65123890158d589353dac7c4eff9d
Author: xxxxxxxxxxxxx
Date:   Fri Jul 17 00:14:41 2015 +0900

    LED1 and LED2 Ligth

commit 6305a7cff719f64a2f9f28316f9be6d7ac49b72b
Author: xxxxxxxxxxxx
Date:   Tue Jun 30 23:17:07 2015 +0900

    test

sto@sto-PC ~/src
$ git push origin master:master

ソース:
https://github.com/satoshishimizu/mae_h8_3069f.git