技術メモ

過去の経験や実験データ,設計・検討資料を残す。
今取り組んでいることのプロセスの記録から新たな気付きを得る。

DIP8pのPICマイコンによる発振器の製作

2017-11-04 | マイコン

昔使用していた発振器が無くなったり,水晶振動子を分周しただけでは欲しい周波数が得られない
アプリケーションに,簡単に対応できないか検討し,DIP8pのPICマイコンが使えそうだったので
秋月電子通商で1個120円でPIC12F1840を購入した。

1.実験回路
          

   ①右側5pコネクタは,書込・デバッグ用JTAG端子,2pコネクタは+5V電源です。
     (書込はPICKit3を使用)
   ②発振出力はLED点灯させ確認。
   ③内蔵発振器(確度±1%)と水晶発振の両方実験できるよう取付(4.9152MHz)

2.結果
(1)内蔵発振器32MHzでも,水晶振動子を用いた場合でも両方動作した。
   (水晶振動子にコンデンサがなくても動作したが,付けなきゃダメだよね)
(2)10Hzを作るには,内部タイマを用い,以下の割込みを発生させソフトで10Hz実現
   ①TMR2:1000Hz割込
   ②TMR0:100Hz割込
(3)20kHZ発振は,TMR2とPWM機能を用いた

3.20kHz発振の初期化プログラム
#include
#include
#include
#include "time.h"

#define INTERNAL_OSC    // コメントアウトで水晶発振となる
// CONFIG1
#ifdef INTERNAL_OSC
    #pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#else
    #pragma config FOSC = HS        // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#endif
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = ON       // MCLR Pin Function Select (MCLR/VPP pin function is MCLR)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON        // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON       // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)

// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = ON       // PLL Enable (4x PLL enabled)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = ON         // Low-Voltage Programming Enable (Low-voltage programming enabled)

void TMR2_Initialize(void)
{
    #ifdef INTERNAL_OSC
        PR2 = 99;       // 32Mz/4/4/100 = 20kHz
        IRCF0 = 0;      //内蔵CLK8MHz
        IRCF1 = 1;      //内蔵CLK8MHz
        IRCF2 = 1;      //内蔵CLK8MHz
        IRCF3 = 1;      //内蔵CLK8MHz    
    #else
        PR2 = 61;       // 19.8806Mz/4/4/62 = 20.04kHz
    #endif
    T2CON = 0x01;   // prescaler 1/4 off postscaler 1/1
    TMR2 = 0x0;     
    T2CONbits.TMR2ON = 1;
}
      
void EPWM_Initialize (void)
{   // CCP1M P1A: active high; P1B: active high; DC1B 3; P1M single;
    CCP1CON = 0x0C;
    CCP1CONbits.DC1B = 0b00;    // CCPL1L8bit + bit1 +bit0
    // CCP1ASE operating; PSS1BD low; PSS1AC low; CCP1AS disabled;
    ECCP1AS = 0x00;
    // P1RSEN automatic_restart; P1DC 0;
    PWM1CON = 0x80;
    // STR1B P1B_to_port; STR1A P1A_to_CCP1M; STR1SYNC start_at_begin;
    PSTR1CON = 0x01;
    CCPR1L = 30;    // ここでデュティを変える
    CCPR1H = 0x00;
}

void PIN_MANAGER_Initialize(void)
{   LATA = 0x00;    
    TRISA = 0x3B;   // 0:output RA2
    ANSELA = 0x13;  // 0:digital 1:analog
    WPUA = 0x3F;    // Weak pllup 1:enable
    OPTION_REGbits.nWPUEN = 0;
    APFCON = 0x00;  // RA2 is CCP1
}

void main(void)
{   EPWM_Initialize();
    TMR2_Initialize();
    PIN_MANAGER_Initialize();
    
    while(1)
    {
    }
}

4.OSC,TMR0,TMR2,PWM機能のブロック図
https://plaza.rakuten.co.jp/datasheet/diary/201711040000/


RX21A(ΔΣADコンバータ内臓)CPUの立上

2015-02-09 | マイコン

