References AVR ATmega 128 Ohm AVR The 6

  • Slides: 57
Download presentation
References: -AVR ATmega 128 정복, Ohm사 -뻔뻔한 AVR 프로그래밍 The 6 th Lecture, 유명환

References: -AVR ATmega 128 정복, Ohm사 -뻔뻔한 AVR 프로그래밍 The 6 th Lecture, 유명환 -ATmega 128 Manual, ATMEL사 KT-M 128 Peripheral Device USART 조 승훈

USART

USART

USART Overview • USART (Universal Synchronous and Asynchronous Receiver and Transmitter) – Parallel로 표현되는

USART Overview • USART (Universal Synchronous and Asynchronous Receiver and Transmitter) – Parallel로 표현되는 Data를 Serial로 전송 및 수신하는 장치 CPU Core Bus 0 1 0 1 TX 0 1 0 1 RX 0 1 0 1 UART Data Stream Parallel START 0 1 2 3 Serial 4 [5] [6] [7] [8] [Parity ] Stop 1 [Stop 2 ] Data Bit 3

USART Overview • ATmega 128 UART의 특징 – 두 개의 UART 내장 – 동기

USART Overview • ATmega 128 UART의 특징 – 두 개의 UART 내장 – 동기 및 비동기 전송 모드 지원 • 동기 모드 – master : 전송속도를 결정하는데 내부 Clock 사용 • “ slave : XCKn 단자로 입력되는 외부 Clock 사용 • 비동기 모드 – 항상 내부의 System Clock 사용 • Normal Mode, Double Speed Mode로 나뉨 – – – – – 항상 Full-Duplex 통신 Multi-Processor 통신 가능 높은 정밀도의 Baud Rate Generator 내장 5 -9 Bit의 Data 전송 가능 1 -2 Bit의 Stop Bit 설정 가능 하드웨어에 의한 홀수 및 짝수의 Parity Bit 설정 가능 (생략 가능) 수신 동작에서 Parity Error, Overrun Error, Frame Error 검출 가능 Tx Complete, Tx Data Register Empty, RX Complete Interrupt 사용 가능 Noise Filtering을 포함한 False Start Bit 검출 및 Digital Low Pass Filter Double Speed 비동기 통신 모드 4

USART Overview PORT F Receiver / Transfer PORT A PORT E PORT C PORT

USART Overview PORT F Receiver / Transfer PORT A PORT E PORT C PORT B PORT D Ext. Clock 5

USART Overview KT-M 128 UART 회로도 6

USART Overview KT-M 128 UART 회로도 6

UART 직렬통신 포토의 구성 블록도 Baud Rate Control REG. Transmitter Buffer REG. (Same REG)

UART 직렬통신 포토의 구성 블록도 Baud Rate Control REG. Transmitter Buffer REG. (Same REG) Receiver Buffer REG. (Same REG) I/O Pin UART Control REG. 동기 모드 Slave를 위한 Ext. Clock 3 PART 모든 파트에서 공유 7

Clock Generator의 내부 구조 및 동작 과정 • USART Operation Mode – Asynchronous Mode

Clock Generator의 내부 구조 및 동작 과정 • USART Operation Mode – Asynchronous Mode : UCSRn. C레지스터의 UMSELn Bit = 0 • Int. System Clock을 기본으로 하여 Baud Rate Clock 생성 • USCRn. C REG : U 2 Xn Bit = 0 - Normal Mode, U 2 Xn Bit = 1 – Double Speed Mode – Synchronous Mode : UCSRn. C레지스터의 UMSELn Bit = 1 • • XCKn 단자를 이용하여 Baud Rate Clock 생성 Master Mode : XCKn 단자를 이용하여 외부 Slave에 전송, 출력 단자 Slave Mode : XCKn 단자를 외부 Master로 부터 수신, 입력 단자 DDRx의 해당 Bit를 적절한 In / Out으로 설정해야 함 USART Synchronous Asynchronous ATmega 128 USART Modes Master Slave Normal Double Speed 8

Clock Generator의 Timing • 동기 모드의 Timing – XCKn 단자로 입. /출력되는 Clock 신호는

