<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

Similar documents
<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

정보보안 개론과 실습:네트워크

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

슬라이드 1

목차 1. A/D 컨버터개요 2. ATMega128 의 A/D 컨버터기능 3. A/D 컨버터로광센서읽기

Microsoft PowerPoint - 08-MP-8-ADC

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<BDC7C7E83820BFB9BAF1BAB8B0EDBCAD2E687770>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

K&R2 Reference Manual 번역본

ATmega128

Section 03 인터럽트활성화와인터럽트서비스루틴연결 34/82 장치에대한인터럽트설정과활성화 내부장치에대한특수레지스터존재 장치의특성을반영한동작설정용또는상태관찰용비트로구성 인터럽트사건의발생패턴을설정해야함 인터럽트활성화비트를 1 로셋하여, 인터럽트발생을허락» 전제, 전역

lecture4(6.범용IO).hwp

API 매뉴얼

<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

(Asynchronous Mode) ( 1, 5~8, 1~2) & (Parity) 1 ; * S erial Port (BIOS INT 14H) - 1 -

Microsoft PowerPoint - 제5장 인터럽트 (HBE-MCU-Multi AVR).ppt [호환 모드]

Chapter #01 Subject

C & System

HBE-MCU-Multi 로배우는 마이크로컨트롤러 (AVR 편 ) 마이크로컨트롤러기능 제 6 장타이머와카운터

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

프로그램을 학교 등지에서 조금이라도 배운 사람들을 위한 프로그래밍 노트 입니다. 저 역시 그 사람들 중 하나 입니다. 중고등학교 시절 학교 도서관, 새로 생긴 시립 도서관 등을 다니며 책을 보 고 정리하며 어느정도 독학으르 공부하긴 했지만, 자주 안하다 보면 금방 잊어

2주차: 입출력 제어 복습

KEY 디바이스 드라이버

CANTUS Evaluation Board Ap. Note

T100MD+

API 매뉴얼

슬라이드 1

Microsoft PowerPoint - polling.pptx

À̵¿·Îº¿ÀÇ ÀÎÅͳݱâ¹Ý ¿ø°ÝÁ¦¾î½Ã ½Ã°£Áö¿¬¿¡_.hwp

<30302E20BEC6C6AEB8E120BDBAC6A9B5F0BFC020BFACBDC0B9AEC1A620C7D8B4E42E687770>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

ez-md+_manual01

[8051] 강의자료.PDF

Microsoft Word - PEB08_USER_GUIDE.doc