ΔΣAD変換の制度や安定度,直線性を確認したいとΔΣAD変換ICを探した。
各メーカから,多々の製品が出ているが,いずれもプログラムが必要だったので,
いっそΔΣADを内臓してるRX21Aを使ってみることにした。

基板まで作るのは費用が掛かるので,CPUボードは市販品から選ぶことにした。
CPUボードはHSBRX21A(北斗電子製:@14,800+消費税)を用いることにした。
(3.3V電源アダプタ(@1,800+消費税)も同時に購入した)

http://www.hokutodenshi.co.jp/7/HSBRX21AF100.htm

使ったことのないCPUのプログラムを作り始めるのは,とても大変だが北斗電子から
サンプルプログラムが用意されているので,それを理解するところから始めた。

1.サンプルプログラムによる起動とIOポート入出力
  なんと言っても複雑難解なのは,クロックの多さ。
  低消費電力や水晶振動子を使用しなくてもシステムが完成するよう便利なのだが
  取っ付き辛い。
  その部分は20MHz水晶を用いて,最大クロック周波数で動作可能なサンプル
  プログラムとなっているため,そのまま使うことにした。

  IOポートの入出力設定をし,LED出力,スイッチ状態入力の動作がわかる。

 

2.割り込み(CMT0による,1msec割込プログラムの作成)
 (1)25MHz÷8÷3125=1000Hz

 (2)CMT0初期化プログラム
   /* CMT0の初期化 CMT0 イニシャライズ 1msec 割込TIMER */ 
    void cmt_init(void)
    {
     SYSTEM.PRCR.WORD = 0xA502; /* protect off */ 
     MSTP(CMT0) = 0;      /* enable CMT0 */ 
     SYSTEM.PRCR.WORD = 0xA500; /* protect on  */
 
       /* CMT0 interrupt is enable */

     CMT0.CMCR.WORD = 0x0040; /* PCLK/8=25M/8=3.125MHz */ 
     CMT0.CMCNT = 0;        /* clear CMCNT           */ 
     CMT0.CMCOR = (3125-1);  /* 1000Hz 1msec          */

     IR(CMT0,CMI0)  = 0;     /* 割込要求クリア        */
     IPR(CMT0,    ) = 2;     /* プライオリティ        */
     IEN(CMT0,CMI0) = 1;     /* enable CMT interrupt  */ 
 
     CMT.CMSTR0.BIT.STR0 = 1;  /* start CMT0            */ 
    }

 (3)割込み 割込みベクタ(vect.hで定義されているものをそのまま使用)
   // CMT0 CMI0
   #pragma interrupt (Excep_CMT0_CMI0(vect=28))
   void Excep_CMT0_CMI0(void);
  
   // 割込プログラム
   void Excep_CMT0_CMI0(void)
   {   count_1m++;
   }


 (4)mainの初期化時に下記組込み関数を実行しておくことを忘れずに。
   setpsw_i(); /* ---- enable maskable interrupts ----  */

 

3.SCIの組込み
  RS232C通信を用いることで,複雑なIO周辺回路やエニュレータを用いずに
  変数の入出力が可能となる。

 (1)ハードウエェア
  秋月電子から,USB-RS232C変換ICとUSB-microを基板実装した
  超小型USBシリアル変換モジュール(AE-FT234X:@600)が売られていたので
  これを用い,簡単にハードが完成できる。

