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) ; }