1. 기본설정 목차 1-1. 설치해야할프로그램및파일 1-2. 프로그램올리기 1-3. MAKEFILE 2. 캐릭터 LCD(PORT) 3-1. 개요 3-2. 사용하는레지스터 3-3. Source Code 3-4. 실습사진 3. 타이머카운터및초음파센서활용 (PORT, TIM

Microsoft PowerPoint - es-arduino-lecture-03

Lab 3. 실습문제 (Single linked list)_해답.hwp

MicrocontrollerAcademy_Lab_ST_040709

untitled

BMP 파일 처리

슬라이드 1

인터럽트 (Interrupt) 범용입출력포트에서입출력의내용을처리하기위해매번입출력을요구하는플래그를검사하는일 (Pollong) 에대하여마이크로컨트롤러에게는상당한시간을소비하게만든다. 인터럽트란 CPU가현재처리하고있는일보다급하게처리해야할사건이발생했을때, 현재수행중인일을중단하고

Formatvorlage für Arbeitsanweisungen

5.스택(강의자료).key

PowerPoint 프레젠테이션

DTS-L300-V2 Specification Page 1 of 14 비접촉온도측정 원거리온도측정 High Accuracy Digital Interface : SPI Arduino UNO 예제코드제공 제품설명 DTS-L300-V2는접촉을하지않고원하는물체표면에온도를 50

MPLAB C18 C

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

PowerPoint 프레젠테이션

뉴티씨 (NEWTC) 2. FB-CY4E-DEV (FPGA 개발 키트) 구성도 Port Select SW 7 Segment Text LCD UART RS-232C JTAG PORTA (5V) Active Serial PORTB (5V) OSC. 50MHz Analog

Microsoft PowerPoint - Ch13

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

RVC Robot Vaccum Cleaner

Microsoft PowerPoint - ch10 - 이진트리, AVL 트리, 트리 응용 pm0600

Microsoft PowerPoint - ch07 - 포인터 pm0415

<4D F736F F D20C0DBC7B0C6ED5FBDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCAD20B0B3B9DF2E646F63>

<4D F736F F F696E74202D2037C0E55FC0CCC0C0C7F55FBFCFBCBA205BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍


C 언어 프로그래밊 과제 풀이

PowerPoint 프레젠테이션

Microsoft Word doc

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

Lab 4. 실습문제 (Circular singly linked list)_해답.hwp


PowerPoint 프레젠테이션

실험 5

Formatvorlage für Arbeitsanweisungen

DE1-SoC Board

PowerPoint Presentation

Microsoft PowerPoint - Chapter 8_USART Serial Communication

- 2 -

Microsoft PowerPoint - chap06-2pointer.ppt

Motor

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

PowerPoint 프레젠테이션

<C3CA3520B0FAC7D0B1B3BBE7BFEB202E687770>

[ 융합과학 ] 과학고 R&E 결과보고서 뇌파를이용한곤충제어 연구기간 : ~ 연구책임자 : 최홍수 ( 대구경북과학기술원 ) 지도교사 : 박경희 ( 부산일과학고 ) 참여학생 : 김남호 ( 부산일과학고 ) 안진웅 ( 부산일과학고 )

chap 5: Trees

중간고사

Microsoft Word - DTM-M300_Spec_V1_0.doc

Microsoft Word - FunctionCall

untitled

그룹웨어와 XXXXX 제목 예제

untitled

1장. 유닉스 시스템 프로그래밍 개요

ez-shv manual

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft Word - logic2005.doc

untitled


Transcription:

7주차 AVR의 A/D 변환기제어레지스터및관련실습 Next-Generation Networks Lab.

3. 관련레지스터 표 9-4 레지스터 ADMUX ADCSRA ADCH ADCL 설명 ADC Multiplexer Selection Register ADC 의입력채널선택및기준전압선택외 ADC Control and Status Register A ADC 의동작을설정하거나동작상태를표시함 ADC Data Register High Byte ADC 의변환결과를저장하는레지스터중상위레지스터 ADC Data Register Low Byte ADC 의변환결과를저장하는레지스터중하위레지스터 58

ADMUX (ADC Multiplexer Selection Register) REFS1~REFS0 (Reference Selection) : 기준전압선택 ADLAR (ADC Left Adjust Result) : 데이터를왼쪽정렬로저장 MUX4~0 은 (analog MUX selection) A/D 변환할채널선택과단극성또 는차동입력방식을선택. 그림 9-16 - Default 설정의의미 - 기준전압은 AREF 전압으로설정 - 데이터는오른쪽정렬로저장 59

60 표 9-5

61

그림 9-18 ADCH ADCL ADCH ADCL 저해상도로사용할때유리함 8비트로사용하면 ADCH만읽음 62

ADCSRA (ADC Control and Status Register A) ADEN (ADC Enable) : ADC 동작 그림 9-17 ADSC (ADC Start Conversion) : ADC 변환시작. 변환완료후에 0 로됨 ADFR (ADC Free Running) : Free-running mode 로설정 ADIF (ADC Interrupt Flag) : ADC 가완료되면 1 로세트되면서인터럽트 를요청. 인터럽트가서비스되면하드웨어적으로 0 으로설정됨 ADIE (ADC Interrupt Enable) : ADC 인터럽트서비스를개별적으로허용 ADPS2~0 (ADC Prescaler Select) : ADC 변환클럭을위한분주비설정 63

ADCH / ADCL (ADC Data Register High byte, Low byte) ADC 결과값인 10 비트를저장하는 2 개의 8 비트레지스터 항상 ADCL 을먼저읽고후에 ADCH 를읽을것! ADC 데이터변환결과 단극성입력채널을사용하는경우의변환결과 차동입력채널을사용하는경우의변환결과 64

ADC 설정사항 ADMUX 레지스터 기준전압 : 입력신호의최고전압 신호입력채널 변환된데이터의정렬 : 처리방식 (8비트, 10비트 ) ADCSRA 레지스터 Free-running 여부 변환클럭속도 : Prescaler 설정 인터럽트활용여부 65

ADC 초기화함수 void adc_init (INT8 channel) asm("cli"); CLI); // cli( ); ADMUX= (0<<REFS1) (0<<REFS0); // 기준전압 ADMUX = (0<<ADLAR); // 10비트해상도 ADMUX = channel; ADCSRA= (1<<ADEN) (1<<ADSC) (1<<ADFR) (1<<ADIE) (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // 기준클럭 : 1MHz/ 8 asm("sei"); // sei( ); //SREG = 0x80; 비트설정동작비트설정동작 REF1:0 00 AREF input ADSC 1 변환시작 ADLAR 0 우측정렬 ADFR 1 Free-running MUX4:0 channel 입력선택 ADIE 1 Interrupt 허용 ADEN 1 Enable ADPS2:0 011 Prescaler 8 분주 66