http://akizukidenshi.com/catalog/g/gM-08461/

 (2)SCI6(P32:TxD6,P33:RxD6),115200,8bit,1stop,non

 (3)初期化
  void init_sci6(void)
  {   /* ---- Initialization of SCI ---- */
    DWORD wait_timer;

      SYSTEM.PRCR.WORD = 0xA502;
      MSTP(SCI6) = 0;    /* The module stop state of SCI6 is canceled */
      SYSTEM.PRCR.WORD = 0xA500;  /* Enable write protection */

      SCI6.SCR.BYTE = 0x00;
        while (0x00 != (SCI6.SCR.BYTE & 0xF0))
        {    /* Confirm that bit is actually 0 */
        }

      /* ---- Set the I/O port functions ---- */
      PORT3.PODR.BIT.B2= 1;

      /* Set port direction - TXDn is output port, RXDn is input port */
      PORT3.PDR.BIT.B2 = 1;
      PORT3.PDR.BIT.B3 = 0;
       /* Set port mode - Use pin as general I/O port */
       PORT3.PMR.BIT.B2 = 0;
       PORT3.PMR.BIT.B3 = 0;

      MPC.PWPR.BIT.B0WI  = 0;
      MPC.PWPR.BIT.PFSWE = 1;
  
    MPC.P32PFS.BYTE = 0x0b;
      MPC.P33PFS.BYTE = 0x0b;
      MPC.PWPR.BIT.PFSWE = 0;    /* Enable write protection */
      MPC.PWPR.BIT.B0WI  = 1;

       /* Use pin as I/O port for peripheral functions */

       PORT3.PMR.BIT.B2 = 1; 
       PORT3.PMR.BIT.B3 = 1; /* PFSと共に設定しないとペリフェラルにならない */

      /* ---- Initialization of SCI ---- */
      /* Select an On-chip baud rate generator to the clock source */
      SCI6.SCR.BIT.CKE = 0;

      SCI6.SMR.BYTE = 0x00; /* stop bit 1 */

      /* BRR - Bit Rate Register (115200設定)*/
      SCI6.BRR = 6;   /* Bit Rate:{25MHz÷(64*0.5*115200)}-1 = 5.781 */
      for(wait_timer=1 ; wait_timer            /* Wait 1byte data send time */

      /* ---- Initialization of SCI interrupt ---- */
      IPR(SCI6, ) = 8;

      IR(SCI6,RXI6) = 0;   /* Interrupt request is cleared (Edge interrupt) */
      IR(SCI6,ERI6) = 0;
      IR(SCI6,TXI6) = 0;
      IEN(SCI6,RXI6) = 1;  /* enable SCI6 Rxi interrupt */
      IEN(SCI6,ERI6) = 1;  /* enable SCI6 ERi interrupt */
    IEN(SCI6,TXI6) = 1;  /* enable SCI6 Txi interrupt */
 
     SCI6.SCR.BYTE = 0x50; /* RxI(ERI),RE,:受信割込許可 */

     init_ring();      /* 送受信用リングバッファの初期化 */
   }

 (4)送受信の割込プログラムは省略

 

4.ΔΣADコンバータ
 (1)バードウェアの制約
   a) 差動入力回路は,GNDに対して±250mV(差動入力で±500mV)以下
   b) シングル入力は±500mV以下
   c) 内部にプルアップ抵抗がついているため,信号ラインのインピーダンス
     の影響がでてしまう。
     差動入力回路のインピーダンスを合わせること。

 (2)動作説明
   a) CMT1で81.92μsecのタイマーを作りイベント信号にする。
   b) ELC(イベントリンクコントローラ)で上記イベント毎にΔΣADコンバータ起動
   c) AD変換は7chほぼ同時に順次開始し,AD変換完了割込みを発生させることで
     各チャンル毎にデータを取り込む。(Runesasのサンプルプログラム参照)
     AD完了割込みを用いない場合は,81.92μsecを超える周期で,成行読込も可
   d) バラツキにより10bit程度の安定度なので,フィルタを用い12bit相当のデータを得る。
   e) イベント周期(81.92μsec)を変えると測定bit数が変わる

 (3)初期化
   void dsad_init(void)
   {
        volatile Uint16 loop;
 
       SYSTEM.PRCR.WORD = 0xA502;   /* protect off */
       MSTP(DSAD) = 0;          /* enable DSAD */
       SYSTEM.PRCR.WORD = 0xA500;   /* protect on  */

         DSAD.DSADRCR.BYTE = 0x40;

         DSAD.DSADCR0.BYTE = 0x80;
         DSAD.DSADCR1.BYTE = 0x80;
         DSAD.DSADCR2.BYTE = 0x80;
         DSAD.DSADCR3.BYTE = 0x80;
         DSAD.DSADCR4.BYTE = 0x80;
         DSAD.DSADCR5.BYTE = 0x80;
         DSAD.DSADCR6.BYTE = 0x80;
 
         DSAD.DSADGSR0.BYTE = 0x00;
         DSAD.DSADGSR1.BYTE = 0x00;
         DSAD.DSADGSR2.BYTE = 0x00;
         DSAD.DSADGSR3.BYTE = 0x00;

         DSAD.DSADGSR4.BYTE = 0x00;
         DSAD.DSADGSR5.BYTE = 0x00;
         DSAD.DSADGSR6.BYTE = 0x00;
   
          for (loop = 0; loop < 50000; loop++)
          {    /* wait to activate analog circuit */
          }

         DSAD.DSADRSTR.BYTE = 0x80; 
  
          while (DSAD.DSADRSTR.BIT.DSRST == 1)
          {    /* Check that the DSRST bit is cleared. */ 
         }
 
         /* Enable the A/D conversion start by a trigger*/
         DSAD.DSADCSR0.BYTE = 0x18;
         DSAD.DSADCSR1.BYTE = 0x18;
         DSAD.DSADCSR2.BYTE = 0x18;
         DSAD.DSADCSR3.BYTE = 0x18;
         DSAD.DSADCSR4.BYTE = 0x18;
         DSAD.DSADCSR5.BYTE = 0x18;
         DSAD.DSADCSR6.BYTE = 0x18;

      /* AD変換完了割込でデータを格納する */
          IPR(DSAD, DSADI0) = 1;
         IPR(DSAD, DSADI1) = 1;
         IPR(DSAD, DSADI2) = 1;
         IPR(DSAD, DSADI3) = 1;
         IPR(DSAD, DSADI4) = 1;
         IPR(DSAD, DSADI5) = 1;
         IPR(DSAD, DSADI6) = 1;
   
        /* Interrupt Request Enable  (IERm). */
         IEN(DSAD, DSADI0) = 1;
         IEN(DSAD, DSADI1) = 1;
         IEN(DSAD, DSADI2) = 1;
         IEN(DSAD, DSADI3) = 1;
         IEN(DSAD, DSADI4) = 1;
         IEN(DSAD, DSADI5) = 1;
         IEN(DSAD, DSADI6) = 1;
   }
   /*------------------------------------------------------*/
   
