ADCペリフェラル / CdSを使った明るさセンサー / 上位3ビット値(0~7)だけを8セグメントLEDバーに表示する

https://github.com/ti-nspire/AVR/tree/master/lightSensor
 

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

void initADC(){
//static inline void initADC(){
    ADMUX  |= (1 << REFS0);                // 基準電圧としてAVCCを使うことにする。
    //ADCSRA |= (1 << ADPS2);                // ADCへ供給するクロックの分周比を決める。16分周。
    ADCSRA |= (1 << ADPS2) | (1 << ADPS0); // ADCへ供給するクロックの分周比を決める。32分周。
    ADCSRA |= (1 << ADEN);                 // ADCを有効化する。
}

int main(){
    uint8_t  ledVal;
    uint16_t adcVal; // 10ビット値が得られるのでuint8_tでは足りない。
    uint8_t  numOfLEDs;
    
    DDRB = 0xff; // ポートBのIOを全部OUTにする。ポートBにLEDバーを接続する。
    uint8_t pos[] = {PB0,PB7,PB6,PB1,PB2,PB3,PB4,PB5}; // 配線のし易さを優先してこの順番にポートBの並びを変えてLEDバーに出力することにする。

    initADC();
    while(1){
        ADCSRA |= (1 << ADSC);                 // AD変換を開始する(Start Conversion)。
        loop_until_bit_is_clear(ADCSRA, ADSC); // AD変換が終わるのを待つ。
        adcVal = ADC;                          // ADCL、ADCHの両レジスタから10ビット分まとめてAD変換値が読み出せる。
        ledVal = (adcVal >> 7);                // 今回は、8 (=2^3)個のLEDから成るLEDバーでAD変換値を表示するので10ビット中の上位3ビットしか使わない。
        numOfLEDs = ledBar(ledVal);            // 上位3ビットの値(0d0~0d7)に応じて、LEDバーに点灯するLEDの数を1~8個の範囲で変える。
        PORTB = byte2pos(numOfLEDs, pos);      // LEDの並びとポートBの並びとを合わせていないので、うまく並べ換えてから出力する。

        _delay_ms(50);
    }

    return 0;
}

f:id:ti-nspire:20190616075513j:plain:h280 f:id:ti-nspire:20190616082029p:plain:h280