<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

Similar documents
<4D F736F F D20C0DBC7B0C6ED5FBDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCAD20B0B3B9DF2E646F63>

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 F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

ATmega128

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

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

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

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

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

시리얼통신 (USART) 범용동기및비동기시리얼수신기와송신기 (USART) 는매우유연한시리얼통신장치이다. 주요특징은다음과같다. w 송수신레지스터가독립적으로운용되는전이중방식. w 비동기또는동기동작. w 마스터또는슬레이브동기동작. w 고해상도전송속도생성기. w 5, 6, 7

K&R2 Reference Manual 번역본

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

lecture4(6.범용IO).hwp

[8051] 강의자료.PDF

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

슬라이드 1

<BDC7C7E83520BFB9BAF1BAB8B0EDBCAD2E687770>

PowerPoint 프레젠테이션

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

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

untitled

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

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

C & System

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

KXATUHEFFPYO.hwp

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

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

목차 1. 키패드 (KeyPAD) 2. KeyPAD 를이용한비밀번호입력기

<30302E20BEC6C6AEB8E120BDBAC6A9B5F0BFC020BFACBDC0B9AEC1A620C7D8B4E42E687770>

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

Microsoft PowerPoint - polling.pptx

슬라이드 1

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

CANTUS Evaluation Board Ap. Note

Microsoft Word doc

M16_32KIT_Manual.hwp

PowerPoint 프레젠테이션

C++-¿Ïº®Çؼ³10Àå

chap 5: Trees

2. Deferred Interrupt Processing A. Binary Semaphores를이용한동기 (Synchronization) i. Binary Semaphores는 Interrupt가발생하였을때특정한 를 Unblock 하는데사용할수있다. 이러한기능은 In

Microsoft PowerPoint - ch07 - 포인터 pm0415

Microsoft PowerPoint - 08-MP-4-interrupt

Microsoft PowerPoint - AVR 시리얼 통신.ppt [호환 모드]

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

MPLAB C18 C

2주차: 입출력 제어 복습

T100MD+

KEY 디바이스 드라이버

Microsoft PowerPoint - 08-MP-8-ADC

키트전자 KE-RC-B 코드비젼

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

CodevisionAVR C compiler 사용법 ( 요약 ) (1) 1.1 마이크로프로세서시스템회로도및동작 마이크로콘트롤러 ATmega128 내부회로도 AVR 의구조및종류 ATmega128 Pin 배치및내장 I/O 종류 A

WATAVR128_manual.hwp

ZPONZCMGOVQK.hwp

I/O (GPIO) 제어 I/0 제어 ATmega128의 I/O 구성및특징 I/O PORT 구성 8비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT A ~PORT F) 6개 5비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT G) 1개 I/O PORT 특징

AN2629

목차 1. ATMega128의외부메모리인터페이스 2. TEXT LCD 3. TEXT LCD에글자쓰기 4. SRAM 5. 외부메모리인터페이스에 SRAM붙이기

PowerPoint 프레젠테이션

Microsoft Word - FS_ZigBee_Manual_V1.3.docx

PowerPoint 프레젠테이션

RVC Robot Vaccum Cleaner

untitled

PowerPoint 프레젠테이션

금오공대 컴퓨터공학전공 강의자료

Line (A) å j a k= i k #define max(a, b) (((a) >= (b))? (a) : (b)) long MaxSubseqSum0(int A[], unsigned Left, unsigned Right) { int Center, i; long Max

본 강의에 들어가기 전

Microsoft PowerPoint - 9.Serial.pptx

Microsoft PowerPoint - 제7장 타이머와 PWM (HBE-MCU-Multi AVR).ppt [호환 모드]

untitled

중간고사

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

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

Microsoft PowerPoint - chap06-2pointer.ppt

1. 제품소개 그림. 1.1 이란? DC 모터구동시하드웨어제작에소요되는시간을단축시켜프로그래밍연구개발및학습효과를극대화시켜주는 입니다. 또한당사 DEV 보드와 1P 점퍼클립케이블을이용하여연동이가능하며, 산업용 DC 모터의정회전, 역회전구동및속도제어시유용하게사용되는 입니다.