void elc_init(void)
   {
      SYSTEM.PRCR.WORD = 0xA502;   /* protect off */
      MSTP(ELC) = 0;           /* enable ELC  */
      SYSTEM.PRCR.WORD = 0xA500;   /* protect on  */
  
        /* DSAD channel0 to 6 links to compare match of CMT1.
        Then DSAD starts conversion every linked signal. */
        ELC.ELSRB[0].BYTE = 0x1f;    /* DSAD channel0 */
        ELC.ELSRB[1].BYTE = 0x1f;    /* DSAD channel1 */
        ELC.ELSRB[2].BYTE = 0x1f;    /* DSAD channel2 */
        ELC.ELSRB[3].BYTE = 0x1f;    /* DSAD channel3 */
        ELC.ELSRB[4].BYTE = 0x1f;    /* DSAD channel4 */
        ELC.ELSRB[5].BYTE = 0x1f;    /* DSAD channel5 */
        ELC.ELSRB[6].BYTE = 0x1f;    /* DSAD channel6 */

         ELC.ELCR.BYTE = 0x80;   /* ELC All Event Link Enable */
   }
   /*------------------------------------------------------*/

 

  (4)ΔΣADコンバータの直線性誤差
     市販DMMを基準として,直流電圧を測定し最大値と最小値を結ぶ
     直線からの偏差を誤差としプロットした。

10mVを超える範囲で,±0.1%以内であり良好。
但し,毎回の測定値はバラツキがあり,デジタルフィルタを
入れないと安定した測定はできない。

2015.4.21 TMR3を用いてP13ポート(TMO3)に≒20kHzのPWM波形を出す。
ここでの備忘録は
(1)IOポート設定時のプロテクト解除と再設定
(2)汎用ポートをペリフェラルのIOポートにする初期化方法

