본문 바로가기

AVR 기초

(16)
[AVR 기초] 밝기에 따른 LED 빛의 밝기가 일정 이상이 되었을때에 따른 LED켜고 크기에 대한 코드입니다. 전의 글과 기본적인 코드는 같지만 #define으로 빛의 값에 기준을 두어 그에 따른 LED를 제어하는 코드입니다. #include #define CDS_VALUE1 700//빛의 값 설정 1 #define CDS_VALUE2 871//빛의 값 설정 2 #define CDS_VALUE3 950//빛의 값 설정 3 void init_adc(); unsigned short read_adc(); void show_adc(unsigned short value); void init_adc() { ADMUX = 0x00; ADCSRA = 0x87; } unsigned short read_adc() { unsigned char adc_low..
[AVR 기초] CDS를 이용해 LED on-off *키트는 Atmega128A를 사용하였습니다* CDS란 빛의 양에 따라 저항값이 변하는 가변저항입니다. 조도 센서라고도 하는데 이 센서는 광센서의 가장 기본적인 센서로서 빛의 밝기에 대하여 전기적인 성질로 변환시켜주는 역할을 하는 센서입니다. CDS를 이용하기 전에 ADC에 대해 설명하겠습니다. ADC란 Analog to Digital Converter으로 간단히 말하자면 아날로그 신호를 디지털로 바꿔주는 것입니다. 이미지 출처 : https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220873048333&proxyReferer=https:%2F%2Fwww.google.com%2F Analog to Digital Converter(ADC)란 ..
[AVR 기초] 스탑워치2 *키트는 Atmega128A를 사용하였습니다* //StopWatch SW1 인터럽트 발생시 시간 o #include #include //인터럽트 헤더파일 선언 >> 인터럽트 사용 가능 #define F_CPU 16000000UL #include volatile int currenttime, stoptime = 0; volatile int go = 1;//변수 GO 만듬. GO 의 값 : 1 설정 unsigned char fnd[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; unsigned char fnd_pos[4] = {0x01, 0x02, 0x04, 0x08}; volatile int count = 0; ISR(INT4_vec..
[AVR 기초] 스탑워치 1 *키트는 Atmega128A를 사용하였습니다* //StopWatch SW1 인터럽트 발생시 시간X #include #include #define F_CPU 16000000UL//실제 동작 clock Hz -> 16MHz #include //딜레이 헤더파일 선언 volatile int currenttime, stoptime = 0;//변수를 선언할 때 앞에 volatile 을 붙이면 컴파일러는 해당 변수를 최적화에서 제외하여 항상 메모리에 접근하도록 만듬 //currenttime, stoptime 이라는 변수만듬 unsigned char fnd[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; unsigned char fnd_pos[4..
[AVR 기초] 스위치를 이용한 FND 4자리 1씩 증가하기 *키트는 Atmega128A를 사용하였습니다* 스위치를 이용해 FND 4자리 스위치 1씩 증가하기 입니다. 예시를 보겠습니다. 코드는 다음과 같습니다. #include #include //인터럽트 헤더파일 선언 #define F_CPU 16000000UL #include unsigned char fnd[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x67}; unsigned char fnd_pos[4] = {0x01, 0x02, 0x04, 0x08}; volatile int count = 0;//변수 count =0. 인터럽트와 메인에서 함께 사용하는 변수는 volatile을 선언하는것이 안전 ISR(INT4_vect){//Interrupt..
[AVR 기초] 인터럽트(Interrupt)란 우선 인터럽트에 대해 알려드리겠습니다. 마이크로프로세서에서 인터럽트란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리를 할 수 있도록 하는것을 말합니다. 폴링이 대상을 주기적으로 감시하면서 상황이 발생하면 실행합니다. 이런 작업은 장치의 상태를 읽는데 마이크로프로세서의 자원이 낭비됩니다. 이와 다르게, 인터럽트는 일을 처리해 달라고 요청하는 수단입니다. 해당 하드웨어가 CPU에게 요청하므로 빨리 처리가 된다면 데이터 손실 위험이 작아지고, 필요할 때 처리되는 경향이 있어서 폴링보다 유리합니다. 마이크로프로세서는 인터럽트를 감지하면 지금 실행중인 코드를 중단하고 해당 입터럽트 처리 코드로 점프..
[AVR 기초] FND 4자리를 한번에 나타내기 *키트는 Atmega128A를 사용하였습니다* #include #define F_CPU 16000000UL #include unsigned char fnd[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f}; unsigned char fnd_pos[4] = {0x01, 0x02, 0x04, 0x08} ; void fourth(int x){//fnd의 4번째 자리를 나타내는 함수 PORTG = fnd_pos[3];//PORTG에 fnd_pos[3]의 값 PORTC = fnd[x];//PORTC에 main 함수에서 x의 값을 받아 fnd[x] 저장 } void third(int y){//fnd의 3번째 자리를 나타내는 함수 PORTG = f..
[AVR 기초] FND 0~9까지 나타낸 후 한칸씩 옮겨가기 *키트는 Atmega128A를 사용하였습니다* 왼쪽서부터 0~9까지 나타낸 후 한칸씩 옮겨가는 코드입니다. #include #define F_CPU 16000000UL #include int main(void) { /* Replace with your application code */ DDRC = 0xff;//fnd의 포트는 portc. PORT C를 입/출력으로 설정 DDRG = 0x0f;//fnd의 자리를 결정하는 포트. 4개의 자리만 있기 때문에 0x0f unsigned char fnd[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27, 0x7f, 0x6f};//0~9를 나타내는 HEX값 unsigned char fnd_pos[4] = {0x01, 0..