0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

マイクロマウス入門 基本編1 - PiCoClassic3

Last updated at Posted at 2020-09-06

概要

マイクロマウス学習キット(Pi:Co Classic3)を使用したプログラミング入門編です。C言語で、各部品の操作方法を学習します。

注意事項
学習キットで使用するバッテリーは、バッテリー電圧が9Vを下回ると使用できなくなります。学習キット付録のサンプルプログラムには、バッテリー残量をLEDで表示するプログラムが付いていますが、書籍のプログラムはバッテリー残量を確認できないため、長時間の利用やこまめな充電など細心の注意が必要です。

プログラム

LED

この章では、Pi:Co Classic3に搭載されているLEDの使い方を理解しましょう。

PiCoClassic3.c
# include "iodefine.h"

void init_led(void);
void set_led(unsigned char data);
void main(void);


void main(void)
{
  int i;
	
  init_led();

  while(1)
  {
    PORTB.PODR.BIT.B0 = 1;
    PORTA.PODR.BIT.B6 = 1;
    PORTA.PODR.BIT.B4 = 1;
    PORTA.PODR.BIT.B0 = 1;
    for(i=0; i<0xFFF; i++);
    PORTB.PODR.BIT.B0 = 0;
    PORTA.PODR.BIT.B6 = 0;
    PORTA.PODR.BIT.B4 = 0;
    PORTA.PODR.BIT.B0 = 0;
    for(i=0; i<0xFFF; i++);
  }
}


void init_led(void)
{
  PORTB.PDR.BIT.B0 = 1;
  PORTA.PDR.BIT.B6 = 1;
  PORTA.PDR.BIT.B4 = 1;
  PORTA.PDR.BIT.B0 = 1;
}

void set_led(unsigned char data)
{
  PORTB.PODR.BIT.B0 = data&0x01;
  PORTA.PODR.BIT.B6 = (data>>1)&0x01;
  PORTA.PODR.BIT.B4 = (data>>2)&0x01;
  PORTA.PODR.BIT.B0 = (data>>3)&0x01;
}

解説

実行手順

  1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
  2. PODRレジスタで、出力ポートへの出力値を設定します。

演習

  1. 各LEDが、どのポート番号とビットフィールドに対応しているか調べてください。
  2. set_led関数を使用して、左から数えて偶数列だけ点灯するプログラムを作成してください。

Buzzer

この章では、Pi:Co Classic3に搭載されているBuzzerの使い方を理解しましょう。

PiCoClassic3.c
# include "iodefine.h"

void init_buzzer(void);
void main(void);


void main(void)
{
  int i;

  init_buzzer();

  while(1)
  {
    PORTB.PDR.BIT.B3 = 1;
    for(i=0; i<0x3F; i++);
    PORTB.PDR.BIT.B3 = 0;
    for(i=0; i<0x3F; i++);
  }
}


void init_buzzer(void)
{
  PORTB.PDR.BIT.B3 = 1;
}

解説

実行手順

  1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
  2. PODRレジスタで、出力ポートへの出力値を設定します。
  3. 学習キットで利用するBuzzerは、ONとOFFの振動で音を鳴らします。そのため、一定間隔で出力ポートへの出力値をを切り替えます。

Switch

この章では、Pi:Co Classic3に搭載されているSwitchの使い方を理解しましょう。

PiCoClassic3.c
# include "iodefine.h"

void init_led(void);
void set_led(unsigned char data);
void init_buzzer(void);
void init_switch(void);
void main(void);


void main(void)
{
  int mode=1;
  int i;

  init_led();
  init_buzzer();
  init_switch();

  while(1)
  {
    set_led(mode);

    if(!PORTC.PIDR.BIT.B2)
    {
      for(i=0; i<0xFFF; i++);
      mode++;
      if(mode>4) mode=4;
      while(!PORTC.PIDR.BIT.B2);
      for(i=0; i<0xFFF; i++);
    }

    if(!PORT3.PIDR.BIT.B1)
    {
      for(i=0; i<0xFFF; i++);
      mode--;
      if(mode<1) mode=1;
      while(!PORT3.PIDR.BIT.B1);
      for(i=0; i<0xFFF; i++);
    }

    if(!PORTC.PIDR.BIT.B3)
    {
      break;
    }
  }
  
  while(1)
  {
    PORTB.PDR.BIT.B3 = 1;
    for(i=0; i<0x3F; i++);
    PORTB.PDR.BIT.B3 = 0;
    for(i=0; i<0x3F; i++);
  }
}


void init_switch(void)
{
  PORTC.PDR.BIT.B2 = 0;
  PORT3.PDR.BIT.B1 = 0;
  PORTC.PDR.BIT.B3 = 0;
}

void init_led(void)
{
  PORTB.PDR.BIT.B0 = 1;
  PORTA.PDR.BIT.B6 = 1;
  PORTA.PDR.BIT.B4 = 1;
  PORTA.PDR.BIT.B0 = 1;
}

void set_led(unsigned char data)
{
  PORTB.PODR.BIT.B0 = data&0x01;
  PORTA.PODR.BIT.B6 = (data>>1)&0x01;
  PORTA.PODR.BIT.B4 = (data>>2)&0x01;
  PORTA.PODR.BIT.B0 = (data>>3)&0x01;
}

void init_buzzer(void)
{
  PORTB.PDR.BIT.B3 = 1;
}

解説

実行手順

  1. PDRレジスタで、入出力ポートを設定します。出力ポートは1、入力ポートは0、デフォルトでは入力ポートが指定されています。
  2. PIDRレジスタで、入力ポートの状態を取得します。
  3. Switchを使用する際は、チャタリング対策を実装します。

プログラム解説
4個のLEDで、4ビット16通りの表現ができます。実際には、全消灯を除いた15通りでプログラムの実行モードを表現します。
実行モードの選択は、左右のスイッチで行います。中央のスイッチで、モード選択を確定し、選択されたプログラムへ処理が流れていきます。


演習

  1. 各Switchが、どのポート番号とビットフィールドに対応しているか調べてください。
  2. チャタリング対策のループ処理を、ブザーに変更してください。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?