예제 9.1 온도센서 TMP35 온도센서를활용하여현재온도를측정한다. TMP35 의출력전압을 ADC 의채널 #0 을통해 A/D 변환한다. A/D 변환된 10 비트값으로부터 TMP35 출력전압과온도를계산한다. CPU 클럭주파수 : 1MHz 내부발진기 기준전압 : 외부 AREF 입력전압 입력채널 : ch #0 해상도 : 10비트 온도를 PORTA 의 7-segment 에출력한다. 예를들어, 현재온도가 28 도이면, 2 개의 7-segment 에 28 을출력한다. 67

Port A CPU Board 7-segment (Decoder) 온도센서 (TMP35) Port F0 68

온도센서 (TMP35) 및구동회로도 회로도 1 3 2 1 2 3 69

Features Calibrated directly in Celsius (Centigrade) Linear +10.0 0 mv/c scale factor 0.5C accuracy guaranteeable (at +25 C) Rated for full -55 to +150C range Suitable for remote applications Low cost due to wafer-level l trimming i Operates from 4 to 30 volts 70

Temperature vs. Output Voltage 71

예제 9-1 ADC ( 온도센서 TMP35) typedef unsigned char INT8; typedef unsigned int INT16; #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> l #include <avr/interrupt.h> #define ADC_CH CH 0 // 입력채널 #define TMP35 100 // TMP35 환산 //#define REF_VOLTAGE 2.56 // 기준전압 //#define REF_VOLTAGE 3.33 // 기준전압 #define REF_VOLTAGE 5.0 // 기준전압 //#define RESOLUTION 256.0 // 8비트 #define RESOLUTION 1024.00 // 10 비트 volatile INT16 read_adc = 0; volatile INT8 adc_flag = 0; ISR(ADC_vect) // ADC interrupt function read_adc = ADCL; read_adc += (ADCH<<8); adc_flag = 1; void adc_init(int8 channel) asm("cli"); // cli( ); ADMUX= (0<<REFS1) (0<<REFS0); // 기준전압 ADMUX = (0<<ADLAR); // 10비트해상도 ADMUX = channel; // ADMUX = 0b0000000; ADCSRA = (1<<ADEN) (1<<ADSC) (1<<ADFR) (1<<ADIE) (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); 1 // 기준클럭 : 1MHz / 8 // ADCSRA = 0b11101011; asm("sei"); // sei( ); //SREG = 0x80; 72

예제 9-1 ADC ( 온도센서 TMP35) int main (void) INT8 count=0; INT8 Value_10, Value_01; volatile float temp_volt = 0.0; volatile float Temperature = 0.0; DDRG = 0xFF; DDRA = 0xFF; adc_init(adc_ch); CH); // Ch # of ADC _delay_ms(10); if(adc_flag == 1) PORTG = count++; // adc_flag를 clear adc_flag = 0; // 10 비트 ADC 값으로부터전압계산 temp_volt = read_adc * (REF_VOLTAGE/RESOLUTION); // 계산된전압에서온도계산 Temperature = temp_volt * (float)tmp35; PORTA = 0x99; _delay_ms(500); while(1) // 우측프로그램추가 return 0; // 온도값을 7-segment에표현 Value_10 = Temperature / 10; Value_01 = (INT8) Temperature % 10; PORTA = (Value_10<<4) Value_01; _delay_ms(200); 73

