LECTURE 1 ATmega8535 および使用環境について

○ はじめに

本文書では、Atmel 社 が製造している 8 ビットマイコンのうち、ATmega8535 というマイコンを使います。ここでは以降のページでサンプルプログラムを説明する前に、ATmega8535 の機能概要や本文書で使用するハードウェア/ソフトウェアについて簡単に説明します。

○ 機能概要

ATmega8535 の主な特徴および機能は以下の様になります(全てではありません)。

  • RISC アーキテクチャ
  • 32 個の汎用レジスタ
  • 8K バイトのプログラム用フラッシュメモリ
  • 512 バイトのデータ保存用 EEPROM
  • 512 バイトのデータ用 SRAM
  • 2 つの 8 ビットタイマ/カウンタおよび 1 つの 16 ビットタイマ/カウンタ
  • 4 つの PWM 出力
  • 10 ビット A/D 変換器
  • シリアル USART
  • ウォッチドッグタイマ
  • アイドル等の低消費電力動作モード
  • 動作電圧 4.5 〜 5.5V
  • 動作速度 0 〜 16 MHz

○ ヒューズビット

ヒューズビットとは、基本的な設定値を格納するための領域です(ハードウェア的にどこに用意されているのか分かっていません…)。本文書の範囲ではほとんど必要ないのですが、唯一外部クロックで動作させるために設定を行うためここで説明します。

ヒューズ上位バイトと下位バイトがあり、本文書では下位バイトを設定します(追記等で上位バイトが必要になった場合は、説明を追記します)。下位バイトの内容は以下の通りです。

名称 ビット番号 内容 デフォルト値
BODLEVEL 7 低電圧検出器(BOD)検出電圧選択 1
BODEN 6 低電圧検出器(BOD)有効/無効 1(BOD無効)
SUT1 5 起動時間選択 1
SUT0 4 0
CKSEL3 3 クロック種別選択 0
CKSEL2 2 0
CKSEL1 1 0
CKSEL0 0 1

SUT1 - 0 は起動時の遅延時間を選択します。後述の CKSEL3 - 0 の説明にて記述していますが、本文書では SUT1 - 0 = 11 としました。クロック種別は、CKSEL3 - 0 の組み合わせによって以下の様に決まります。表中に記述している通り、本文書では CKSEL3 - 0 = 1111 としました。

CKSEL3 - 0 クロック種別
0000 外部クロック信号
0100 - 0001 校正付き内臓RC発振器(デフォルトは 0001 で 1.0MHz 内臓RC発振器の使用となります)
1000 - 0101 外部RC発振器
1001 外部低周波数水晶振動子
1111 - 1010 外部水晶振動子/セラミック発振子。ヒューズ上位バイトの CKOPT ビット(デフォルト値1)の値と CKSEL3 - 1 に応じて、以下の様に動作可能周波数範囲が決まります

CKOPT CKSEL3 - 1 周波数範囲
1 101 0.4 - 0.9MHz
110 0.9 - 3.0MHz
111 3.0 - 8.0MHz
0 111 - 101 1.0MHz 以上

本文書の回路では 8MHz の外部水晶振動子を使い、ヒューズ上位バイトはデフォルト設定(CKOPT = 1)で扱うことにするため、CKSEL3 - 1 = 111 とします。

また、外部振動子の種類と、低消費電力動作モードからの起動遅延時間あるいはリセットからの遅延時間に応じて CKSEL0 と SUT1 - 0 を選択する必要があります。本文書では、外部水晶振動子+低速立ち上がり電源使用時の組み合わせである CKSEL0 = 1、SUT1 - 0 = 11 SUT1 - 0 = 10 SUT1 - 0 = 11 としました。電源の立ち上がり時間は実は不明なのですが余裕がある方を選びました。

