Arduinoで実験 (Arduino IDE で ATTiny 13A の開発)

2013/12/02

ATTiny13A の開発は Atmel Studio や Bascom-AVR でやっているが、Arduino ならこのコマンドなんだけどといった場合調べるのがおっくうになる。

どうやら Arduino IDE の環境ファイルを修正するとコンパイルできるようなので、開発環境を作ってみる。

とは言っても、調子こいて digitalWrite 等の関数を使いまくるとすぐに 1k byte を超えるので使い方には注意が必要だ。

プログラムの転送は IDE から行わず Atmel Studio 等で行うのでコンパイルのみ。(そこまで、環境を整える気がしない。)


arduino-1.0.1\hardware\arduino\cores\arduino\wiring.c の約44行目を以下の様に修正する。

#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny13__) 

arduino-1.0.1\hardware\arduino\boardss.txt の最下行に以下を追加する。

############################################ 
t13.name=ATtiny13(int(RC) 
t13.upload.using=arduino:avrispmkii 
t13.upload.maximum_size=1024 

t13.bootloader.low_fuses=0x6a 
t13.bootloader.high_fuses=0xff 
t13.bootloader.path=dummy 
t13.bootloader.file=dummy.hex 
t13.bootloader.unlock_bits=0x3F 
t13.bootloader.lock_bits=0x3F 

t13.build.mcu=attiny13 
t13.build.f_cpu=9600000L 
t13.build.core=arduino 
t13.build.variant=t13 

############################################

arduino-1.0.1\hardware\arduino\variants に t3 フォルダを作成、t3 フォルダ内に pins_arduino.h を以下の内容で作成する。

/* 
pins_arduino.h - Tiny13 
Mar 25 2012 by coredeino 

*/ 

#ifndef Pins_Arduino_h 
#define Pins_Arduino_h 

#include <avr/pgmspace.h> 

#define NUM_DIGITAL_PINS 6 
#define NUM_ANALOG_INPUTS 4 

//define digitalPinHasPWM(p) ((p) == 0 || (p) == 1) 

const static uint8_t MOSI = 0; 
const static uint8_t MISO = 1; 
const static uint8_t SCK = 2; 


#define NOT_A_PIN 0 
#define NOT_A_PORT 0 

#define NOT_ON_TIMER 0 
#define TIMER0A 1 
#define TIMER0B 2 


const static uint8_t A0 = 5; 
const static uint8_t A1 = 3; 
const static uint8_t A2 = 4; 
const static uint8_t A3 = 2; 

/* 
#define TIMSK TIMSK0 
#define TIFR TIFR0 
*/ 

#ifdef ARDUINO_MAIN 

// ATMEL ATTINY13 / ARDUINO 
// 
// +-\/-+ 
// ADC0 (d5/a0) RESET PB5 1| |8 Vcc 
// ADC3 (d3/a1) PB3 2| |7 PB2 (d2/a3) ADC1 SCK 
// ADC2 (d4/a2) PB4 3| |6 PB1 (d1)* MISO OC0B 
// GND 4| |5 PB0 (d0)* MOSI OC0A 
// +----+ 


#define PB 1 

#define REPEAT8(x) x, x, x, x, x, x, x, x 
#define BV0TO7 _BV(0), _BV(1), _BV(2), _BV(3), _BV(4), _BV(5), _BV(6), _BV(7) 
#define BV7TO0 _BV(7), _BV(6), _BV(5), _BV(4), _BV(3), _BV(2), _BV(1), _BV(0) 



const uint16_t PROGMEM port_to_mode_PGM[] = { 
NOT_A_PORT, 
(uint16_t) &DDRB, 
}; 

const uint16_t PROGMEM port_to_output_PGM[] = { 
NOT_A_PORT, 
(uint16_t) &PORTB, 
}; 

const uint16_t PROGMEM port_to_input_PGM[] = { 
NOT_A_PIN, 
(uint16_t) &PINB, 
}; 

const uint8_t PROGMEM digital_pin_to_port_PGM[] = { 
PB, /* 0 */ 
PB, 
PB, 
PB, 
PB, 
PB, // 5 

}; 

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] = { 
_BV(0), /* 0, port B */ 
_BV(1), 
_BV(2), 
_BV(3), /* 3 port B */ 
_BV(4), 
_BV(5), 

}; 

const uint8_t PROGMEM digital_pin_to_timer_PGM[] = { 
TIMER0A, /* OC0A */ 
TIMER0B, 
NOT_ON_TIMER, 
NOT_ON_TIMER, 
NOT_ON_TIMER, 
NOT_ON_TIMER, 
}; 

#endif 
#endif

シリアル通信等、ハードウェアがサポートしていないコマンドは使用できない。

Pinmode の Inut_Pullup は使い方が特殊。

すぐにメモリが足りなくなるので直接ポートをたたいた方が良い。