ATMega32U4ボード

とりあえずバーLED点灯させてみた。

//
// LEDS
//
// PB0..7 PD0..7 PF4..7
//
#include "avr/io.h"
#include "avr/wdt.h"
#define F_CPU 16000000UL // 16MHz
#include "util/delay.h"
#include <stdint.h>

void init_regs(){
// clock
  CLKPR = 0x80;
  CLKPR = 0x00;
// watchdog
  wdt_disable();
// jtag disable
  MCUCR = 0x80;
  MCUCR = 0x80; // write twice to disable.
// ports
  DDRB = 0xff; // set all pins@PORTB to out
  DDRD = 0xff;
  DDRF = 0xf0;
  PORTB = 0;
  PORTD = 0;
  PORTF = 0;
}

#define SPEED_A 3
#define SPEED_B 7
#define NUM_LEDS 20
#define LOOP_COUNT 420 // LCM of SPEED_[AB] and NUM_LEDS

int main(){
  uint16_t i;
  uint8_t a=0, b=0, a0=0, b0=0;
  uint8_t loc_a, loc_b;

  init_regs();

  while(1){
    for( i=0; i < LOOP_COUNT; ++i ) {
      uint32_t lgt = 0;

      ++a0;
      if( a0 >= SPEED_A ) {
        a0 = 0;
        ++a;
      }
      if( a >= 2*NUM_LEDS ) a=0;
      loc_a = (a>=NUM_LEDS)?(2*NUM_LEDS-1-a):a;
      lgt |= 1L<<loc_a;

      ++b0;
      if( b0 >= SPEED_B ) {
        b0 = 0;
        ++b;
      }
      if( b >= 2*NUM_LEDS ) b=0;
      loc_b = (b>=NUM_LEDS)?(2*NUM_LEDS-1-b):b;
      lgt |= 1L<<loc_b;

      PORTB = ((lgt    )&0xff);
      PORTD = ((lgt>> 8)&0xff);
      PORTF = ((lgt>>12)&0xf0);

      _delay_ms(50);
    }
  }
}