Clock Generator의 Timing • 동기 모드의 Timing – XCKn 단자로 입. /출력되는 Clock 신호는 UCSRn. C레지스터의 UCPOLn Bit에 의해 동작 Edge가 결정 됨 – 동기 Slave Mode에서 외부로부터 입력되는 CXKn Clock 신호는 동기 레지스터와 에지 검 출기를 거치면서 2 System Clock만큼 지원, 이 Clock의 주파수는 System Clock의 ¼ 이하여야 함 Falling Edge – Receive Data 출력 Rising Edge – Transmit Data 샘플링 Falling Edge – Transmit Data 샘플링 Rising Edge – Receive Data 출력 10

Transmitter의 동작 과정 Clock Generator Transmitter 송신 버퍼 Empty UDC(Transmit) : 송신 버퍼 1

Transmitter의 동작 과정 Clock Generator Transmitter 송신 버퍼 Empty UDC(Transmit) : 송신 버퍼 1 Bit씩 Loading TRANSMIT SHIFT REGISTER : 한 Bit씩 송신 (Transmitting) Parity Generator TXD Receiver 11

Receiver의 동작 과정 Clock Generator Receiver RXD 핀으로부터 1 Bit씩 수신 RECEIVE SHIFT REGISTER

Receiver의 동작 과정 Clock Generator Receiver RXD 핀으로부터 1 Bit씩 수신 RECEIVE SHIFT REGISTER : 1 Bit씩 수신 버퍼에 저장 Transmitter Parity Generator RXD Stop Bit : Data Bit 수신이 완료 됨 UDR (Receive) : 수신 버퍼 Full 12

전송 데이터 포맷 • Parity Bit를 사용하게 설정한 경우 – 데이터 수신 때 Parity를

전송 데이터 포맷 • Parity Bit를 사용하게 설정한 경우 – 데이터 수신 때 Parity를 계산하여 전송 에러 체크 – 첫 번째의 Stop Bit까지 Frame을 체크하여 Parity Bit가 low로 검출되면 프레임 에러 • 두 개의 Stop Bit를 사용한 경우 – 두 번째 Stop Bit는 수신부에서 무시, 송신부를 Delay 시키는 효과만 있음 [] = Can be remove • • • St (n) P Sp IDLE : : : Start Bit, Always low. Data Bits, (0 to 8) bit 계산법 Parity Bit, Can be odd or even. Parity Peven = dn 1 ⊕ … ⊕ d 3 ⊕ d 2 ⊕ d 1 ⊕ d 0 ⊕ 0 Podd = dn 1 ⊕ … ⊕ d 3 ⊕ d 2 ⊕ d 1 ⊕ d 0 ⊕ 1 Stop Bit, Always high. No transfers on the communication line (Rx. D or Tx. D). An IDLE line must be high. – – 13

USART REGISTER • USARTn Control & Status Register A – USCRn. A (Cont’) –

USART REGISTER • USARTn Control & Status Register A – USCRn. A (Cont’) – Bit 1 (U 2 Xn) : Double the USARTn Transmission Speed) • 비동기 모드에서만 유효 • USARTn Port의 클록 분주비를 16에서 8로 절반만큼 낮추어 전송속도를 2배 높이는 기능을 수행 – Bit 0 (MPCMn) : USARTn Multi-Processor Communication Mode) • USARTn을 Multi-Processor Communication Mode로 설정 • Multi-Processor Communication Mode에서는 Address 정보를 포함하지 않는 모든 수신 데이 터는 수신부에서 무시 됨 • 송신부는 이 Bit에 영향을 받지 않음 17

USART REGISTER • USARTn Control & Status Register B – UCSRn. B – USARTn