Microsoft PowerPoint - ccs33_bios_com1_semaphore.ppt [호환 모드]

Microsoft Word - AM-2560PRO_V01 메뉴얼.doc

Microsoft PowerPoint - ccs33_bios_PRD.ppt [호환 모드]

<4D F736F F F696E74202D2037C0E55FC0CCC0C0C7F55FBFCFBCBA205BC8A3C8AF20B8F0B5E55D>

2009년2학기 임베디드시스템 응용

Microsoft PowerPoint - chap05-제어문.pptx

PowerPoint 프레젠테이션

C 프로그래밊 개요

untitled

슬라이드 1

ATmega128 교재 - 8장 EEPROM.hwp

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft Word - DTM-M300_Spec_V1_0.doc

C프로-3장c03逞풚

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

11장 포인터

BMP 파일 처리

강의10

Transcription:

라인트레이서강좌 4. 프로그래밍 2005년 8월 1일류대우 (davidryu@newtc.co.kr) 1. 라인트레이서란? 라인트레이서는정해진주행선을따라움직이는자율이동로봇이다. 현재공장자동화부분에서이용되고있는무인반송차가라인트레이서이다. 라인트레이서의기본적인원리는주어진주행선을센서로검출하여이것에따라목적위치까지이동하는것이다. 라인트레이서는크게 3부분 - 컨트롤러부, 센서부, 모터구동부로구성된다. 우선센서부의센서를잘배치해야길을잘인식하고턴마크인식할수있다. 모터구동부분은잡음이많이생기기때문에잘만들지않으면잡음으로인해다른부분이정상적으로동작하지못하는경우가생길수있다. 컨트롤러부는기본적인라인트레이서를제작할때는상대적으로비중이낮으나지능적으로만들려면많은작업이필요로한다. 본강좌에서는라인트레이서를공부하여만들고자하는초보자를위한강좌이므로라인트레이서로서의동작에목표를두고최대한간단하게동작시킬수있도록한다. 2. 라인트레이서의기본동작알고리즘라인트레이서기본동작센서 2쌍을라인의두께보다약간크게위치하여하드웨어를제작할경우센서가라인외곽을따라주행하도록한다. 더복잡하게할수도있지만여기서는위와같이가장간단한알고리즘으로알아보겠다.

1 번상황에서센서는라인을감지하지못하였으므로직진한다. 2 번상황에서오른쪽센서가인식되었으므로왼쪽바퀴의속도를증가시켜라인트레이서를오른쪽으로향하게한다. 3 번상황에서왼쪽센서가인식되었으므로오른쪽바퀴의속도를증가시켜라인트레이서를왼쪽으로향하게한다. 위의동작을반복하면라인트레이서는라인을따라진행하게된다. 3. 프로그래밍하기기본적인 C 언어프로그래밍과인터럽트에관한공부를먼저해야한다. C언어와인터럽트에관련해서는관련서적에서자세히나와있으므로이강좌에서는다루지않는다. 1 타이머인터럽트를이용하여스테핑모터구동하기타이머인터럽트를학습하여타이머인터럽트를이용하여스테핑모터구동해본다. 라인트레이서는스테핑모터를 2개구동해야하기때문에타이머인터럽트를 2개사용하여타이머인터럽트각각바퀴 1개씩을구동하도록한다. 2 센서입력받기센서의입력을받아흰색과검정색을구분할수있도록한다. 시리얼통신을이용하여값을확인하면쉽게할수있다. 3 메인함수와인터럽트루틴간의데이터공유메인함수에서는속도를변경하면타이머인터럽트에서변경된속도값을타이머에적용하여스테핑모터의속도를변경할수있도록한다. 그렇게하기위해서는속도값을전역변수로선언하여메인함수와인터럽트루틴이공유할수있도록해야한다. 4 센서입력에따른스테핑모터속도변경왼쪽센서입력이있을경우왼쪽스테핑모터의속도를감소시키고오른쪽센서입력이있을경우오른쪽스테핑모터의속도를감소시키도록프로그램을작성한다.

