電音の工場ブログ

趣味の電子工作を中心としたブログです.音モノの工作が多いです.

ATmega88

ATmega88

久しぶりにAVRネタ。

ATmega88 を内蔵クロックで動かしてナイトライダー的に8つのLEDが流れるプログラム*1を作っていました。

STK500 の上で動かしていたのですが、LEDをPORTBに接続するとPB6/PB7が光りません。PORTDからLEDに出力すると期待通りの動作をします。

ATmega88のPB6/PB7はPCINT/XTAL/TOSCの割付も可能ですが、内蔵RCクロックのfuseにすると(チップデフォルトですが)、特にレジスタを設定しなくてもI/Oになるのかと信じています(ATtiny26L のときにそうだったので)が、実際には違うのでしょうか。あるいはSTK500ボード上の制約なのでしょうか。

どこかAVR掲示板で聞いてみようかしら。制約のないボードを組んで実験するのが先かな。

追記2

AVR FreaksからSTK500の回路図を探し出してみてみたところ、ATmega88を挿すソケットにはPB6/PB7が結線されていないことが判明。これでは光りませんね*2

結論

PORTBピンヘッダやエクステンションボード用コネクタいずれからもATmega88のPB6/PB7は取り出せませんのでご注意を。

追記 (追記2 との時間の前後関係にご注意を)

お、r0r0さんのお申し出が!

興味のある方が他にもいるかもしれないので、ソースを晒してみます。

以下ソース。

 /*
	Target:		ATmega88
 */

#include 
#include 
#include 
#include 

volatile uint8_t Tbl[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 };
volatile uint16_t Tnum = 977;

 /*
	F_CPU =  1.00MHz
 */
SIGNAL (SIG_OVERFLOW1)
{
	static uint8_t idx = 0;

	TCNT1 = 65536 - 50 - 1024 + Tnum;

//	PORTB = Tbl[ idx++ ];
	PORTD = Tbl[ idx++ ];
	if (idx > 7)
		idx = 0;

}

void init_io(void)
{
 /*
	DDRB = 0xFF;		// Port B output
	PORTB = 0;
 */
	DDRD = 0xFF;		// Port D output
	PORTD = 0;

	/* timer1 initialization */
	TCNT1 = 65536 - 50 - 1024 + Tnum;
	TCCR1B = (1<1<// timer1 prescaled by 1/1024

	// timer1 interrupt
	TIMSK1 = (1<int main(void)
{
	init_io();
	sei();

	while(1)
		;
}

*1:とある製作の予備実験。

*2:「回路図と実ボードが違うかもしれないじゃないか」というのは言いっこなしで。