・ホタルのようにじわーっと光っては消える3つのLEDを楽しむイルミネーション。
・押しボタンスイッチを押すとLEDが消灯し、再びスイッチを押すとまた点灯する。
AVRマイコン ATTINY2313
炭素皮膜抵抗器 150Ω(茶緑茶金)×3本
タクトスイッチ DTS-6
積層セラミックコンデンサ 0.1μF (104)
発光ダイオード 直径3mmまたは直径5mm、順方向電圧VF=2V程度のもの 3個
ジャンパ線 2本
バッテリースナップ
電池ボックス 単3×2本 バッテリースナップ型
/*
* int1-3port-pwm-led-tiny2313.c
*
* Created: 2015/03/15
* Author: kaimu
*/
/*
* INPUT
* PD3/INT1 (PIN#7) : weak pull-up push button switch (0:PUSH, 1:RELEASE)
*
* OUTPUT
* PB0,1,2,3,4,5,6,7 : LED0-7 ( 1:ON, 0:OFF)
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>
#define S_GO 0x01
#define S_SLEEP 0x02
volatile uint8_t STAGE = S_GO;
ISR(INT1_vect){
switch ( STAGE ) {
case S_GO :
STAGE = S_SLEEP;
break;
case S_SLEEP :
STAGE = S_GO;
break;
default:
STAGE = S_SLEEP;
}
}
void wait(volatile unsigned long i)
{
while(i-- > 0);
}
void initIo(void)
{
PORTD = 0xff;
DDRD = 0b01110111; // PD3(INT1):Input, others :Output
PORTB = 0xff;
DDRB = 0xff;
MCUCR |= (1<<ISC11); // INT1 falling edge
GIMSK |= (1<<INT1); // INT1 interrupt enable
sei();
}
void showPattern(uint8_t p, unsigned long i)
{
while (i-- > 0) {
PORTB = p;
}
}
void showPwmPattern(uint8_t p, volatile unsigned long period, volatile unsigned long high, volatile unsigned long low)
{
while (period-- > 0) {
PORTB = p; // LED ON
wait(high);
PORTB = 0x00; // LED OFF
wait(low);
}
}
void showPwmRGB(uint8_t red0, uint8_t red1, uint8_t green0, uint8_t green1, uint8_t blue0, uint8_t blue1, volatile unsigned long duty)
/*
* red0, green0, blue0 : 1st light pattern 0... off, 1...on
* red1, green1, blue1 : 2nd light pattern 0... off, 1...on
* duty : duty cycle 0-1000
*/
{
PORTB = (red0<<7) | (green0<<5) | (blue0<<6);
wait(duty);
PORTB = (red1<<7) | (green1<<5) | (blue1<<6);
wait(1000L - duty);
}
int main(void)
{
volatile unsigned long i;
initIo();
STAGE = S_GO;
while (1) {
switch (STAGE) {
case S_GO :
for (i = 0L; i < 1000 && STAGE == S_GO ; i += 20) {
showPwmRGB(0, 0, 1, 0, 0, 0, i);
}
for (i = 0L; i < 1000 && STAGE == S_GO ; i += 20) {
showPwmRGB(0, 0, 1, 1, 1, 0, i);
}
for (i = 0L; i < 1000 && STAGE == S_GO ; i += 20) {
showPwmRGB(1, 0, 1, 1, 1, 1, i);
}
for (i = 0L; i < 1000 && STAGE == S_GO ; i += 10) {
showPwmRGB(1, 1, 1, 1, 1, 1, 1000L);
}
for (i = 0L; i < 1000 && STAGE == S_GO ; i += 20) {
showPwmRGB(1, 0, 1, 0, 1, 0, 1000L - i);
}
break;
case S_SLEEP :
// GOTO SLEEP
showPwmRGB(0, 0, 0, 0, 0, 0, 100);
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode();
break;
default :
STAGE = S_SLEEP;
}
}
return 0;
}
# AVR-GCC Makefile
PROJECT=int1-3port-pwm-led-tiny2313
SOURCES=$(PROJECT).c
CC=avr-gcc
OBJCOPY=avr-objcopy
MMCU=attiny2313
TARGETDEV=t2313
CFLAGS=-mmcu=$(MMCU) -Wall
$(PROJECT).hex: $(PROJECT).out
$(OBJCOPY) -j .text -O ihex $(PROJECT).out $(PROJECT).hex
$(PROJECT).out: $(SOURCES)
$(CC) $(CFLAGS) -I./ -o $(PROJECT).out $(SOURCES)
program: $(PROJECT).hex
sudo avrdude -p $(TARGETDEV) -P usb -c avrispmkII -e -U flash:w:$(PROJECT).hex
clean:
rm -f $(PROJECT).out
rm -f $(PROJECT).hex