電子工作etc (ストレッチ用タイマー2)

2013/07/25


◆ 製作の動機

これまでのストレッチタイマーでも大変重宝しているのだが、ラーメンタイマーとして使用するには LED パターンが判りづらく、秋月のミニ I2C 液晶を買ったので表示機能付きのタイマーを作成しようと思った。

今まではイヤホンでの使用のみだったが、イヤホン端子を外した時にはスピーカーからビープ音を出すようにしたい。

電源もボタン電池ではなく充電機能付きのリチウムイオンポリマー電池を入れたい。(サイズ的に無理ならボタン電池にする。)

マイコンは、ATtiny13A のままだがソフトウェアで I2C 制御できるようにする。

BASCOM-AVR でいろいろと試したがうまくいかないので Atmel Studio 6.0 を使用した。

とりあえず I2C 液晶の制御サンプルが下記のコードです。ほぼ S2 さんのコードを無許可で丸移ししました(ゴメンナサイ)。

//  StretchingTimer2.c
//        Ttiny13A

#include <avr/io.h>
#include <util/delay.h>

// defines ***********************************************************************
#define LCD_ADDR         (0x3E)
#define I2C_SDA_PIN      PB3
#define I2C_SCL_PIN      PB4

// defines [MACRO] ***************************************************************
#define LCD_CURSOR_CMD(x,y)   (0x80 | (y*0x40+x))
#define I2C_SDA_PIN_BV        _BV(I2C_SDA_PIN)
#define I2C_SCL_PIN_BV        _BV(I2C_SCL_PIN)
#define _I2C_SDA_HIGH         (PORTB |= I2C_SDA_PIN_BV)
#define _I2C_SDA_LOW          (PORTB &= ~I2C_SDA_PIN_BV)
#define _I2C_SCL_HIGH         (PORTB |= I2C_SCL_PIN_BV)
#define _I2C_SCL_LOW          (PORTB &= ~I2C_SCL_PIN_BV)

// function **********************************************************************
inline static void I2C_init() {
    DDRB |= I2C_SDA_PIN_BV;
    DDRB |= I2C_SCL_PIN_BV;

    _I2C_SCL_HIGH;
    _I2C_SDA_HIGH;
}

void I2C_start() {
    _I2C_SDA_HIGH;
    _delay_us(4);
    _I2C_SCL_HIGH;

    _delay_us(4);
    _I2C_SDA_LOW;
    _delay_us(4);
    _I2C_SCL_LOW;
}

void I2C_stop() {
    _I2C_SDA_LOW;
    _delay_us(4);
    _I2C_SCL_HIGH;
    _delay_us(4);
    _I2C_SDA_HIGH;
    _delay_us(4);
}

uint8_t I2C_write(uint8_t data) {
    uint8_t temp;
     for(temp=0x80; temp; temp>>=1) {
        if(data & temp) _I2C_SDA_HIGH;
        else _I2C_SDA_LOW;
        _delay_us(3);
        _I2C_SCL_HIGH;
        _delay_us(4);
        _I2C_SCL_LOW;
    }

    DDRB &= ~I2C_SDA_PIN_BV;

    _delay_us(4);
    temp=PINB;
    _I2C_SCL_HIGH;
    _delay_us(4);

    _I2C_SCL_LOW;

    DDRB |= I2C_SDA_PIN_BV;

    if(temp & I2C_SDA_PIN_BV) {
        return 1;
    }
    return 0;
}

void LCD_command(uint8_t data) {
    I2C_start();
    I2C_write(LCD_ADDR<<1);
    I2C_write(0);
    I2C_write(data);
    I2C_stop();

    _delay_us(50);
}

void LCD_write(uint8_t data) {
    I2C_start();
    I2C_write(LCD_ADDR<<1);
    I2C_write(0x40);
    I2C_write(data);
    I2C_stop();

    _delay_us(50);
}

int main(void) {
// LCD initialize
    I2C_init();
    _delay_ms(50);

    LCD_command(0x38);    //function set
    LCD_command(0x39);    //function set
    LCD_command(0x14);    //internal OSC
    LCD_command(0x73);    //contrast 1
    LCD_command(0x5F);    //contrast 2
    LCD_command(0x6A);    //follower control (or 0x6C)
    _delay_ms(300);

    LCD_command(0x38);    //function set
    LCD_command(0x0C);    //display on
    LCD_command(0x01);    //display clear
    _delay_ms(100);

//print text
    LCD_write('T');
    LCD_write('e');
    LCD_write('s');
    LCD_write('t');

    LCD_command(LCD_CURSOR_CMD(2,1));
    LCD_write('1');
    LCD_write('2');
    LCD_write('3');


    while(1) {
    }
}