昨日のブレッドボードですが、
AVR ATtiny13Aを使ったナイトライダーです。
ソースコードはPICのと基本は同じです。
#define で少し見易くしてみました。
/*
* 5 LED rotation
*
* Created: 2013/05/27 9:53:49
* Author: ikkei
* Knight rider
* for ATtiny13A
* FUSE : FF 79
sink output
PB2--LED1
PB1--LED2
PB0--LED3
PB4--LED4
PB3--LED5
*/
#include<avr/io.h>
#include <avr/pgmspace.h>
#define LED_0____ 0x04
#define LED__0___ 0x02
#define LED___0__ 0x01
#define LED____0_ 0x10
#define LED_____0 0x08
#define PAT_NUM 20
//const unsigned char led_patt[PAT_NUM] = {
const unsigned char led_patt[PAT_NUM] PROGMEM = {
LED_0____, // 1
LED_0____, // 2
LED_0____, // 3
LED__0___, // 4
LED__0___, // 5
LED___0__, // 6
LED____0_, // 7
LED____0_, // 8
LED_____0, // 9
LED_____0, // 10
LED_____0, // 11
LED_____0, // 12
LED_____0, // 13
LED____0_, // 14
LED____0_, // 15
LED___0__, // 16
LED__0___, // 17
LED__0___, // 18
LED_0____, // 19
LED_0____, // 20
};
unsigned char pat_cnt;
int main(void)
{
DDRB = 0x1F; // PORTB output
TCCR0A = 0x02; // 0000xx10 CTC mode
TCCR0B = 0x05; // 00xx0101 4,8MHz/1024 = 213us
OCR0A = 234-1; // 213us x 234 = 50ms
pat_cnt = 0;
while(1){
if (TIFR0 & 1<<OCF0A){ // time up
TIFR0 |= 1<<OCF0A; // flag clear
//PORTB = ~led_patt[pat_cnt];
PORTB = ~pgm_read_byte_near( &led_patt[pat_cnt] );
pat_cnt++;
pat_cnt %= PAT_NUM;
}
}
}
不等号は表示が乱れるので、全角に変えてあります。
配列の部分をフラッシュメモリにするためにPROGMEM を使っています。
これはAVR特有の作法ですね。
コメントアウトしてある方に戻すと、RAM上になります。