2009/05/25

AVRでPWM

AVRに書き込めるようになったので、LEDをPWM(Pulse With Modulation)で点滅させてみました。

出力はOC0A(PD6ピン)を使います。
まず、DDRDレジスタでPD6は出力にしておきます。

TCCR0A、TCCR0Bの両レジスタで、Fast PWMモード(mode3)、Non-inverting出力、クロック(CLKIO/8)を選択します。OCR0Aには閾値、TIMSK0で割り込みは禁止しています。
この場合、タイマ値(TCNT0)は0~0xFFの間をカウントアップし、値がOCR0Aを以下だとOC0Aは1、OCR0Aを超えると0になります。

#define F_CPU 1000000UL

#include <avr/io.h>
#include <util/delay.h>

void pwm(void)
{
int i;

// OC0A = PD6
DDRD=0xff;

TCCR0A = 0b10000011; // Non inverting, Fast PWM (mode=3)
TCCR0B = 0b00000010; // Fast PWM, clk = CLKIO/8

OCR0A = 0x0;
TIMSK0 = 0x0;

for(;;) {
for(i=0; i<0x80; i++) {
OCR0A = i;
_delay_ms(20);
}
}
}

int main()
{
pwm();
}

2009/05/24

AVR(atmega88)プログラマー完成

AVR用のISPプログラマーが完成し、お初のAVRへの書き込みが出来ました。
シリアルプログラミング専用で、しかもちょっと性能が低いのですが(プロトコルが悪いのか、転送速度は1KB/s出るか出ないかぐらい)、まあ転送サイズも8Kとかそこらで小さいので問題なしとしましょう。これでAVRもつかって行けそうです。


初めてのAVRのLED点滅

2009/05/20

AVR(atmega88)プログラマー自作

ROMライターとZ80はちょっとペンディングにして、お初のAVRで遊んでいました。

これまではPIC一辺倒で、PICベースの基板も発注したし、(1200円とは言え)コンパイラまで買ってしまったので、しばらくPICに執着していました。

ところが、先日のROMライター作成時にsource boostコンパイラのコードサイズ制限(2048ワード)に引っかかってから、開発環境がフリーで揃って制限なしというAVRに少し興味が出てきました。

そこで、以前に購入したAVR(Atmega88)が部品箱に眠っていたので、取り出して試してみることにしました。

最初は、DigilentのJTAG-USBケーブルでプログラミングしようと思ったのですが、専用ソフト(Digilent AVR Device Programmer)で

*** Error - Unable to connect to SPI device
と言われて動きません。結局、ロジアナまで持ち出して確認したところ、JTAGとしては何の問題もなく綺麗に動くのに、AVRプログラマとして操作した時は信号がまったく出ていないということが判ってしまいました。なんだよう>Digilent

仕方が無いので、安いプログラマーでも買おうかと思ったのですが、折角自分で工作するのにいちいち費用を掛けるのも何だなあ、と思って、FT245AM+PIC16F690基板を引っ張り出して簡易プログラマーを作ることにしました。
車輪の再発明上等。

という訳で、夜の工作時間(約2H)で、とりあえず今日はProgram Enableして、シグネチャバイトを読むところまで。


ブレッドボードにAVRを設置、FT232AMボードと接続します。

出た出た。program enableで0x53が返ってきて、
シグネチャバイトを読み出すと
ちゃんと0x1E、0x93、0x0A (atmega88)が読めました。

各デバイスごとのシグネチャバイト(Atmelのマニュアルより引用)

MOSIとMISOをひっくり返して少し悩んだのは秘密だ。

2009/05/17

Z80

某所にて、ちょっと古いZ80を仕入れました。
いまさらではありますが、これと先日のEEPROMを組み合わせたいと思ってます。

2009/05/01

PICKIT2でPIC16F887のICD(インサーキットデバッグ)

PICKIT2にはICD(インサーキットデバッグ)機能が備わっていて、MPLAB IDEと組み合わせてシステムの外側からプログラムのデバッグ(ブレークポイントを張ったり、メモリ内容をダンプしたり)ができます。
ただ、そのためには専用のコネクタで接続してやらないといけないと言ったビミョーな制約があって(コネクタつきで売られているのがPICKIT2のDebugExpress)、ちょっと縁遠いかなあと思ってました。そもそも、PIC程度でデバッガ要らないし、というのもありましたし。

ところが最近、PIC16F887は外付け回路なしでICDできると言うのを耳にしたので、ちょっと試して見たらあっさりとデバッグできました。SourceBoostコンパイラですが、ちゃんとソースコードデバッグも出来ます。
  • 前準備として、PICKit2をターゲットに接続しておきます。
  • MPLAB IDEから、Debugger→Select Tool→PICKit2を選択するとデバッガが起動して、自動的にPICKit2とその先のターゲットPICに接続します。
  • デバッガでよくありがちなラジカセボタン(「停止」、「実行」、「早送り」)といったボタンが出て来ますので、それでプログラムを操作します。

  • ブレークポイントを張って、変数をWatchウィンドウで見ているところです(WatchウィンドウはViweメニューの下のほうにあって、わかり辛いですが)。おかげで、ソースブーストライブラリのバグっぽい挙動を一つ解明することができました。

注意点としては、
  1. 電源をターゲットから取る場合には、Debugger→Settingsの「Use target power always」にチェックを入れます。
  2. ISP用のピン(16F887の場合、RB6とRB7)は、デバッガがアクセスできるように入力に設定しておく必要があります。
  3. たまにうまくターゲットに接続することが出来ないことがあって、そのときは Debugger→Reset→Processor Reset (F6)を選択するとPICにリセットが掛かって直ります。

ROMイレーサ

知り合いから、ROMイレーサを入手しました(サンハヤトのRE-910B)。

左のつまみで所要時間を設定して、スタートボタンを押すと「チチチチ...」という何かが焼けるような音と共にROMが消去されます。

いろいろ調べると、UV-EPROMの再書き込みは20回ぐらいしかできない、と書かれていて少しショックです。あまりお試しばかりはしてられないようです。