2008/05/25 追記。英訳しようと思ってデータシートをあらためて見てみたのですが、低速立ち上がり電源使用時の SUT1 - 0 は 10 とすべきでした。SUT1 - 0 の組み合わせは、BOD(低電圧検出リセット)有効時は 00、高速立ち上がり電源使用時は 01(リセット時に 4.1ms 遅延)、低速立ち上がり電源使用時は 10(リセット時に 65ms 遅延)が推奨されています。11 は予約値でした…サンプルの Makfile は修正しておきました。

2008/05/26 再修正です。昨日の修正自体が間違っていました…外部水晶振動子+低速立ち上がり電源使用時は、SUT1 - 0 = 11 のままで O.K. でした。勢い余って外部クロック信号使用時の設定を見てました。ご迷惑をおかけしてすみません。サンプルは再修正しておきました。

ヒューズビットの設定は、後述する uisp というオープンソースソフトを用いて行います。

○ 使用するハードウェア

本文書では、PDIP パッケージの ATmega8535 を使用します。

ATmega8535(PDIP)

↓が実験用に作成した回路です。

実験用回路の写真

↑の回路図は こちら に置いておきます。本実験用回路では、8MHz の外部水晶振動子を使用します。筆者作成の回路では水晶振動子用のコンデンサ(回路図上の 22pF のコンデンサ x 2) が取り付けられていませんが、クロックの安定のためには付けるべきですのでみなさんは付けてください…

ATmega8535 では最大 16MHz で動作させることができますが、8MHz から周波数を変更する場合は、前述のヒューズビットの設定および各サンプルプログラムにおけるクロック周波数依存部分を書き換えて使用してください。

なお、電源は 5V 出力のスイッチング電源(AC アダプタ)を使いました。

↓は実験用回路と PC を接続するための DAPA (Direct AVR Parallel Access) ケーブルです。

DAPA ケーブルの写真

AVR と PC の接続インタフェースはいろいろある様ですが、本方式が一番簡単なのでこれを使っています。DAPA ケーブルの配線図は こちら においておきます。DAPA ケーブルは、PC のパラレルポートと AVR の MOSI/MISO/SCK/RESET ピン(PDIP パッケージの場合はそれぞれ 6/7/8/9 番ピン)を接続します。このケーブル経由でプログラムのアップロード等を行います。MOSI/MISO/SCK/RESET ピンによるインタフェースをシリアルインタフェースと呼び、シリアルインタフェースを用いた AVR のプログラミングをシリアルプログラミングと言います。本文書では、シリアルプログラミングには後述する uisp というオープンソースソフトを使います。

○ 使用するソフトウェア

本文書では、Linux ® 上で avr-gcc を用いて C 言語によりプログラムを作成します。具体的には以下のソフトウェアを使用します。1 - 3 は導入順を表します。uisp は導入の順番は特に関係ありません。

  1. GNU Binutils

    アセンブラやリンカ等の基本的なプログラミングツールを提供するソフトウェアです。本文書ではバージョン 2.17 を使用します。ダウンロード後

    cd [展開した binutils のトップ]
    ./configure --target=avr --program-prefix='avr-' --disable-nls; make
    
    

    としてコンパイル後、root でインストールしてください。

  2. GCC

    GNU が開発しているコンパイラコレクションです。本文書ではバージョン 4.1.2 を使用します。ダウンロード後

    cd [展開した gcc のトップ]
    ./configure --target=avr --program-prefix='avr-' --enable-languages=c \
               --with-dwarf2 --disable-nls --disable-libssp; make
    
    

    としてコンパイル後、root でインストールしてください。

  3. AVR LibC

    AVR アーキテクチャで使用可能な libc を提供するソフトウェアです。本文書ではバージョン 1.4.5 を使用します。ダウンロード後

    cd [展開した avr-libc のトップ]
    ./configure --build='./config.guess' --host=avr; make
    
    

    としてコンパイル後、root でインストールしてください。

  4. uisp

    プログラムのアップロード/ヒューズビットの設定等の PC と AVR の間の通信作業を行ってくれるソフトウェアです。本文書ではバージョン 20050207 を使用します。ダウンロード後

    cd [展開した uisp のトップ]
    ./configure; make
    
    

    としてコンパイル後、root でインストールしてください。