4. 예제프로그램 1 타이머인터럽트를이용하여스테핑모터구동하기아래소스는타이머 2 인터럽트의초기화루틴이다. void timer2_init(void) TCCR2 = 0x00; //stop TCNT2 = 0xF1; //setup OCR2 = 0x0F; TCCR2 = 0x04; //start 아래소스는타이머 2 인터럽트의인터럽트서비스루틴이다. void timer2_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts temp = PORTD & 0x0f; TCNT2 = l_speed; //reload counter value if(l_speed == 0) temp = temp; else temp = motoroneclock(temp, 1); PORTD = temp (PORTD & 0xf0); SEI(); //re-enable interrupts

2 센서입력받기아래소스는 AD Convert 의구동소스이다. startconvertion 함수는해당채널의컨버팅을시작하라는함수이고 readconvertdata 함수는컨버팅한채널의데이터를읽어오라는함수이다. void startconvertion(unsigned char ch) ADMUX = 0x20 (ch & 0x0f); ADCSRA = 0xc7; unsigned char readconvertdata(void) volatile unsigned char temp; while((adcsra & 0x10)==0); ADCSRA = ADCSRA 0x10; temp = ADCH; temp = ADCL; temp = ADCH; return temp; 3 메인함수루틴다음소스는메인함수에서수행되는무한루프로센서가연결되어있는 6번과 7번센서를컨버팅하여변수에저장시키고이것을임계값과비교하여왼쪽바퀴와오른쪽바퀴의속도를결정하도록하였다. void main(void) volatile unsigned char temp, l_sensor, r_sensor; volatile unsigned char step=0; while(1) l_sensor = 0; r_sensor = 0;

startconvertion(6); // Left sensor Converting l_sensor = readconvertdata(); startconvertion(7); // Right sensor Converting r_sensor = readconvertdata(); PORTF = 0x03; if(l_sensor > THRESHOLD && r_sensor < THRESHOLD) l_speed = SLOW_SPEED; r_speed = FAST_SPEED; PORTF = 0x01; else if(l_sensor < THRESHOLD && r_sensor > THRESHOLD) l_speed = FAST_SPEED; r_speed = SLOW_SPEED; PORTF = 0x02; else l_speed = FAST_SPEED; r_speed = FAST_SPEED; printf("ch6 :%d ch7 : %d\n\r", l_sensor, r_sensor); 5. 소스코드 // LineTracer Application // Target : M128 // Crystal: 11.059Mhz // Programed by Minsuk Kim #include <iom128v.h> #include <macros.h> #define FAST_SPEED 0x80 // 센서가감지되었을때빠른바퀴의센서값 #define SLOW_SPEED 0x10 // 센서가감지되었을때느린바퀴의센서값

#define THRESHOLD 17 // 센서의라인감지임계값 unsigned char l_speed=0, r_speed=0; // 모터를구동위한타이머값 void port_init(void) PORTA = 0x00; DDRA = 0x00; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; DDRC = 0x00; PORTD = 0x00; DDRD = 0xff; PORTE = 0x00; DDRE = 0x00; PORTF = 0x00; DDRF = 0x03; PORTG = 0x00; DDRG = 0x00; // Stepping Motor Port Left, Right // LED Port PF1, PF2 //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; UCSR0C = 0x06; UBRR0L = 0x47; //set baud rate lo UBRR0H = 0x00; //set baud rate hi UCSR0B = 0x08;

//ADC initialize // Conversion time: 75uS void adc_init(void) ADCSRA = 0x00; //disable adc ADMUX = 0x00; //select adc input 0 ACSR = 0x80; ADCSRA = 0xC6; //TIMER2 initialize - prescale:64 // WGM: Normal // desired value: 1KHz // actual value: 1.008KHz (0.8%) void timer2_init(void) TCCR2 = 0x00; //stop TCNT2 = 0xF1; //setup OCR2 = 0x0F; TCCR2 = 0x04; //start #pragma interrupt_handler timer2_ovf_isr:11 void timer2_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts temp = PORTD & 0x0f; TCNT2 = l_speed; //reload counter value if(l_speed == 0) temp = temp; else