USART REGISTER • USARTn Control & Status Register B – UCSRn. B – USARTn Port의 송수신 동작을 제어하거나, 전송 데이터를 9 Bit로 설정한 경우 전송 데이 터의 9번째 Bit값을 저장하는 기능 – Bit 7 (RXCIEn) : USARTn RX Complete Interrupt Enable • Receive Complete Interrupt를 개별적으로 허용하는 Bit – Bit 6 (TXCIEn) : USARTn TX Complete Interrupt Enable • Transmit Complete Interrupt를 개별적으로 허용하는 Bit – Bit 5 (UDRIEn) : USARTn Data Register Empty Interrupt Enable • Data Register Empty Interrupt(송신에서만 발생)를 개별적으로 허용하는 Bit – Bit 4 (RXENn) : USARTn Receiver Enable • USARTn Port의 수신부가 동작하도록 허용 • RXDn 핀이 병렬 I/O Port가 아니라 Serial Data Receive Port로 동작하게 바꾸고, FEn, DORn, UPEn의 동작을 유효하게 함 18

USART REGISTER • USARTn Control & Status Register C – UCSRn. C – USARTn

USART REGISTER • USARTn Control & Status Register C – UCSRn. C – USARTn Port의 송/수신 동작을 제어하는 기능을 수행 UPMn Bit Settings – Bit 6 (UMSELn) : USARTn Mode Select • 1 : Synchronous Operation • 0 : Asynchronous Operation – Bit 5 -4 (UPMn 1 -0) : USARTn Parity Mode) UPMn 1 UPMn 0 Parity Mode 0 0 Disabled 0 1 (Reserved) 1 0 Enabled, Even Parity 1 1 Enabled, Odd Parity • USARTn Port에서 Parity Mode를 설정 – Bit 3 (USBSn) : USARTn Stop Bit Select • 1 : USARTn Port에서 데이터 포맷을 구성하는 Stop Bit를 두 개로 설정 • 0 : USARTn Port에서 데이터 포맷을 구성하는 Stop Bit를 한 개로 설정 20

USART REGISTER • USARTn Control & Status Register C – UCSRn. C (Cont’) –

USART REGISTER • USARTn Control & Status Register C – UCSRn. C (Cont’) – Bit 2 -1 (UCSZn 1 -0) : (USARTn Character Size) • UCSRn. B 레지스터의 UCSZn 2와 함께 전송 문자의 데이터 비트수를 설정 – Bit 0 (UCPOLn) : USARTn Clock Polarity) • 동기 모드에서 송/수신의 동작 Edge를 결정 UCSZn Bit Settings UCPOLn (Bit 0) Bit Settings UCPOLn Transmitted Data Changed Received Data Sampled 0 Rising XCKn Edge Falling XCKn Edge 1 Falling XCKn Edge Rising XCKn Edge UCSZn 2 UCSZn 1 UCSZn 0 Character Size 0 0 0 5 Bit 0 0 1 6 Bit 0 1 0 7 Bit 0 1 1 Reserved 1 0 0 Reserved 1 0 1 Reserved 1 1 0 Reserved 1 1 1 9 Bit 21

USART REGISTER • USARTn Baud Rate Register – UBRRn. H/L – UARTn Port의 송/수신

USART REGISTER • USARTn Baud Rate Register – UBRRn. H/L – UARTn Port의 송/수신 속도를 설정하는 기능을 수행 (Clock의 분주비 – Baud Rate 결정) 22

