趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • TwitterをUSB LCDモジュールに表示させてみる

    投稿日 2013年 10月 13日 コメントはありません

    製作したUSB LCDモジュールですが、Twitterのtweetを表示させてみました。

    Streaming API で指定したキーワードが含まれているTweetを表示させてみます。

    #!/usr/bin/python
    # -*- coding: utf-8 -*-
     
    import sys, json, tweepy, re, os
    
    # Account
    consumer_key= '        '
    consumer_secret= '        '
    access_token= '        '
    access_token_secret= '        '
    
    class Listener(tweepy.streaming.StreamListener):
        def on_status(self, status):
            message = status.user.name.encode("utf-8") + ":" +  \
                      re.sub(r'\n',r' ',status.text.encode("utf-8"))
            print status.id,":", \
                   status.lang,":", \
                   status.user.screen_name.encode("utf-8"),":", \
                   status.user.name.encode("utf-8"),":", \
                   re.sub(r'\n',r' ',status.text.encode("utf-8"))
            os.system('./usblcd.py "'+message+'"')
            return True
     
        def on_error(self, status):
            print status
      
    if __name__ == '__main__':
        l = Listener()
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
     
        stream = tweepy.Stream(auth, l)
        stream.filter(languages=['ja'],track=['tbs','fujitv','ntv','tvasahi','tvtokyo'])

    今回はキーワードを’tbs’,’fujitv’,’ntv’,’tvasahi’,’tvtokyo’として、テレビ局に関するTweetを拾ってみます。

    sDSC06133

    Pythonスクリプトを動かすとこんな感じで表示されました。

    どんどん表示される感じがわかるように動画ファイルも上げておきます。

     


  • USB LCDモジュールの製作

    投稿日 2013年 10月 12日 コメントはありません

    PIC18F14K50を使ってUSBで接続・制御するグラフィックLCDモジュールを作ってみました。

    OLYMPUS DIGITAL CAMERA

    LCDモジュールは手持ちの秋月の128×64のグラフィック液晶です。

    OLYMPUS DIGITAL CAMERA

    PIC18F14K50では端子が不足するので、74HC273(Dラッチ)を使って制御信号をラッチしてからLCDモジュールのデータ線に信号を与えています。

    OLYMPUS DIGITAL CAMERA

    この74HC273はパーツ箱に眠っていたもので、デートコードは8820でした。つまり1988年の第20週ですから25年以上前の1988年5月下旬頃に製造されたものということになります。無事に動くか少し不安ではありましたが・・・。

    OLYMPUS DIGITAL CAMERA

    裏側はこんな感じでぐちゃぐちゃになってしまいました。本当はLCDは180度回した形で取り付けたかったのですが、このLCD、図面の右側から端子が振ってあって、思いっきり間違えてしまいました。それで急遽LCDの方を回して、コネクタをもう一つつける形にしてしまいました。

    ファームウェアは例によって /dev/ttyACM0 としてUSBシリアルとして認識されるようになっていて、液晶モジュールへの制御信号とデータの繰り返しで垂れ流すとそのままLCDモジュールをPICが制御するようになっています。PC側はPythonで記述してあって、一旦GDライブラリを使ってビットマップ上にTrueType(のビットマップフォント)を展開した後、LCD用のコマンド列を生成するようになっています。LCDにはnaga10フォントで半角24文字×6行の表示ができるようになっています。


  • PIC18F14K50でI2C液晶を制御

    投稿日 2013年 9月 29日 コメントはありません

    CDCで動くようになった秋月800円PIC18F14K50ボードですが、これに秋月I2C小型液晶(他でも売ってますが・・・)をつけてみました。

    まあ、日本語データシートに沿ってI2Cの初期化と、液晶の説明書に沿って液晶の初期化をして、CDCでの入力された文字を(エコーバックに加えて)液晶にも表示させているだけです。

    実験風景はこんな感じです。

    OLYMPUS DIGITAL CAMERA

    OLYMPUS DIGITAL CAMERA

    1枚目の写真は全景で、ttyACM0として認識した後、GtkTermで入力した文字が表示された様子です。2枚目はPIC周辺の拡大写真です。
    PICkit3でプログラムを書き込んだ後PGC/PGDは抜いておかないと、これらがUSBのD+/D-になっているためUSBで認識できませんので、2本だけ線が外してあります。ブレッドボード上でピロンと2本伸びたジャンパ線がI2Cの信号線です。I2Cバスのプルアップ抵抗(2.7kΩ)は液晶の下にあります。最初は液晶モジュールのピッチ変換基板に載っているのと同じ10kΩを使っていたら動作が安定せず、2時間くらい悩んでしまいました。やっぱり規格はちゃんと調べて値を決めないとダメですね。
    縦に実装している小さな基板にはSOT23パッケージの5V→3.3Vレギュレータ(TAR5S33)が見えていない面に載っています。液晶モジュールの電源電圧が3.3Vなので入れていて、この基板の裏側にはチップ部品を載せるパッドがあるのでそこにパスコンを載せています。
    ソフトウェアの方ですが、液晶の制御はI2Cで行いますが、シングルマスタモードでの動作前提なので簡単でした。

    PIC18F14K50はPIOはもちろんのこと、今回使ったI2Cの他に、ADC、コンパレータ、PWM、タイマ、UARTなどがある上に、Linuxでバッチリ認識できるUSB付きでボードで800円、チップ単体だと150円(SSOP)とか170円(DIPSOP)で手に入ります。そもそもPICというのがプログラミングする上で多少ナニではありますが・・・、周辺コントローラ(Peripheral Interface Controller = PIC)なのでそう割り切ればまあいいでしょう。

    ここまでの作業はすべてLinuxMint13上で実施しているのですが、このやり方だとPICおよび周辺回路のプログラミング・デバッグはx86のLinuxでしっかりやっつけてほぼ完成したところでRaspberryPiに持っていく、ということが非常に容易になります。実際に今回作ったものを持っていってみました。

    Screenshot-rdesktop

    残念ながら、RaspberryPiではGtkTermは動かないようなのですが、上記の通りしっかり認識できています。
    削除していない評価ボードのプログラムが悪さしているものの、他のターミナルプログラム(cutecom)でも液晶に表示ができています。


  • CDCサンプルプログラムにシリアルナンバーをつける

    投稿日 2013年 9月 28日 コメントはありません

    複数の同じUSBデバイスを識別する方法として、シリアルナンバーで区別する方法がありますが、MicrochipのCDCサンプルプログラムでは以下の通り、シリアルナンバーはサポートされていません。

    $ sudo lsusb -d 04d8:000a -v
    
    Bus 001 Device 004: ID 04d8:000a Microchip Technology, Inc. CDC RS-232 Emulation Demo
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass            2 Communications
      bDeviceSubClass         0 
      bDeviceProtocol         0 
      bMaxPacketSize0         8
      idVendor           0x04d8 Microchip Technology, Inc.
      idProduct          0x000a CDC RS-232 Emulation Demo
      bcdDevice            1.00
      iManufacturer           1 Microchip Technology Inc.
      iProduct                2 CDC RS-232 Emulation Demo
      iSerial                 0             ←ここ
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           67
        bNumInterfaces          2
       (以下略)

    そこで、シリアルナンバー対応してみました。

    usb_descripters.c の 166行目付近の device_dsc を以下のように修正します。

    /* Device Descriptor */
    ROM USB_DEVICE_DESCRIPTOR device_dsc=
    {
        0x12,                   // Size of this descriptor in bytes
        USB_DESCRIPTOR_DEVICE,  // DEVICE descriptor type
        0x0200,                 // USB Spec Release Number in BCD format
        CDC_DEVICE,             // Class Code
        0x00,                   // Subclass code
        0x00,                   // Protocol code
        USB_EP0_BUFF_SIZE,      // Max packet size for EP0, see usb_config.h
        0x04D8,                 // Vendor ID
        0x000A,                 // Product ID: CDC RS-232 Emulation Demo
        0x0100,                 // Device release number in BCD format
        0x01,                   // Manufacturer string index
        0x02,                   // Product string index
        0x03,                   // Device serial number string index
        0x01                    // Number of possible configurations
    };

    修正したのは下から2つめの「// Device serial number string index」で、0x00だったのを0x03にして、string indexの3がシリアルナンバーであることを指定します。

    さらに同じファイルのもっと後の方にstring descriptorの定義があるので、ここも修正します。

    //Language code string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[1];}sd000={
    sizeof(sd000),USB_DESCRIPTOR_STRING,{0x0409}};
    
    //Manufacturer string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd001={
    sizeof(sd001),USB_DESCRIPTOR_STRING,
    {'M','i','c','r','o','c','h','i','p',' ',
    'T','e','c','h','n','o','l','o','g','y',' ','I','n','c','.'
    }};
    
    //Product string descriptor
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[25];}sd002={
    sizeof(sd002),USB_DESCRIPTOR_STRING,
    {'C','D','C',' ','R','S','-','2','3','2',' ',
    'E','m','u','l','a','t','i','o','n',' ','D','e','m','o'}
    };
    
    //Serial string descriptor                  これを追加
    ROM struct{BYTE bLength;BYTE bDscType;WORD string[8];}sd003={
    sizeof(sd003),USB_DESCRIPTOR_STRING,
    {'S','N','0','0','0','0','0','1'}
    };
    
    //Array of configuration descriptors
    ROM BYTE *ROM USB_CD_Ptr[]=
    {
        (ROM BYTE *ROM)&configDescriptor1
    };
    //Array of string descriptors
    ROM BYTE *ROM USB_SD_Ptr[USB_NUM_STRING_DESCRIPTORS]=
    {
        (ROM BYTE *ROM)&sd000,
        (ROM BYTE *ROM)&sd001,
        (ROM BYTE *ROM)&sd002,
        (ROM BYTE *ROM)&sd003              // これを追加
    };

    追加箇所は2箇所、sd003に関するところです。
    この修正だけだとUSB_NUM_STRING_DESCRIPTORSの定義が変わらないため、コンパイルでエラーが出ますので、usb_config.h も修正します。144行目に

    #define USB_NUM_STRING_DESCRIPTORS 3

    というのがあるので、これを

    #define USB_NUM_STRING_DESCRIPTORS 4

    に修正します。

    これでコンパイルしてFlashに書き込んで、USBコネクタに挿入すると、

    $ sudo lsusb -d 04d8:000a -v
    
    Bus 001 Device 005: ID 04d8:000a Microchip Technology, Inc. CDC RS-232 Emulation Demo
    Device Descriptor:
      bLength                18
      bDescriptorType         1
      bcdUSB               2.00
      bDeviceClass            2 Communications
      bDeviceSubClass         0 
      bDeviceProtocol         0 
      bMaxPacketSize0         8
      idVendor           0x04d8 Microchip Technology, Inc.
      idProduct          0x000a CDC RS-232 Emulation Demo
      bcdDevice            1.00
      iManufacturer           1 Microchip Technology Inc.
      iProduct                2 CDC RS-232 Emulation Demo
      iSerial                 3 SN000001
      bNumConfigurations      1
      Configuration Descriptor:
        bLength                 9
        bDescriptorType         2
        wTotalLength           67
        bNumInterfaces          2
        bConfigurationValue     1
        :
        :
       以下略

    となって、無事にシリアルナンバーがつきました。


  • PIC18F14K50でUSBシリアル

    投稿日 2013年 9月 26日 コメントはありません

    日経Linuxの9月号にPIC18F14K50をLinuxで使う、という趣旨の記事が載っています。

    要はLinux上のMPLABX環境でPIC18F14K50のCDC(Communication Device Class)のサンプルプログラムをコンパイルして、PICkit3で書き込んで、CDCとして認識させて動かす、というものです。このサンプル自体はずーっと昔にWindows上のMPLABでコンパイルして動かしたことがあるのですが、Linuxではうまく動かず放ってありました。

    手持ちに秋月のPIC18F14K50の800円ボードもPICkit3もあるし、ちょっとやってみたいこともあるので試してみました。環境は LinuxMint13 32bit です。

    大きな流れとしては、

    1. MPLABXをインストール
    2. MPLAB C18ツールチェーンをインストール
      MPLAB C18ツールチェーンは普通はたどり着けないところにあるので、wget で http://www.microchip.com/mplabc18-linux-installer からツールチェーンをもってきてインストール。これまでうまくいかなかったのはこれ。結局ライブラリは C18 でしか動かない、ってことなのですね。
    3. Microchip Library for Applications をインストール
    4. プロジェクトを作成し、サンプルプログラムを開く。
      IDE v8 Project から CDC Basic Demo – C18 – Low Pin Count USB Development Kit.mcp を開く。 開いたら「Power Target circuit from PICkit3」のチェックボックスをONにして、PICkit3から電源供給できるようにする。

    というところです。

    で、書き込んだ後、ボードをUSBケーブルでホストPC(Mint13)と接続するのですが、接続後に見えるデバイスは「/dev/ttyACM0」ではなく「/dev/ttyUSB0」と「/dev/ttyUSB1」になってしまいます。ロードされるドライバも cdc_acm ではなく、ftdi_sioがロードされてしまい、正しく動作しません。

    この原因は ftdi_sio ドライバにUSBデバイスID「04d8:000a」が記述されていて、そちらがロードされてしまうためのようです。とりあえず回避するには、

    $ sudo rmmod ftdi_sio

    として、ftdi_sio ドライバを外してやり、その後でUSBケーブルを差し直すと正しく /dev/ttyACM0 として見えて、ちゃんと動作するようになります。恒久的には ftdi_sio ドライバを /etc/modprobe.d の下の blacklist に入れてやればおそらく解決するのでしょうが、当然本物のFTDIチップが動かなくなります。

    なんでこんなことになっているかというと、この件のパッチが投げられている
    https://patchwork.kernel.org/patch/1464661/
    によると、FTDIチップをエミュレーションするファームウェアでこのMicrochipの評価ボードのベンダID/デバイスIDをそのまま使っているハードウェアベンダがいるため・・・・ということのようです。(うー、勘弁して・・・・)

    ドライバに直接手を入れれば修正できるようなのですが、ちょっと面倒臭いですね・・・。何かいい方法(ベンダID/デバイスIDを指定して blacklist するなど)があればいいのですが・・・。

    で、何とかならないかと、試しに /etc/udev/rules.d/10-cdcacm.rules として以下の内容のファイルを作ります。

    SUBSYSTEM=="usb", ATTRS{idVendor}=="04d8", ATTRS{idProduct}=="000a", GROUP="adm", MODE="0666", SYMLINK+="cdc_acm"

    udevをリスタートしてルールを読み込ませます。

    $ sudo service udev restart

    試しに、

    $ sudo modprobe ftdi_sio

    として、先にrmmod してあった ftdi_sio を読み込ませて、その後で、USBを抜き差ししてみます。
    dmesgの最後を見てみると、

    [ 5431.756641] udevd[4801]: starting version 175
    [ 5479.158712] USB Serial support registered for FTDI USB Serial Device
    [ 5479.159765] usbcore: registered new interface driver ftdi_sio
    [ 5479.159768] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
    [ 5490.096591] usb 1-1.3: USB disconnect, device number 10
    [ 5492.337738] usb 1-1.3: new full-speed USB device number 11 using ehci_hcd
    [ 5492.434666] cdc_acm 1-1.3:1.0: This device cannot do calls on its own. It is not a modem.
    [ 5492.434688] cdc_acm 1-1.3:1.0: ttyACM0: USB ACM device

    となっていて、とりあえず ttyACM0 として認識しているようです。

    しかし再起動してみると・・・・ftdi_sioとして認識してしまう・・・orz

    どうやらどちらのドライバが先に認識するか・・・だけみたい。/etc/udev/rules.d/10-cdcacm.rules ではコントロールできなさそうなことはわかりました・・・。

    やっぱり ftdi_sioをblacklistして、rules.dでFTDIドライバを読ませるとかすればいいのでしょうかね・・・?

    <追伸>

    ちなみに、バージョン3.12-rcや3.2.51のカーネルソースでは、上記パッチが適用されてるっぽいです。一方で、

    $ uname -a
    Linux G530-2-Mint 3.2.0-23-generic #36-Ubuntu SMP Tue Apr 10 20:41:14 UTC 2012 i686 i686 i386 GNU/Linux

    ん~?カーネルのバージョンを上げれば解決するのだろうか??
    Synapticでカーネルパッケージを入れてみました。

    $ uname -a
    Linux G530-2-Mint 3.2.0-53-generic-pae #81-Ubuntu SMP Thu Aug 22 21:23:47 UTC 2013 i686 i686 i386 GNU/Linux

    ・・・・治りました。ここまでの苦労は何だったんでしょう(^^;
    やっぱり、アップデートはちゃんとやっとかないとダメですね・・・。


  • MPLAB-X + PIC12F675は使えない・・・・

    投稿日 2013年 8月 13日 コメントはありません

    ちょっと治具を簡単に手持ちのPIC12F675で作ろうとしたのですが、ハマってしまいました。
    今回の環境はMPLAB-X + XC8を使ってみようと思ったのですが、これがハマりの元凶です。

    まずはLチカで環境に問題がないことを確認しようとしていたのですが、そこで引っかかりました。

    Lチカプログラムはこんな感じで、何の変哲もありません。

    101

    しかし、コンパイルして動かそうとすると動きません。
    いろいろ設定を疑ってみたものの、うんともすんとも言いません・・・・。

    プログラムメモリの内容をディスアセンブル表示させると、先頭は

    Screenshot-1

    というような感じでした。001番地にCALL 0x3FFがありますが、これは確か3FF番地にはRETLW命令が置いてあって、Wレジスタにクロック周波数の補正値を入れて戻ってきて、その後、OSCCALレジスタにWの値を書き込む(上記で言うと、レジスタバンクを1に切り替えてからT1CONのアドレスに書き込む)ことで、周波数を補正していたはずです。

    しかし、不安になって、WindowsでPickit2でROMの中身を吸い出して見たところ・・・・・3FF番地の値が0000(NOP)になってました。これでは001番地のCALL命令で無限ループになるので動くわけがありません。

    Pickit2にはクロック周波数補正値を回復する機能があるので、それで3FF番地の値を回復させて、改めてMPLAB-Xで書き込んでみるとLチカが動作しました。・・・が、再度コンパイルして書き込んでみると、やっぱり動きません。
    Pickit2で見ると、また3FF番地の値が消失しています。この状態をPickit2で吸い出してHEXファイルに保存し、補正値を回復させ、改めて吸い出したHEXファイルを書き込むと、Pickit2は補正値を保存するので、ちゃんと動作しました。

    とにかく「MPLAB-XとPIC12F675の組み合わせは使い物にならない」ということがわかりました・・・。


  • 2枚目のCeleron847を導入

    投稿日 2013年 4月 20日 コメントはありません

    BIOSTARのCeleron847オンボードマザーのNM70I-847は結局Windows8マシンになってしまいましたが、やっぱり小型で静かな常時電源ONのLinuxマシンを用意したくなってしまい、もう1枚Celeron847マザーを調達してしまいました。

    今度はGIGABYTEのGA-C847Nにしてみました。
    GigaEtherが2つあったり、今時珍しいPCIスロットがあったりしますが、普通に4GBのメモリ2枚とセットで組んでLinuxMint13 MATE Edtion 32bit(PAE対応カーネル)を入れたら、何の問題もなく安定動作しました。

    しかし、このマザーもシステムFANの速度制御機能はなく、ケースFAN(小型ケースなので4cmファン・・・)が全開で回るので壮絶な騒音で常時ONどころではありません。かといって、ケースFANなしではさすがに熱が篭もるので、以前作ったFANコントローラを入れました。

    IMG_6068S

    ファンが4cmなのでファームウェアを少し修正して、高速回転寄りになるようにしました。(そもそも4cmファンでは1000rpmとかではそのままでは安定して回りませんでした)
    非常に効果的で、ほとんど音は気にならず熱が篭もるようなこともなくなりました。

    その後、VMwareをインストールし、さらに仮想マシンにBasixやLinuxMintを入れて怪しいサイトはVMでアクセスして使える常用PC化することができました。仮想マシンでもHD動画は無理ですがYouTube再生も目立ったコマ落ちなく再生できるので、ちょっと怪しいことも安心して試せるPCになりました。


  • PythonでUSBのパイプを扱う方法

    投稿日 2012年 7月 18日 コメントはありません

    Pinguino(PICマイコンでArduinoのようなことをするもの)について調べていたら、

    http://wiki.pinguino.cc/index.php/Interfacing_with_Python

    にUSBのパイプをPythonで扱う方法が出ていた。

    PinguinoではUSBでホストとのデータ送受信ができるようであり、そのための例として載っている。
    (ちなみにPinguinoは秋月で売っている PIC32MX220F032BのQFP44ピンバージョンであるPIC32MX220F032Dを搭載したバージョンがOLIMEXから販売されている)

    ここによれば、

    On Computer Side

    #!/usr/bin/env python
    #
    import usb
    busses = usb.busses()
    # Search pinguino between all the usb devices
    for bus in busses:
      devices = bus.devices
      for dev in devices:
        if dev.idVendor==0x04d8 and dev.idProduct==0xfeaa:
          pingu = dev
    # Get a device handler for th usb device
    dh = pingu.open()
    # Set configuration 3 an interface 0
    dh.setConfiguration(3)
    dh.claimInterface(0)
    # Read 5 bytes in Bulk mode, convert them to 
    # a string and print it
    while 1 == 1: 
      cadena = ""
      for i in dh.bulkRead(0x82, 5, 10000):
        cadena += chr(i)
      print cadena

    という簡単な記述で扱えるらしい。

     


  • PIC32MXで7segLEDを駆動してみた

    投稿日 2012年 7月 7日 コメントはありません

    続いて、PIC32MXで7segLEDを点灯してみました。

    使用したのは4桁のカソードコモンの7セグメントLEDです。

    回路は各桁のSEGMENTのA~G、DPをポートBのbit4~10、bit11に100Ωの抵抗を介して接続、各桁をデジタルトランジスタDTC123ESAを介してポートBのbit2,bit3、ポートAのbit2,bit3で駆動しています。

    ダイナミック点灯の処理は割込みを1ms周期でかけて、1msごとに点灯する桁を変更しています。

    表示している内容は0.1秒単位のストップウォッチ風の何かです。(単にカウントアップしているだけ)

    さすがに28pinのDIPマイコンだとこれだけでポートを12本も使ってしまいます。PIC32MX120F032B(PIC32MX120F016BやPIC32MX220F032Bも同じ)は電源・GND関係だけで6本、さらにデバッガで3本の端子を使ってしまいますので、ちょっと苦しいかもしれません。

    なお、デフォルトではJTAGやセカンダリオシレータがイネーブルになっているようで、使えない端子があります。それを解決するために、15行目に

    #pragma config JTAGEN = OFF, FSOSCEN = OFF

    という記述を入れて、JTAGやセカンダリオシレータを禁止しています。

    なお、例によって役に立たないソースを置いておきます。→7seg駆動のソース

    あ~、コメントは直し忘れていますので、無視してください。^^;


  • PIC32でLチカ(別の方法)

    投稿日 2012年 7月 3日 コメントはありません

    待ちループ、割り込みで点滅するLチカを紹介しましたが、MIPS CPUの場合には別の方法の時間待ちも可能です。
    MIPS CPUの場合にはCPUの中のCP0(CoProcessor 0)というのがあって、その中にCOUNTレジスタというレジスタがあります。このレジスタはCPUコアの周波数の1/2の周波数でカウントアップしていきますので、CPUコアの周波数がわかっていれば、時間待ちに使うことが可能です。

    #define SYS_FREQ (40000000L)
    void foo(int index)
    {
     register int i,j;
     i=_CP0_GET_COUNT();
     j=index;
     while(_CP0_GET_COUNT()-i<j);
    }
    int main(void)
    {
    <途中略>
    while(1){
     foo(SYS_FREQ/20);
     mPORTAToggleBits(BIT_0);
     }
    return 0;
    }

    本来、CP0のレジスタ読み出しには専用命令(mfc)が必要なのですが、コンパイラにはじめからマクロ定義が用意されているのでこんな感じで使えます。この例は100ms待ってLEDを反転させます。このレジスタには書き込みもできますが、基本的に読み出し専用で使います。読み出し専用で使えば複数のタスクでも共有できるからです。ただし、40MHz動作の場合には200秒程度でカウンタが1周しますし、上記の使い方だとその半分で正常に動作しなくなりますので要注意です。

    ソースリストはこんな感じです→CountレジスタでLチカ

    このレジスタは特定の区間のCPUの処理時間などの計測にも使えるので結構便利です。デバッガでCPUを停止させるとこのレジスタも停止するので、ブレークポイントを2箇所設定してそれぞれでこのレジスタを見れば処理時間がわかります。