/*------------------------------------------------------*/
void init_tmr3(void) /* TMR3 20kHz*/
{
   /* ペリフェラルポートとして使うためのピンファンクションの初期化 */
   SYSTEM.PRCR.WORD = 0xA502; /* protect off  */
   MSTP(TMR3) = 0;    /* enable TMR3  */
   SYSTEM.PRCR.WORD = 0xA500; /* protect on  */ 

    PORT1.PMR.BIT.B3 = 0x1;  /* P13をペリフェラルIOに指定 */

    MPC.PWPR.BIT.B0WI  = 0;  /* PWPR - Write-Protect Register */ 
      MPC.PWPR.BIT.PFSWE = 1;
       MPC.P13PFS.BIT.PSEL = 0x05; /* TMO3 指定 */
      MPC.PWPR.BIT.PFSWE = 0;  /* Enable write protection */
      MPC.PWPR.BIT.B0WI  = 1;


    TMR3.TCNT = 0;    /* CMT3 Count 0  */ 
    TMR3.TCORA = 156-1;   /* 25M/8/156=20kHz */
    TMR3.TCORB = 78-1;   /* Duty 50% 方形波 */
    TMR3.TCR.BIT.CCLR = 0x01; /* TCORA clear  */
    TMR3.TCCR.BIT.CKS = 0x02; /* PCLK/8でカウント */
    TMR3.TCCR.BIT.CSS = 0x01; /* PCLK/8でカウント */
    TMR3.TCSR.BIT.OSA = 0x02; /* CMPA High Out */ 
    TMR3.TCSR.BIT.OSB = 0x01; /* CMPB Low  Out */  
}

今はDATAFLASH(CPU内蔵FLASHをEEPROMとする)の使い方を学んでいます。


Code Composer Studio v4 (TI製)のライセンス

2013-04-23 | マイコン

パソコンをWindowsXPからWindows7に変えたら、TI製DSPの開発ツール
Code Composer Studio V3.3の日本語が表示されなくなってしまった。

<2013.12月>
その後,エディタの言語設定において,一度日本語でない言語を指定したら
突然日本語になり,一回だけはフォントや文字サイズが変えられるようになった。


また,CCSv4では,正しく日本語表示でき問題はクリアした。
しかしCCSv4を使うにはライセンスの問題が残った。

 

1.ライセンスが30日限定、またはサイズ制限、または高価
  そこで、比較的安価($79)でライセンスを取得できる方法を教えてもらった。  
TMDSEMU100V2U-14T:
XDS100v2 USB JTAG エミュレータ(14 ピン TI コネクタ)

写真は、USB-JTAG エミュレータである。
これを購入($79)し、CCSv4のエミュレータに設定すると、ライセンスが得られた。

 

2.操作画面がV3.3と異なる
  環境設定から何からまったく異なるのである。
  すでにCCSv5も出てv4と同じ操作画面であるので、使い慣れるしかないのだ
  ろうが、余りの変化に使えない。

3.CCS3.3で使えるXDS100
  TI社では安価でCCS4以降のライセンス付エミュレータで,CCS3.3でも使えた
  XDS100v1の販売を止めてしまった。
   BlackHark社から,XDS100v1にも変更できる互換エミュレータUSB100v2D
  が$99(+送料が掛かる)で販売されているのを知り,早速購入してみた。
  http://www.blackhawk-dsp.com/products/USB100v2D.aspx

  http://www.blackhawk-dsp.com/support/xds100/Default.aspx
  このページのRollback2v1 and Upgrade2v2 ファイルをダウンロードし
  Rollback2v1を実行することで,XDS100v1となる。


  Win7(32bit)で実行した時はERRERが出てしまったため,XPマシンで実行したら
  OKになった。
  これで当分はCCS3.3で開発をするに安心できる。


H8S2345プロクラム開発の手順

2013-02-15 | マイコン

H8S  C言語によるプログラム開発(H8S 2345で説明)