비동기 모드에서 1비트의 샘플링 동작 • Sampling of Data and Parity Bit (Data Recovery

비동기 모드에서 1비트의 샘플링 동작 • Sampling of Data and Parity Bit (Data Recovery Logic) – Normal Mode : 16 state의 State Machine 사용 – Double Speed Mode : 8 state의 State Machine 사용 2차례 이상 검출 된 논리 신호를 검출 결과로. 함 Normal Mode 동기 된 Start 신호 or 이전 비트 Double Speed Mode • Stop Bit Sampling and Next Start Bit Sampling Normal Mode Double Speed Mode STOP! 이후 Falling. Edge가 발생하면 START 신호로 간주 2차례 이상 검출 된 논리 신호를 검출 결과로. 함 25

ETC

ETC

RS-232 C Serial Communication

RS-232 C Serial Communication

RS-232 C Spec • RS-232 C의 전기적 사양 – RS-232 C 규격에서는 25핀과 9킨

RS-232 C Spec • RS-232 C의 전기적 사양 – RS-232 C 규격에서는 25핀과 9킨 커넥터에 데이터 신호와 핸드세이킹 신호들을 지정하고 이들 신호명은 물론 각 신호들의 전기적인 사양까지 자세하게 규정하고 있음 Rs-232 C 및 기타 통신 방식의 전기적인 사양 요약 Specification RS 232 C RS 423 RS 422 RS 485 동작 모드 Single-Ended Differential 최대 Driver/Receiver 수 1 Driver 1 Receiver 1 Driver 10 Receivers 1 Driver 32 Receivers 32 Drivers 32 Receivers 최대 통달거리 약 15 m 약 1. 2 km 최고 통신속도 20 Kb/s 10 Mb/s 지원 전송방식 Full Duplex Half Duplex 최대 출력전압 ± 25 V ± 6 V -0. 25 V to +6 V -7 V to +12 V 최대 입력전압 ± 15 V ± 12 V -7 V to +7 V -7 V to +12 V • RS-232 C 케이블 길이 – RS-232 규격의 케이블 길이는 약 150 cm – 오른쪽 표 이상의 길이 이상의 케이블 사용의 – 경우 신호 증폭기나 Optical Isolator를 사용 Baud Rate Shielded Cable Non Shielded Cable 110 1500 m 300 1200 m 300 m 1200 900 m 150 m 2400 600 m 150 m 4800 150 m 75 m 9600 75 m 30 m 33

USART Source Code

USART Source Code

Program Pinout 특수 기능 범용 포트 ADC / Input USART / In. Out Address

Program Pinout 특수 기능 범용 포트 ADC / Input USART / In. Out Address & Data Bus / Output Address Bus / Output LED / Output 38

Transmitter Source #define #define F_CPU 16000000 //Clock Frequency : to use EX_SS_DATA (*(volatile unsigned

Transmitter Source #define #define F_CPU 16000000 //Clock Frequency : to use EX_SS_DATA (*(volatile unsigned char *)0 x 8002) EX_SS_SEL (*(volatile unsigned char *)0 x 8003) EX_SS_SW (*(volatile unsigned char *)0 x 0036) led_out (*(volatile unsigned char *)0 x 8008) util/delay. h //7 seg data //7 seg digit //Switch #include <avr/io. h> #include <avr/interrupt. h> #include <util/delay. h> const char segment_data[10] = {63, 6, 91, 79, 102, 109, 125, 39, 127, 103}; unsigned char display_num[4]={0, 0, 0, 0}; //7 segment digit unsigned char digit_num=0; volatile unsigned char adc_value = 0; //ADC Converted Value void port_init(void) { PORTA = 0 x 00; DDRA = 0 x. FF; PORTB = 0 x 00; DDRB = 0 x 00; PORTC = 0 x 00; DDRC = 0 x 0 F; PORTD = 0 x 00; DDRD = 0 x 00; PORTE = 0 x 00; DDRE = 0 x 02; PORTF = 0 x 00; DDRF = 0 x 00; PORTG = 0 x 00; DDRG = 0 x 00; } //1출력 0입력 to 7 segment, led // TIMER 0 initialize : prescale: 64 // WGM: Normal Mode // desired Clock : 1 KHz // actual value : 1 ms void timer 0_init(void) { ASSR = 0 x 00; //set async mode TCNT 0 = 0 x 06; //set count for 6 to 255 OCR 0 = 0 x 00; TCCR 0 = 0 x 04; //prescale 64 } // Timer 0 Overflow Interrupt Service Routine ISR(TIMER 0_OVF_vect) { TCNT 0 = 0 x 06; //reload counter value digit_num++; digit_num = digit_num % 4; //get Digit Selection Number EX_SS_DATA = segment_data[display_num[digit_num]]; //get segment data EX_SS_SEL = ~(0 x 01 << digit_num); //Digit Selection } //Low 8 bit output to 7 segment, led //TX Pin, output to USART // USART 0 Transmit Complete Interrupt Service Routine ISR(USART 0_TX_vect) { UDR 0 = adc_value; } //Port. F is Input from ADC 39

Transmitter Source /********************************** / UDR 0 / / UCSR 0 A / Bit 7

Transmitter Source /********************************** / UDR 0 / / UCSR 0 A / Bit 7 : RXC 0 - Receive Complete (Req Recive Complete INT) / Bit 6 : TXC 0 - Transmit Complete (Req Transmit Complete INT) / Bit 5 : UDRE 0 - Data Register Empty (trabsmit buffer empty INT) / Bit 4 : FE 0 - Fame Error / Bit 3 : DOR 0 - Data Overrun Error / Bit 2 : UPE 0 - Parity Error / Bit 1 : U 2 X 0 - Double Speed Mode / Bit 0 : MPCM 0 - Multi-Processor Communication Mode / / / / / UCSR 0 B Bit 7 : RXCIE 0 Bit 6 : TXCIE 0 Bit 5 : UDRIE 0 Bit 4 : RXEN 0 Bit 3 : TXEN 0 Bit 2 : UCSZ 0 n Bit 1 : RXB 80 Bit 0 : TXB 80 - RX Complete INT Enable - TX Complete INT Enable - Data REG empty INT Enable - Receiver Enable - Transmitter Enable - Character size 2 - Receive Data Bit 8 (MSB) - Transmit Data Bit 8 (MSB) / / / / / UCSR 0 C Bit 7 : Reserved Bit 6 : UMSEL 0 - Mode Select (1 - Sync, 0 - Async) Bit 5 : UPM 0 - Parity Mode (00 - Disable, 01 - reserved) Bit 4 : (10 - even , 10 - odd ) Bit 3 : USBS 0 - Stop Bit Select (0 - 1, 1 - 2) Bit 2 : UCSZ 0 n - Character size (000 - 5 bit, 001 - 6 bit, 010 - 7 bit) Bit 1 : (011 - 8 bit, 111 - 9 bit, etc - reve) Bit 0 : UCPOL 0 - Clock Plarity (in Sync mode) / UBRR 0 H/L / **********************************/ //USART 0 initialize function // desired baud rate: 9600 // actual: baud rate: 9615 (0. 2%) // char size: 8 bit // parity: Disabled void usart 0_init(void) { UCSR 0 B = 0 x 00; //disable while setting baud rate UCSR 0 A = 0 x 00; //INT clear, Error clear, Non 2 speed & MPCM UCSR 0 C = 0 x 06; //8 bit char size, 0000_0110 UBRR 0 H = 0 x 00; //set baud rate hi, must be post write high byte UBRR 0 L = 0 x 67; //set baud rate lo, 103 dec = 9600 baud rate UCSR 0 B = 0 x 48; //TX enable, TX INT enable : 0100_1000 } 40

Transmitter Source /*********************************** // ADCSRA // Bit 7 : ADEN - ADc ENable //

Transmitter Source /*********************************** // ADCSRA // Bit 7 : ADEN - ADc ENable // Bit 6 : ADSC - ADc Start Conversion // Bit 5 : ADFR - ADc Free-Running selection // Bit 4 : ADIF - ADc Interrupt Flag // Bit 3 : ADIE - ADc Interrupt Enable // Bit 2 : ADPS - ADc Prescaler Select // Bit 0 : 2 to 0 // ADMUX // Bit 7 : REFS - Reference Selection (default 01 - Ext. AVCC) // Bit 6 : 7 to 6 // Bit 5 : ADLAR - ADc Left Adjust Result // Bit 4 : MUX - Analog Channel and Gain Selection (default 00 xxx) // Bit 0 : 4 to 0 ***********************************/ void adc_init(void) { ADCSRA = 0 x 00; //disable adc ADMUX = 0 x 00; //select adc input 0 ACSR = 0 x 80; //set Analog Comparator disable ADCSRA = 0 x. C 6; //set ADCSRA 1100_0110 } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up asm("cli"); //disable all interrupts port_init(); adc_init(); timer 0_init(); usart 0_init(); MCUCR = 0 x 80; //enable int TIMSK = 0 x 01; //timer interrupt sources (MASK) T/C 0 Ovf flag asm("sei"); //re-enable interrupts } void start. Convertion(unsigned char ch) { ADMUX = 0 x 60 | ch; //Channel Selection ADCSRA = ADCSRA | 0 xc 0; //Enable ADC & Start ADC } unsigned char read. Convert. Data(void) { volatile unsigned char temp = 0; while((ADCSRA & 0 x 10)==0); //wait ADC Complete INT temp = ADCL; //ignore Lower 2 -bit temp = ADCH; //get Upper 8 -bit return temp; } 41

Transmitter Source int main() { volatile unsigned char sw; init_devices(); EX_SS_SW = 0; UDR

Transmitter Source int main() { volatile unsigned char sw; init_devices(); EX_SS_SW = 0; UDR 0 = 0 x. FF; while(1) { if(EX_SS_SW & 0 x. F) { switch(EX_SS_SW) { case 1: sw = case 2: sw = case 4: sw = case 8: sw = } led_out = EX_SS_SW; } start. Convertion(sw); //sw is ADC adc_value = read. Convert. Data(); display_num[0] = display_num[1] = display_num[2] = display_num[3] = _delay_ms(1000); } }return 0; } (adc_value % % 0; 1; 2; 3; break; input Channel 10000) / 1000; 1000) / 100; 100) / 10; 10); 42

Receiver Source #define F_CPU 16000000 //Clock Frequency : to use util/delay. h #include <avr/io.

Receiver Source #define F_CPU 16000000 //Clock Frequency : to use util/delay. h #include <avr/io. h> #include <avr/interrupt. h> #include <util/delay. h> const char segment_data[10] = {63, 6, 91, 79, 102, 109, 125, 39, 127, 103}; unsigned char display_num[4]={0, 0, 0, 0}; // Seven segment 4자리 숫자 출력 버퍼 unsigned char digit_num=0; volatile unsigned char get_val = 0; //usart 0 receive value void port_init(void) { PORTA = 0 x 00; DDRA = 0 x. FF; //7 SEG Data, output PORTB = 0 x 00; DDRB = 0 x 00; PORTC = 0 x 00; DDRC = 0 x 0 F; //7 SEG Digit Select, output PORTD = 0 x 00; DDRD = 0 x 00; PORTE = 0 x 00; DDRE = 0 x 00; //USART 0 RX pin is input PORTF = 0 x 00; DDRF = 0 x 00; PORTG = 0 x 00; DDRG = 0 x 00; } //TIMER 0 initialize - prescale: 64 // WGM: Normal // desired value: 1 KHz // actual value: 1. 000 KHz void timer 0_init(void) { TCCR 0 = 0 x 00; //stop ASSR = 0 x 00; //set async mode TCNT 0 = 0 x 06; //set count OCR 0 = 0 x 00; TCCR 0 = 0 x 04; //prescaler /64 } void usart 0_init(void) { UCSR 0 B = 0 x 00; //disable while setting baud rate UCSR 0 A = 0 x 00; //INT clear, Error clear, Non 2 speed & MPCM UCSR 0 C = 0 x 06; //8 bit char size, 0000_0110 UBRR 0 H = 0 x 00; //set baud rate hi, must be write high byte UBRR 0 L = 0 x 67; //set baud rate lo, 103 dec = 9600 baud rate UCSR 0 B = 0 x 90; //RX enable 1001_0000 } 43

Receiver Source //timer 0 ovf interrupt service routine ISR(TIMER 0_OVF_vect) { TCNT 0 =

Receiver Source //timer 0 ovf interrupt service routine ISR(TIMER 0_OVF_vect) { TCNT 0 = 0 x 06; //reload counter value digit_num++; digit_num = digit_num%4; PORTC = 0 x 0 f; PORTA = segment_data[display_num[digit_num]]; PORTC = ~(0 x 01 << digit_num); } //receive complete interrupt service routine ISR(USART 0_RX_vect) { get_val = UDR 0; } int main(void) { init_devices(); //Recieve Value print out while(1){ display_num[0] = (get_val display_num[1] = (get_val display_num[2] = (get_val display_num[3] = (get_val _delay_ms(1000); } % % 10000) / 1000; 1000) / 100; 100) / 10; 10); } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up asm("cli"); //disable all interrupts port_init(); timer 0_init(); usart 0_init(); MCUCR = 0 x 00; TIMSK = 0 x 01; //timer interrupt sources asm("sei"); //re-enable interrupts //all peripherals are now initialized } 44

Memory Map

Memory Map

Memory Map 132: 0 e 94 67 00 call 0 xce ; 0 xce

Memory Map 132: 0 e 94 67 00 call 0 xce ; 0 xce <port_init> // Bit 4 : MUX - Analog Channel and Gain Selection (default 00 xxx) // Bit 0 : 4 to 0 ***********************************/ void adc_init(void) { ADCSRA = 0 x 00; //disable adc 136: 16 b 8 out 0 x 06, r 1 ; 6 ADMUX = 0 x 00; //select adc input 0 138: 17 b 8 out 0 x 07, r 1 ; 7 ACSR = 0 x 80; //set Analog Comparator disable 13 a: 10 e 8 ldi r 17, 0 x 80 ; 128 13 c: 18 b 9 out 0 x 08, r 17 ; 8 ADCSRA = 0 x. C 6; //set 1100_0110 //더미 수행. 13 e: 86 ec ldi r 24, 0 x. C 6 ; 198 140: 86 b 9 out 0 x 06, r 24 ; 6 0 x 0000_0000 ~ 0 x 0000_0088 Interrupt Vector 0 x 0000_008 C ~ 0 x 0000_00 CA ATmega 128 Init_Funcs 0 x 0000_00 CE ~ 0 x 0000_00 F 8 Port_init() 0 x 0000_00 FA ~ 0 x 0000_0106 Timer 0_init() 0 x 0000_0108 ~ 0 x 0000_0114 ADC_init() 0 x 0000_0116 ~ 0 x 0000_012 C Usart 0_init() 0 x 0000_012 E ~ 0 x 0000_015 C Init_devices() 0 x 0000_015 E ~ 0 x 0000_0168 Start_convert () 0 x 0000_016 A ~ 0 x 0000_018 A read. Convert Data() 0 x 0000_018 C ~ 0 x 0000_01 FA ISR(TIMER 0_ OVF_VECT) Interrupt Vector 16 0 x 0000_01 FC ~ 0 x 0000_0218 ISR(USART 0_ TX_VECT) Interrupt Vector 20 0 x 0000_021 A ~ 0 x 0000_02 FA Main() 0 x 0000_02 FC ~ 0 x 0000_0360 Library_funcs 0 x 0000_0362 ~ 0 x 0000_0362 _exit() 0 x 0000_0364 ~ 0 x 0000_0364 _stop_progra m ※ Init과 동시에 수행되는 함수들의 경우 이 곳에 Asm Code가 포함이 됨 (adc_init, timer 0_init) 나머지는 call func_address의 형태를 가짐 (port_init, usart 0_init) 46

Test

Test

Diagram SP Configuration Data Copy Etc. Interrupt Vector ATmega 128 Init_Funcs TX_Complete_INT ISR(USART 0_

Diagram SP Configuration Data Copy Etc. Interrupt Vector ATmega 128 Init_Funcs TX_Complete_INT ISR(USART 0_ TX_VECT) Timer 0_Ovf_INT ISR(TIMER 0_ OVF_VECT) Interrupt Occur Main() Init_devices() Port_init() ADC_init() Timer 0_init() Usart 0_init() If(Switch On) Change ADC Channel R_ADMUX (ref. VCC, Channel) R_ADCSRA (ADC Start) R_TCNT 0 (Timer 0 Counter) R_UDR 0 (Transmit buffer) Background Operation Timer 0 Count USART 0 Transmit R_ADCL/H (ADC Result) Start_convert () read. Convert Data() 7 Seg_data set ADC Converter Wait ADC_Complete INT R_ARCSRA (ADC_COMP INT) R_ADCL. ADCH (ADC Result) ADC Complete Interrupt Occur Using 7 Seg_data for 7 seg Display _exit() 48

ADC Operation Time • KT-M 128 Clock Speed : 16 Mhz ADC Prescaler –

ADC Operation Time • KT-M 128 Clock Speed : 16 Mhz ADC Prescaler – 1 / 16, 000 = 0. 000 0625 s = 0. 0625 us – 각 프리스케일러별 Clcok 주기 • • • 2 = 0. 000, 125 s = 125 ns = 0. 125 us (8 Mhz) 8 = 0. 0, 005 s = 0. 5 us (2 Mhz) 16 = 0. 000, 001 s = 1 us (1 Mhz) 32 = 0. 000, 002 s = 2 us (0. 5 Mhz) 64 = 0. 000, 004 s = 4 us (0. 25 Mhz) 128 = 0. 000, 008 s = 8 us (0. 125 Mhz) • Total Operating Time ADC Operating Cycle – Normal Conversions, single ended = 14. 5 Clock – 각 프리스케일러별 ADC 연산에 필요한 총 소모 시간 (() : Cycle) • • • 2 = 125 ns * 14. 5 = 0. 0, 000, 018, 125 s = 1812. 5 ns = 1. 8125 us (26) 8 = 0. 5 us * 14. 5 = 0. 000, 007, 25 s = 7. 25 us (104) 16 = 1 us * 14. 5 = 0. 000, 014, 5 s = 14. 5 us (208) 32 = 2 us * 14. 5 = 0. 000, 029, 0 s = 29. 0 us (416) ※ ADC에서 Sampling시 데이터의 손실이 발생하지 않기 위해서는 최대 128 * 13 Cycle (1664)이내에 ADC의 결과를 가지고 하는 모든 연산을 끝내야 한다. 64 = 4 us * 14. 5 = 0. 000, 058 s = 58 us (832) 49 128 = 8 us * 14. 5 = 0. 000, 116 s = 116 us (1664)

Program Timing ADC Complete Start Convert 7 seg Display 24. 1875 us 387 clk

Program Timing ADC Complete Start Convert 7 seg Display 24. 1875 us 387 clk Previous Convert 2. 125 us 34 clk ADC_Complete 0. 4375 us 7 clk 7. 1875 us 115 clk Next Convert 7. 1875 us 115 clk t Get ADC Result If(SW_ON) Change Channel Read Convert Data Get ADC Result Main Loop t Each 1 ms Timer 0 ovf Interrupt Each 1 ms TX Comp Interrupt 0. 001(1 ms) / 0. 0000625 (16 Mhz) = 16000 cycle Timer 0 ovf Interrupt ADC START Each 1 ms TX Comp Interrupt ADC Complete Background USART Baud Rate : 9600 1 / 9600 = 0. 0001 sec 0. 0001 * 10 bit = 0. 001 = 1 ms 50

모듈 별 소모 Clock ATmega 128 Init_Funcs 약 (45) Main() (751) Init_devices() (31 +

모듈 별 소모 Clock ATmega 128 Init_Funcs 약 (45) Main() (751) Init_devices() (31 + (25) + (15)) = 71 Port_init() (25) ADC_init() (10) Timer 0_init() (10) Usart 0_init() (15) (33) If(Switch On) Change ADC Channel (34) ※ Main loop 및 ISR 소비 클럭 654 + 83 + 13 = 750 ※ 프리스케일러별 샘플링 주기 2 : 26 8 : 104 16 : 208 32 : 416 64 : 832 128 : 1664 (654) Interrupt Vector Interrupt Occur TX_Complete_INT ISR(USART 0_ TX_VECT)(13) Timer 0_Ovf_INT ISR(TIMER 0_ OVF_VECT)(83) Background Timer 0 Count USART 0 Transmit ADC Converter Start_convert () (7) Wait ADC_Complete INT (5 * X) read. Convert Data() (33) 7 Seg_data set Pre-scaler : 64 832(sampling time) – 654 (Main loop) – 96(ISRs) = 82 / 5 = 16. 4 (387) _exit() 51

Optimize Option • Project -> Configuration Options -> Optimization 53

Optimize Option • Project -> Configuration Options -> Optimization 53

Optimize Option Optimization : -O 0 No Optimization : -O 2 The compiler does

Optimize Option Optimization : -O 0 No Optimization : -O 2 The compiler does not perform loop Unrolling or function inling. Optimization : -O 1 Reduce code size and execute time, without performing any optimization Optimization : -Os Optimize for Code size. -Os enables all –O 2 optimizations that do not typically increase code size. Reference : C: Win. AVR-20100110docgccHTMLgcc-4. 3. 2gccOptimize-Options 54

1 2 3 56

1 2 3 56

57

57