예제 9-2 ADC ( 온도센서 온도센서 TMP35 입력채널, 기준전압설정변경 ) TMP35 온도센서를활용하여현재온도를측정한다. TMP35 의출력전압을 ADC 의채널 #2 를통해 A/D 변환한다. A/D 변환된 10 비트값으로부터 TMP35 출력전압과온도를계산한다. CPU 클럭주파수 : 1MHz 내부발진기 기준전압 : 내부 2.56V 입력채널 : ch #2 해상도 : 10비트 온도를 PORTA 의 7-segment 에출력한다. 예를들어, 현재온도가 28 도이면, 2 개의 7-segment 에 28 을출력한다. 74

예제 9-2 typedef unsigned char INT8; typedef unsigned int INT16; #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define ADC_CH 2 // 입력채널 #define TMP35 100 // TMP35 환산 #define REF_VOLTAGE 2.56 // 기준전압 //#define REF_VOLTAGE 3.3 // 기준전압 //#define REF_VOLTAGE 5.0 // 기준전압 //#define RESOLUTION 256.0 // 8비트 #define RESOLUTION 1024.00 // 10 비트 volatile INT16 read_adc = 0; volatile INT8 adc_flag = 0; ISR(ADC_vect) // ADC interrupt function read_adc adc = ADCL; read_adc += (ADCH<<8); adc_flag = 1; void adc_init(int8 channel) asm("cli"); CLI); // cli( ); ADMUX= (1<<REFS1) (1<<REFS0); // 기준전압 ADMUX = (0<<ADLAR); // 10비트해상도 ADMUX = channel; ADCSRA= (1<<ADEN) (1<<ADSC) (1<<ADFR) (1<<ADIE) (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // 기준클럭 : 1MHz / 8 asm("sei"); // sei( (); //SREG = 0x80; 75

예제 9-2 int main (void) INT8 count=0; INT8 Value_10, Value_01; volatile float temp_volt = 0.0; volatile float Temperature = 0.0; DDRG = 0xFF; DDRA = 0xFF; adc_init(adc_ch); CH); // Ch # of ADC _delay_ms(10); if(adc_flag == 1) PORTG = count++; // adc_flag를 clear adc_flag = 0; // 10 비트 ADC 값으로부터전압계산 temp_volt = read_adc * (REF_VOLTAGE/RESOLUTION); // 계산된전압에서온도계산 Temperature = temp_volt * (float)tmp35; PORTA = 0x99; _delay_ms(500); while(1) // 우측프로그램추가 return 0; // 온도값을 7-segment에표현 Value_10 = Temperature / 10; Value_01 = (INT8) Temperature % 10; PORTA = (Value_10<<4) Value_01; _delay_ms(200); 76

예제 9-3 ADC ( 온도센서 온도센서 TMP35 클럭속도설정변경 ) TMP35 온도센서를활용하여현재온도를측정한다. TMP35 의출력전압을 ADC 의채널 #2 를통해 A/D 변환한다. A/D 변환된 10 비트값으로부터 TMP35 출력전압과온도를계산한다. CPU 클럭주파수 : 4MHz 내부발진기 기준전압 : 외부 AREF 입력전압 입력채널 : ch #2 해상도 : 10비트 Prescaler 설정을 000에서 111까지변화하면서결과확인 온도를 PORTA 의 7-segment 에출력한다. 예를들어, 현재온도가 28 도이면, 2 개의 7-segment 에 28 을출력한다. 77

예제 9-3 typedef unsigned char INT8; typedef unsigned int INT16; #define F_CPU 4000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define ADC_CH 2 // 입력채널 #define TMP35 100 // TMP35 환산 //#define REF_VOLTAGE 2.56 // 기준전압 //#define REF_VOLTAGE 3.3 // 기준전압 #define REF_VOLTAGE 5.0 // 기준전압 //#define RESOLUTION 256.0 // 8비트 #define RESOLUTION 1024.00 // 10 비트 volatile INT16 read_adc = 0; volatile INT8 adc_flag = 0; ISR(ADC_vect) // ADC interrupt function read_adc adc = ADCL; read_adc += (ADCH<<8); adc_flag = 1; void adc_init(int8 channel) asm("cli"); CLI); // cli( ); ADMUX= (0<<REFS1) (0<<REFS0); // 기준전압 ADMUX = (0<<ADLAR); // 10비트해상도 ADMUX = channel; ADCSRA= (1<<ADEN) (1<<ADSC) (1<<ADFR) (1<<ADIE) (0<<ADPS2) (0<<ADPS1) (1<<ADPS0); // 기준클럭 : 1MHz / 8 asm("sei"); // sei( (); //SREG = 0x80; 78