1.ファイル構成

    2345s.H                            H8S/2345のハードウエアに関するアドレスなど定義
    vect.src             リセットベクタ、割込みベクタを定義するアッセンブリファイル
    init.c                  スタックポインタ設定、初期化、main()へジャンプ
     initsct.c             init.cから呼ばれる。 (変数のRAMへの配置、変数の初期化(0を書込))
     main.c               ユーザプログラム
     linkfile.sub       サブコマンドファイル:リンク時のメモリ配置を定義
     makefile                            コンパイル・リンク手順を定義

              上記ファイルを作成し、makefileを実行することで  ○○○.absファイルを作成する。

2.各ファイルの説明

  (1)ヘッダーファイル(2345s.H、○○.H)

        1) char型は signed char となる。
            コンパイラによっては,charはunsigned としているものもあるので注意する。

        2) ビットフールド(bit操作命令)を用いて出力する場合、bit操作命令は一度読込みをして
       から対象bitを変更し出力するので、書込みONLYのレジスタ(DDR)等には使用禁止。

   (2)vect.src

         1) C言語で書かれた関数名は、アッセンブラでは関数名の前に'_'(アンダースコア)を付ける。

         2)割込みベクタにジャンプ先の関数名のアドレスを入れる。

   (3)initsct.c

         1)セクション
              セクション      内  容                   説 明
             P (ROM)    プログラム領域        コードが配置される
             C (ROM)    const 定数領域     値の変化しない定数
             D (ROM)    初期値付変数        セクションXにコピーして用いる
             B (RAM)    初期値の無い変数   初期値は0とする
             X (RAM)    初期値付変数        セクションDからコピーされ配置

        2)初期値付変数
             H8S では初期値はROM領域にあり、プログラムでRAM領域にコピーして使用する

        3)割込みマスク
                 set_imask_exr(0)        0番より大きい番号の割込みを受け付ける。
                 set_imask_exr(7)        7番より大きい番号の割込みを受け付ける。
                            これはNMI のみなので、割込み禁止と同意となる。

        4)_secttop("D"),_sectend("D")
           セクションの始まりと終わりを得る特別な関数(この場合は,"D"セクション)
             初期値付変数のコピーと初期値なし変数のクリアを行う。

  (4)main.c
            ユーザプログラム

  (5)linkfile.sub
         1)リンクするオブジェクトファイル ○○.obj を列記する
         2)コード、DATA領域の先頭番地を定義する。
         3)初期値付変数処理のセクション名を定義する。

   (6)makefile
          コンパイラの手順を記述し、変更のあった部分のみを再コンパイルしリンクする。

 3.割込み制御

  (1)割込み手続き
          1)割込みベクタの設定
                 VEXT.SRC にて割込みベクタに割込み関数のアドレスを指定する

             Exsample:

               .CPU      2000a
               .IMPORT             _INIT
               .IMPORT             _tpu3
               .IMPORT             _sci1err
               .IMPORT             _sci1      

               .SECTION           VECT,DATA,LOCATE=H'000000
               .DATA.L             _INIT                  ;RESET VECT

               .ORG                 H'0000C0            ;CH3
               .DATA.L             _tpu3                   ;imia0 VECT                    

               .ORG                   H'000150
               .DATA.L             _sci1err               ;sci1 err VECT

               .ORG                   H'000154
               .DATA.L             _sci1                    ;sci1 receive VECT

               .END

          2)割込みコントローラ
              割込みモードの設定                         :SYSCR システムコントロールレジスタ
              割込みレベル(優先順位)の指定    :IPRA~IPRKインタラプトプライオリティレジスタ

              Exsample:

                 SYSCR.BIT.INTM=2;                     /* モード2 割込み              */

                 INTC.IPRG.BIT.LOW = 3;              /* tpu3 priority level 3      */

                 INTC.IPRK.BIT.HIGH = 5;              /* sci1 priority level 5        */

           3)周辺I/Oのイニシャライズ

               Exsample: 10msタイマー割込み

               void       inittpu3(void)
               {
                       MSTPCR.BIT.B13 = 0;         /* start TPU                        */
                       TPU.TSYR.BYTE = 0;           /* no sync                          */
                       TPU3.TMDR.BYTE = 0;         /* nomal mode                   */
                       TPU3.TIOR.WORD = 0;        /* non output                     */
                       TPU3.TCNT = 0;                  /* counter= 0                     */
                       TPU3.TCR.BYTE = 0x23;      /* TGRAでクリア,up count,Φ/64 */
                       TPU3.TGRA = 3124;             /* 20e6/(64*3125)=100Hz   */
                        TPU3.TIER.BIT.TGIEA = 1;   /* enable TGFA                    */
                        TPU.TSTR.BIT.CST3= 1;      /* start TPU3      */
                 }

                Exsample:SCI受信割込み

               void       initsci1(void)
              {       int     i;

                       MSTPCR.BIT.B6 = 0;               /* Module start SCI1        */
                       SCI1.SCR.BYTE = 0x00;          /* stop SCI1                   */
                       SCI1.SMR.BYTE = 0x00;          /* Async 9600,8,1           */
                       SCI1.SCMR.BYTE = 0x00;        /* LSB first                     */
                       SCI1.BRR = 64;                       /* 9600                          */
                            for(i= 0i<511;i++);
                       SCI1.SCR.BYTE = 0x70;           /* 受信割込、送受信可        */
                       SCI1.SSR.BIT.ORER = 0;          /* オーバーランエラークリア            */
                       SCI1.SSR.BYTE = 0x80;           /* clear errer flag             */
               }

         4)割込み関数の作成
              #pragma  interrupt(関数名)で割込み関数と認識する

              Exsampl:10ms割込み

              #pragma             interrupt(tpu3)
               void       tpu3(void)
               {     TPU3.TSR.BIT.TGFA = 0;          /* clar TGFA                 */

                       Count_10m++;
                       if(Count_10m >= 10)
                       {       Count_100m++;           /* 0.1s                         */
                                Count_10m = 0;
                                task100m();                 /* 100msecごとの仕事      */
                       }

                       if(Count_100m >= 10)
                      {         Count_1s++;               /* 1s                            */
                                 Count_100m = 0;
                       }

                       timerint();
                 }

