2012年7月14日土曜日

AVR ダイナミック点灯

Cです。

「ダイナミック点灯」とはめちゃくちゃ早い速度で、
点灯する物を切り替える事によって、複数の物が点灯しているように見せること。

下の写真は3桁表示されているように見えるが、実際には
同時に表示されているのは1桁で人間どもには、確認できない速さで
切り替わって表示されている。

何でこんな事をするのかというと、
1個ずつちゃんと表示してたらマイコンの足がいくらあっても足りないから。















#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
    unsigned char cnt=0;
    unsigned char seg[10] = {0b00111111, 0b00000110,
                             0b01011011, 0b01001111,
                             0b01100110, 0b01101101,
                             0b01111101, 0b00100111,   
                             0b01111111, 0b01101111};

ISR ( TIMER0_COMPA_vect ){
    static unsigned char sel=0;
    unsigned char dig1, dig10, dig100;
    static unsigned char i;
    dig1    = seg[cnt % 10];
    dig10   = seg[(cnt / 10) % 10];
    dig100  = seg[(cnt / 100) % 10];
    switch(sel){
        case 0: PORTB = 0b00000001;
                PORTD = dig1;
                break;
        case 1: PORTB = 0b00000010;
                PORTD = dig10;
                break;
        case 2: PORTB = 0b00000100;
                PORTD = dig100;
                break;
    }
    sel++;
    if(sel == 3){ sel = 0; }
   
    i++;
    if(i == 200){ cnt++; i = 0; }
}
int main(void) {
    DDRB = 0b11101111;  //PB4のみ入力
    DDRD = 0b11111111;  //すべて出力
    PORTB = 0b00010000; //
    PORTD = 0b00000000; //D初期化
    TCCR0A = 0b00000010;    //CTC
    TCCR0B = 0b00000101;    //約1kHz
    OCR0A = 5;              //5msで割り込む
    TIMSK0 = 0b00000010;    //COMPA割り込み
    sei();                  //全体割り込み許可
    while(1) {
    }
    return 0;
}

AVR PORTDチェック関数

Cです。
PORTDの出力チェックを実施する。
PD0~7にLEDでもつないでおこう。

#include<util/delay.h>

void PORTD_test(char w_cnt){

    char i;

    for(i = 0; i < w_cnt; i++){
        PORTD = 0b00000001;
        _delay_ms(200);
        PORTD = 0b00000010;
        _delay_ms(200);
        PORTD = 0b00000100;
        _delay_ms(200);
        PORTD = 0b00001000;
        _delay_ms(200);
        PORTD = 0b00010000;
        _delay_ms(200);
        PORTD = 0b00100000;
        _delay_ms(200);
        PORTD = 0b01000000;
        _delay_ms(200);
        PORTD = 0b10000000;
        _delay_ms(200);
    }
}

int main(void) {
    DDRD = 0b11111111;           //すべて出力
    PORTD = 0b00000000; //D初期化
    while(1) {
    PORTD_test(1);
    }
    return 0;
}

AVR

Cです。
メモリやタイマーなどを作ってきたんだけど。
これはマイコンを使うまでにいろんな基礎知識を養う為のものだった。

これからはマイコンメインでやっていく。半導体技術のすごさを身をもって感じた。

マイコンはAVRを選定した。

どんどん弄繰り回していこう。