Arduinoのライブラリを作る その3(PWM)

pwm.h

#ifndef _PWM_H
#define _PWM_H

class Pwm{
public:
  void PWM16_init();
  void PWM16_write(int percentage);
};

#endif

pwm.cpp

#include <avr/io.h>
#include "pwm.h"

void Pwm::PWM16_init(){
  DDRB |= _BV(PORTB1);//For PWM output
  TCCR1A = _BV(COM1A1)|_BV(WGM11); //Compare match A enable,Fast PWM (ICR1 as TOP)
  TCCR1B = _BV(WGM13)|_BV(WGM12)|_BV(CS10); //Fast PWM (ICR1 as TOP),Clock Source enable
  ICR1 = 65000;
}

void Pwm::PWM16_write(int percentage){
  int value = 65000 * percentage/(float)100;
  OCR1A = value;
}

main.cpp

#include "pwm.h"
#include <util/delay.h>

int main(void){
  Pwm p;
  p.PWM16_init();
  int i;
  while(1){
    for(i=0;i<10;i++){
      p.PWM16_write(i*10);
      _delay_ms(200);
    }
    for(i=10;i>0;i--){
      p.PWM16_write(i*10);
      _delay_ms(200);
    }
  }
  return 0;
}

Arduinoの同等コード

void setup(){
  pinMode(8,OUTPUT);
}
void loop(){
  for(int i=0;i<10;i++){
    analogWrite(8,255/10*i);
  }
  for(int i=10;i>0;i--){
    analogWrite(8,255/10*i);
  }
}

Arduino同等コードのメモリ使用状況

AVR Memory Usage
----------------
Device: atmega328p

Program:    1100 bytes (3.4% Full)
(.text + .data + .bootloader)

Data:          9 bytes (0.4% Full)
(.data + .bss + .noinit)

cppのメモリ使用状況

AVR Memory Usage
----------------
Device: atmega328p

Program:    1054 bytes (3.2% Full)
(.text + .data + .bootloader)

Data:          0 bytes (0.0% Full)
(.data + .bss + .noinit)

プログラム領域は余り変わらない。本質的に同じことをやってるということだろう。
相変わらずArduino側ではSRAMの9バイトが消費されている。