본문 바로가기
IoT/아트멜 스튜디오와 아두이노로 배우는 ATmega328 프로그래밍

ATmega328 가변저항 / 난수 생성

by javapp 자바앱 2020. 6. 8.
728x90

가변 저항

A0 ~ A5 

VCC / A0 / GND 

10K 저항

 

 

 

 

 

 

 

 

5v A0 GND

#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);

       }

      

}

댓글