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; }