728x90
가변 저항
A0 ~ A5
VCC / A0 / GND
10K 저항
#define F_CPU 16000000L
#include <util/delay.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>
#include "UART.h"
void ADC_INIT(unsigned char channel)
{
ADMUX |= 0x40 ; 0100 0000 // AVCC를 기준전압으로 선택
ADCSRA |= 0x07 ; 0111 // 분주비 설정
ADCSRA |= (1 << ADEN); // ADC 활성화
ADCSRA |= (1 << ADATE); // 자동트리거 모드
ADMUX |= ((ADMUX & 0xE0) | channel); // 채널선택
ADCSRA |= (1 << ADSC); // 변환시작
}
int read_ADC(void)
{
while(!(ADCSRA & (1 << ADIF))); // 변환종료 대기
return ADC; // 10비트 값을 변환
}
void int_to_string(int n, char *buffer)
{
sprintf(buffer, "%04d", n);
buffer[4] = '\0';
}
void PORT_INIT(void)
{
}
int main(void)
{
int value;
uint8_t on_off;
ADC_INIT(0); //ADC 초기화
PORT_INIT();
while(1)
{
value = read_ADC() >> 7; //AD 변환된 값의 최상위 3비트만 남김
on_off = 0;
for(int i=0; i <= value; i++){ //8개의 LED 점멸 패턴 결정
on_off |= (0x01 << i);
}
PORTD = on_off; //LED 제외
}
}
분주율 : 16MHz 시스템 클록을 나누는 값, 시스템 클록보다 낮은 속도로 ADC 수행
#define F_CPU 16000000L
#include <util/delay.h>
#include <avr/io.h>
#include <avr/sfr_defs.h>
#include <avr/interrupt.h>
#include "UART.h"
void ADC_INIT(unsigned char channel)
{
ADMUX |= 0x40 ; // AVCC를 기준전압으로 선택
ADCSRA |= 0x07 ; // 분주비 설정
ADCSRA |= (1 << ADEN); // ADC 활성화
ADCSRA |= (1 << ADATE); // 자동트리거 모드
ADMUX |= ((ADMUX & 0xE0) | channel); // 채널선택
ADCSRA |= (1 << ADSC); // 변환시작
}
int read_ADC(void)
{
while(!(ADCSRA & (1 << ADIF))); // 변환종료 대기
return ADC; // 10비트 값을 변환
}
int main(void)
{
UART_INIT();
ADC_INIT(0);
srand(read_ADC());
UART_printString("random number ..");
while(1)
{
int randomNumber = rand() % 100 + 1 //1~100 사이
UART_print8bitNumber(randomNumber);
UART_transmit('\n');
_delay_ms(1000);
}
}
'IoT > 아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍' 카테고리의 다른 글
ATmega328 조도센서, 온도센서, 초음파센서 (0) | 2020.06.11 |
---|---|
오버플로 / 비교일치 인터럽트 (0) | 2020.06.09 |
인터럽트 (0) | 2020.05.30 |
LED & button (0) | 2020.05.24 |
시리얼 통신 / UART 통신 (0) | 2020.05.21 |
댓글