忍者ブログ

電子工作/プログラミング
08 2024/091 2 3 4 5 6 78 9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30 10

09.29.07:20

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • 09/29/07:20

07.05.20:06

マイコンのCPU負荷率測定法

ある処理のCPU負荷率を調べたいときは多々ありますよね。オーディオ関係の高負荷処理や、ある割り込み処理がどのくらい負荷率が高いか、通信部の負荷率など...

「マイコン 負荷率 測定」とか調べてもRTOSありきの説明だったりとかで出てこないのです(ただ調べ方が悪いだけなのか?)

ここで紹介ってほどおおげさじゃないですがみなさんはどうやってるんだろうという事も兼ねて自分の方法を書いてみます。

(Ⅰ)オシロスコープを利用した方法
まずマイコンのある一つのピンを測定用端子としてオシロのプローブとつなぎます。あとはそのピンに、測定したいロジックの最初にH終わりにLを出力します。


これでオシロに矩形波が表示されデューティー比が負荷率になります。
またこの方法では測定するロジックの実行時間も分かります。

PR

03.27.00:33

ペリフェラルを利用しないマイコン間シリアル通信

マイコンには多くの通信機能が搭載されています。私が今開発に用いているAVRマイコン(ATMega1284P)にはSPI, TWI, USARTなどの通信機能があります。これらの通信機能はマイコン内部のハードウェア上で行っているのでソフトウェア上でそれを再現するより高速でしょう。
まずペリフェラルを利用しないマイコン間シリアル通信をするメリットを挙げてみます。
  • SPIは1対多の通信をサポートしていますが新しいモジュールと通信するときなど不安要素はなるべくなくしておきたいものです。対象のモジュールはSPIを使いマイコン間通信はソフトウェアで行えば安心です。
  • 今回の通信方法は超低速マイコンと高速マイコンの通信でも動作します。(人 対 マイコンなど笑)
  • I/Oさえあれば動くので楽です
普通に通信するときはペリフェラルを利用すればいいのでソフトウェアで行うことは稀でしょう。

使用するピンですが超低速マイコンと高速マイコンの通信でも動作させるためにDREQピンを使います。
  1. SCK
  2. MISO
  3. MOSI
  4. DREQ
下のように定義しました

//COMピン
#define COM_PORT_OUT PORTB
#define COM_PORT_IN  PINB
#define C_SCK  0
#define C_MISO 1
#define C_MOSI 2
#define C_DREQ 3




回路はお互いに同じピンをつなぐだけです。


あとは下のフローチャートに従って通信します。


参考にAVRのコードを載せておきます

1. Master側


//シリアル送受信関数 Master
// uint8_t COMSendData(uint8_t data);
// r24 : data(u8bit)
.GLOBAL COMSendData
.FUNC COMSendData
COMSendData:

.irp bit, 7,6,5,4,3,2,1,0
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_SCK

;MOSI
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_MOSI
SBRC r24, \bit
SBI _SFR_IO_ADDR(COM_PORT_OUT), C_MOSI

DREQ_LOOP_L\bit:
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_DREQ
RJMP DREQ_LOOP_L\bit

SBI _SFR_IO_ADDR(COM_PORT_OUT), C_SCK

DREQ_LOOP_H\bit:
SBIS _SFR_IO_ADDR(COM_PORT_IN), C_DREQ
RJMP DREQ_LOOP_H\bit

;MISO
CBR r25, (1 << \bit)
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_MISO
SBR r25, (1 << \bit)
.endr

MOV r24, r25

RET
.ENDFUNC

2. Slave側


//シリアル送受信関数 Slave
// uint8_t COMRecvData(uint8_t data);
// r24 : data(u8bit)
.GLOBAL COMRecvData
.FUNC COMRecvData
COMRecvData:


.irp bit, 7,6,5,4,3,2,1,0
SCK_LOOP_L\bit:
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_SCK
RJMP SCK_LOOP_L\bit

CBI _SFR_IO_ADDR(COM_PORT_OUT), C_DREQ

SCK_LOOP_H\bit:
SBIS _SFR_IO_ADDR(COM_PORT_IN), C_SCK
RJMP SCK_LOOP_H\bit

;MOSI
CBR r25, (1 << \bit)
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_MOSI
SBR r25, (1 << \bit)

;MISO
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_MISO
SBRC r24, \bit
SBI _SFR_IO_ADDR(COM_PORT_OUT), C_MISO

SBI _SFR_IO_ADDR(COM_PORT_OUT), C_DREQ
.endr

MOV r24, r25

RET
.ENDFUNC




引数には送信するデータを渡してあげると受信したデータが関数から返ってきます。