4.その他の留意点

   (1)コンパイラオプション( makefile参照 :これから掲載)
         init.obj:  init.c ea0020.h
                   ch38 -cpu=2000a -deb -g -sh=o -op=0
                         cpu 2000a           :H8S/2000 アドバンストモード
                         deb                      :デバッグ情報出力
                         g                         :モジュール間最適化
                         sh=o                    :リスト内容はオブジェクト情報有り
                         op=0                    :最適化なしのオブジェクトを出力


マイコン勉強会

2013-02-14 | マイコン

   H8S2345を使って,組込マイコンの勉強会を始めた。
   新人の頃は学習を始めるにあたり,どこから何をやったらいいか分からないので
   優しい先輩がいることがとても大切である。

   将来当社を背負う,若手技術者を育成に力を入れているのだ。

   これが学習を始めたマイコンボード。
           http://www.tokyo-seiden.co.jp/seihinn/cpu/tb405/
          

1.環境設定の 構築:パソコンの動作環境を設定できるようにする。
    (統合環境下ではなく,DOSレベルで動作させることで,全体像を理解させる。)

  (1)エディタを用い,C言語で書いたプログラムをコンパイルできる。
  (2)RS232Cシリアルポートを用いて,CPUのFLASH ROMに書込みをする。
  (3)動作させ,期待したとおりの動きか確認。(まずはLEDの点滅から)

  ここまで出来れば,後は自己学習で何でもできるはず。

2.RS232C シリアルポート
  (1)最近のパソコンはシリアルポートがない。
     USB-シリアルケーブルを買ってWindowsXPで動いていたものが,
     Windows7では以降では動かない。
     prolific社製は安く購入できたが,7以降のドライバが見つからない。

  (2)iBUFFALO製のBSUSRC06は,XP,7,8で動作OKだった。
     ボーレート115200でも問題なく動作する。