adc.h
#ifndef _ADC_H_ #define _ADC_H class Adc { public: void adc_init(); int adc_conv(int pin); }; #endif
adc.cpp
#include "adc.h" #include <avr/io.h> #define sbi(BYTE,BIT) BYTE|=_BV(BIT) #define cbi(BYTE,BIT) BYTE&=~_BV(BIT) void Adc::adc_init(){ ADMUX |= _BV(REFS0);//AVCC as Vref ADCSRA |= _BV(ADEN)|_BV(ADSC);//ADC enable, Start conversation; } int Adc::adc_conv(int pin){ int res; ADMUX = _BV(REFS0)|pin; cbi(ADCSRA,ADIF); sbi(ADCSRA,ADSC); loop_until_bit_is_set(ADCSRA,ADIF); res = ADCL; res += (ADCH<<8); return res; }
main.cpp
#include "usart.h" #include "adc.h" #include <util/delay.h> #include <stdlib.h> int main(void){ Usart u; int ubrr = u.getUBRR(9600); u.USART_init(ubrr); u.putString("Hello!\n"); Adc a; a.adc_init(); int data; char buf[10]; while(1){ data = a.adc_conv(0); itoa(data,buf,10); u.putString(buf); u.putString("\n"); _delay_ms(500); } return 0; }
ライブラリ化する前のコード
void setup(){ Serial.begin(9600); Serial.println("Hello"); } void loop(){ int val = analogRead(A0); Serial.println(val); delay(1000); }
ライブラリ化する前(.ino)のメモリ使用状況
AVR Memory Usage ---------------- Device: atmega328p Program: 2666 bytes (8.1% Full) (.text + .data + .bootloader) Data: 203 bytes (9.9% Full) (.data + .bss + .noinit)
cppのメモリ使用状況
AVR Memory Usage ---------------- Device: atmega328p Program: 734 bytes (2.2% Full) (.text + .data + .bootloader) Data: 10 bytes (0.5% Full) (.data + .bss + .noinit)