temp = motoroneclock(temp, 1); PORTD = temp (PORTD & 0xf0); SEI(); //re-enable interrupts //TIMER3 initialize - prescale:64 // WGM: 0) Normal, TOP=0xFFFF // desired value: 1KHz // actual value: 1.008KHz (0.8%) void timer3_init(void) TCCR3B = 0x00; //stop TCNT3H = 0xFF; //setup TCNT3L = 0xF1; OCR3AH = 0x00; OCR3AL = 0x0F; OCR3BH = 0x00; OCR3BL = 0x0F; OCR3CH = 0x00; OCR3CL = 0x0F; ICR3H = 0x00; ICR3L = 0x0F; TCCR3A = 0x00; TCCR3B = 0x04; //start Timer #pragma interrupt_handler timer3_ovf_isr:30 void timer3_ovf_isr(void) unsigned char temp; CLI(); //disable all interrupts //TIMER3 has overflowed TCNT3H = 0xFF; //reload counter high value

temp = (PORTD & 0xf0)>>4; TCNT3L = r_speed; //reload counter low value if(r_speed == 0) temp = temp; else temp = motoroneclock(temp, 0); PORTD = (temp<<4) (PORTD & 0x0f); SEI(); //re-enable interrupts //call this routine to initialize all peripherals void init_devices(void) //stop errant interrupts until set up CLI(); //disable all interrupts XDIV = 0x00; //xtal divider XMCRA = 0x00; //external memory port_init(); uart0_init(); adc_init(); timer2_init(); timer3_init(); MCUCR = 0x00; EICRA = 0x00; //extended ext ints EICRB = 0x00; //extended ext ints EIMSK = 0x00; TIMSK = 0x40; //timer interrupt sources ETIMSK = 0x04; //extended timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized

/* Analog Converter--------------------------------*/ void startconvertion(unsigned char ch) ADMUX = 0x20 (ch & 0x0f); ADCSRA = 0xc7; unsigned char readconvertdata(void) volatile unsigned char temp; while((adcsra & 0x10)==0); ADCSRA = ADCSRA 0x10; temp = ADCH; temp = ADCL; temp = ADCH; return temp; /*-------------------------------------------------*/ void delay(int n) volatile int i,j; for(i=1;i<n;i++) for(j=1;j<600;j++); /* Stepping Motor derive---------------------------*/ unsigned char motoroneclock(unsigned char step, char dir) unsigned char test; step = step & 0x0f; if(dir) switch(step)

case 0x03 : step=0x06; break; case 0x06 : step=0x0c; break; case 0x0c : step=0x09; break; case 0x09 : step=0x03; break; default : step=0x03; break; else switch(step) case 0x03 : step=0x09; break; case 0x06 : step=0x03; break; case 0x0c : step=0x06; break; case 0x09 : step=0x0c; break; default : step=0x03; break; return step; /* main function-----------------------------------*/ void main(void) volatile unsigned char temp, l_sensor, r_sensor; volatile unsigned char step=0; init_devices(); //insert your functional code here... printf(" \n\n\rtest program...\n\r"); PORTF = 0x03; delay(1000); PORTF = 0x00; delay(1000); PORTF = 0x03;

while(1) l_sensor = 0; r_sensor = 0; startconvertion(6); // Left sensor Converting l_sensor = readconvertdata(); startconvertion(7); // Right sensor Converting r_sensor = readconvertdata(); PORTF = 0x03; if(l_sensor > THRESHOLD && r_sensor < THRESHOLD) l_speed = SLOW_SPEED; r_speed = FAST_SPEED; PORTF = 0x01; else if(l_sensor < THRESHOLD && r_sensor > THRESHOLD) l_speed = FAST_SPEED; r_speed = SLOW_SPEED; PORTF = 0x02; else l_speed = FAST_SPEED; r_speed = FAST_SPEED; printf("ch6 :%d ch7 : %d\n\r", l_sensor, r_sensor); 6. Epilogue 하드웨어를공부하는데있어서펌웨어프로그래밍은매우중요한부분이다. 본인스스로프로그램을작성하여멋진라인트레이서를만들어보기바란다.