예제 9-3 int main (void) INT8 count=0; INT8 Value_10, Value_01; volatile float temp_volt = 0.0; volatile float Temperature = 0.0; DDRG = 0xFF; DDRA = 0xFF; adc_init(adc_ch); CH); // Ch # of ADC _delay_ms(10); if(adc_flag == 1) PORTG = count++; // adc_flag를 clear adc_flag = 0; // 10 비트 ADC 값으로부터전압계산 temp_volt = read_adc * (REF_VOLTAGE/RESOLUTION); // 계산된전압에서온도계산 Temperature = temp_volt * (float)tmp35; PORTA = 0x99; _delay_ms(500); while(1) // 우측프로그램추가 return 0; // 온도값을 7-segment에표현 Value_10 = Temperature / 10; Value_01 = (INT8) Temperature % 10; PORTA = (Value_10<<4) Value_01; _delay_ms(200); 79

예제 9-4 ADC ( 온도센서 온도센서 TMP35 Free-running running 해제 ) TMP35 온도센서를활용하여현재온도를측정한다. TMP35 의출력전압을 ADC 의채널 #2 를통해 A/D 변환한다. A/D 변환된 10 비트값으로부터 TMP35 출력전압과온도를계산한다. CPU 클럭주파수 : 1MHz 내부발진기 기준전압 : 외부 AREF 입력전압 입력채널 : ch #2 해상도 : 10비트 Free-running을해제하고결과확인 주기적으로 A/D 변환을하기위한명령은?? 온도를 PORTA 의 7-segment 에출력한다. 예를들어, 현재온도가 28 도이면, 2 개의 7-segment 에 28 을출력한다. 80

예제 9-4 typedef unsigned char INT8; typedef unsigned int INT16; #define F_CPU 1000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define ADC_CH 2 // 입력채널 #define TMP35 100 // TMP35 환산 //#define REF_VOLTAGE 2.56 // 기준전압 //#define REF_VOLTAGE 3.3 // 기준전압 #define REF_VOLTAGE 5.0 // 기준전압 //#define RESOLUTION 256.0 // 8비트 #define RESOLUTION 1024.00 // 10 비트 volatile INT16 read_adc = 0; volatile INT8 adc_flag = 0; ISR(ADC_vect) // ADC interrupt function read_adc adc = ADCL; read_adc += (ADCH<<8); adc_flag = 1; void adc_init(int8 channel) asm("cli"); CLI); // cli( ); ADMUX= (0<<REFS1) (0<<REFS0); // 기준전압 ADMUX = (0<<ADLAR); // 10비트해상도 ADMUX = channel; ADCSRA= (1<<ADEN) (1<<ADSC) (0<<ADFR) (1<<ADIE) (0<<ADPS2) (1<<ADPS1) (1<<ADPS0); // 기준클럭 : 1MHz / 8 asm("sei"); // sei( (); //SREG = 0x80; 81

예제 9-4 int main (void) INT8 count=0; INT8 Value_10, Value_01; volatile float temp_volt = 0.0; volatile float Temperature = 0.0; DDRG = 0xFF; DDRA = 0xFF; adc_init(adc_ch); CH); // Ch # of ADC _delay_ms(10); if(adc_flag == 1) PORTG = count++; // adc_flag를 clear adc_flag = 0; // 10 비트 ADC 값으로부터전압계산 temp_volt = read_adc * (REF_VOLTAGE/RESOLUTION); // 계산된전압에서온도계산 Temperature = temp_volt * (float)tmp35; PORTA = 0x99; _delay_ms(500); while(1) // 우측프로그램추가 return 0; // 온도값을 7-segment에표현 Value_10 = Temperature / 10; Value_01 = (INT8) Temperature % 10; PORTA = (Value_10<<4) Value_01; _delay_ms(200); ADCSRA = (1<<ADSC); // ADCSRA = 0x40; 82