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

Similar documents
ATmega128

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

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

2주차: 입출력 제어 복습

가. 도트매트릭스제어하기 단일 LED와는다르게도트매트릭스를구동시는구동전류가프로세서에서출력되는전류보다사용량을더많이필요하기때문에 TTL 계열의 IC로구동시키기에는무리가따른다. 이러한문제를해결하기위해서사용전압, 전류정격이높은달링턴트랜지스터가어레이형태로들어있는 ULN2803을

<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

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

Microsoft PowerPoint - 08-MP-8-ADC

MAX232 MAXIM사에서생산되는 RS-232통신을가능토록해주는송수신 IC이다. 송수신드라이브를각각 2개씩가지고있다. AVR과컴퓨터가인식하는 0과 1의값이다르기때문에.. 마이컴컴퓨터 이차이를해결해주는것이다. 0 0V -10V 1 5V 10V TTL IC 의전원단자와다

// 변수선언 unsigned char i; unsigned char FONT[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xD8, 0x80, 0x98}; //PORTA 를출력으로설정하고초기값은모두 0 PORTA = 0x00; DD

M16_32KIT_Manual.hwp

ZPONZCMGOVQK.hwp

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

OCW_C언어 기초

슬라이드 1

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

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

뉴티씨 (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

PowerPoint 프레젠테이션

K&R2 Reference Manual 번역본

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

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

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

실험 5

untitled

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

BY-FDP-4-70.hwp

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

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

lecture4(6.범용IO).hwp

개요

PowerPoint Presentation

<4D F736F F F696E74202D203137C0E55FBFACBDC0B9AEC1A6BCD6B7E7BCC72E707074>

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

BS-K1217-M□□-3012_ProductGuide_KR_PDF

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

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

실험 5

온습도 판넬미터(JTH-05) 사양서V1.0

[8051] 강의자료.PDF

(SW3704) Gingerbread Source Build & Working Guide

6_5상 스테핑 모터_ _OK.indd

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

PowerPoint 프레젠테이션

Microsoft Word - PLC제어응용-2차시.doc

RVC Robot Vaccum Cleaner

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

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A636C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

(6)

1. 제품소개 1.1 제품소개 < 그림 1.1> 도트매트릭스모듈 하드웨어제작에소요되는시간을단축시켜프로그래밍연구개발및학습효과를극대화시켜주는 16x16 도트매트릭스모듈입니다. 또한당사 AVR, PIC, ARM(STM32F) 개발보드와 1P 점퍼클립케이블을이용하여연동이가능하

Microsoft PowerPoint - chap06-1Array.ppt

KMC.xlsm

중간고사

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

ISP and CodeVisionAVR C Compiler.hwp

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

(b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로

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

chap 5: Trees

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 Word - AM-2560PRO_V01 메뉴얼.doc

(b) 연산증폭기슬루율측정회로 (c) 연산증폭기공통모드제거비측정회로 그림 1.1. 연산증폭기성능파라미터측정회로

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

PowerPoint 프레젠테이션

COMFILE_VOL13_ cdr

목차 1부. 보드 운영체제와 MCU 보드의 포트 2부. 전압과 전류 그리고 모터 드라이버 3부. 초음파 센서 4부. BOS Script 프로그래밍 5부. W2R -1 소개

KEY 디바이스 드라이버

ATmega128 교재 - 8장 EEPROM.hwp

1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

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

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

Microsoft PowerPoint - chap06-2pointer.ppt

PowerPoint 프레젠테이션

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

11장 포인터

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

Microsoft Word - DCMD-1000 사용자 메뉴얼.docx

<4D F736F F D20C0DBC7B0C6ED5FBDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCAD20B0B3B9DF2E646F63>

BMP 파일 처리

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

Microsoft Word - PEB08_USER_GUIDE.doc

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

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

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

Microsoft PowerPoint - ch07 - 포인터 pm0415

untitled

PowerPoint Presentation

Section 03 트랜지스터를이용한스위칭동작 16/45 트랜지스터의직류특성 활성 직류상황에서전류 I C 는전류 I B 보다 h FE 배만큼더많은전류가흐름» 베이스와이미터가순방향으로바이어스» 컬렉터와베이스가역방향으로바이어스 차단 만일 I B 가 0[A] 이면컬렉터전류

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

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

SMT Kor.indd

Microsoft Word - AM-SLCD_시리얼 LCD_ 메뉴얼.doc

OSTSen-PIR100 사용자설명서 Ver 1.1 Onsystech OSTSen-PIR100 V1.1 1 of 8 Onsystech

PowerPoint 프레젠테이션

Transcription:

-------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-13 코드비젼 -------------------------------------------------------- 1. LED 점등 -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> #define LT_FWD_L PORTB.0 좌측헤드라이트 #define LT_BRAKE PORTD.4 브레이크등 #define LT_BACK PORTD.5 후진등 #define LT_CURVE_L PORTD.6 좌측깜박이등 #define LT_CURVE_R_ON (PORTG =0x02) PG1 우측깜박이등 #define LT_CURVE_R_OFF (PORTG&=~0x02) PG1 우측깜박이등 #define LT_FWD_L_ON (PORTG =0x04) PG2 우측헤드라이트 #define LT_FWD_L_OFF (PORTG&=~0x04) PG2 우측헤드라이트 void main(void){

int i; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; while(1){ 전체 led 점멸 for(i=0;i<3;i++){ LT_CURVE_L=1; LT_FWD_L=1; LT_FWD_L_ON; LT_CURVE_R_ON; LT_BACK=1; LT_BRAKE=1; delay_ms(400); LT_CURVE_L=0; LT_FWD_L=0; LT_FWD_L_OFF; LT_CURVE_R_OFF; LT_BACK=0; LT_BRAKE=0; delay_ms(100); --------------------------- led 순차점등 for(i=0;i<3;i++){ LT_CURVE_L=1; delay_ms(400); LT_CURVE_L=0; delay_ms(100); 좌측깜박이등 LT_FWD_L=1; delay_ms(400); LT_FWD_L=0; delay_ms(100); 좌측헤드라이트 LT_FWD_L_ON; delay_ms(400); LT_FWD_L_OFF; delay_ms(100); 우측헤드라이트 LT_CURVE_R_ON; delay_ms(400); LT_CURVE_R_OFF; delay_ms(100); 우측깜박이등 LT_BACK=1; delay_ms(400); LT_BACK=0; delay_ms(100); 후진등 LT_BRAKE=1; delay_ms(400); LT_BRAKE=0; delay_ms(100); 브레이크등 프로그램을작성할때의순서는출력부터소스를만들어서구동합니다. 출력이이상이없도록만들고난후에입력은체크를마친출력을이용해서확인합니다. 저항은 1K 를사용했으며, 밝게키고싶으면저항을낮추면됩니다. 20mA 고휘도 LED 경우에는일반적인정격전압은아래와같습니다. 백색, 청색, 녹색 3.2V 황색, 적색 2.1V 10mA 일반 LED 경우에는일반적인정격전압은적색, 황색, 녹색 2.1V입니다.. FND에사용되는적색 LED 경우에는 1.8V짜리도있습니다. 스코프가있는분은파형을측정해보세요 ( 저항과 LED에걸리는전압체크 ) 헤드라이트용 LED는고휘도백색을구입하지못하고녹색을구입했는데고휘도가아닌일반타입입니다. 20mA 정격의고휘도타입이든, 10mA 정격의일반타입이든 5V에 1K 저항을사용하여서작은전류를흘리고있으므로정격전압보다낮은전압이나타나게됩니다. 저항에걸리는전압 = 5V - LED전압저항에흐르는전류 = (5V - LED전압 ) / 1000(1K)

1K 저항에는대략 3V 가조금넘는전압이걸리니, 3mA 가조금넘겠습니다. 아래 LED 전압스코프사진을올립니다.

-------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-13 코드비젼 -------------------------------------------------------- 2. lcd test -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> #define lcd_rs PORTC.0 #define lcd_rw PORTC.1 #define lcd_e PORTC.2 #define SRF04_TRG3 PORTC.3 #define lcd_out PORTC PORTC.4~7 4bits flash char str1[]= "KIT ELECTRONICS "; flash char str2[]= " line tracer "; char str[30]; void lcddata(char d){ lcd_rs=1; lcd_out=(lcd_out&0x08) (d&0xf0) 1; lcd_e=1; lcd_e=0; delay_us(1); lcd_out=(lcd_out&0x08) (d<<4) 1; lcd_e=1; lcd_e=0; delay_us(50); void lcdcmd(char c){ lcd_rs=0; lcd_out=(lcd_out&0x08) (c&0xf0); lcd_e=1; lcd_e=0; delay_us(1); lcd_out=(lcd_out&0x08) (c<<4); lcd_e=1; lcd_e=0; delay_ms(5); void lcd_init(void){ delay_ms(50); DDRA=0xFF; lcd port output lcdcmd(0x28); lcdcmd(0x28); lcdcmd(0x28); lcdcmd(0x0c); lcdcmd(0x06); lcdcmd(0x01); delay_ms(30); void lcd_gotoxy(char x, char y){ if (y==0)lcdcmd(0x80+x); else if(y==1)lcdcmd(0xc0+x); else if(y==2)lcdcmd(0x94+x); else if(y==3)lcdcmd(0xd4+x); void lcd_puts(char *str){ while(*str)lcddata(*str++);

void lcd_putsf(char flash *str){ while(*str)lcddata(*str++); void main(void){ int i; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; lcd_init(); lcd_gotoxy(0,0); lcd_putsf(str1); delay_ms(2000); while(1){ for(i=0;i<100;i++){ lcd_gotoxy(0,0); lcd_putsf(str2); sprintf(str," RC car %3d ",i); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(10); http:cafe.naver.com/circuitsmanual/5381 코드비젼 CLCD - 만든함수로 4비트구동하기 LED/FND/LCD 상기코드를일부수정해서만들었습니다. #define SRF04_TRG3 PORTC.3 PC3 을초음파센서용트리거신호로사용하기위해서코드가조금복잡해졌습니다. void lcddata(char d){ lcd_rs=1; lcd_out=(lcd_out&0x08) (d&0xf0) 1; lcd_e=1; lcd_e=0; delay_us(1); 데이터상위4비트전송 lcd_out=(lcd_out&0x08) (d<<4) 1; lcd_e=1; lcd_e=0; delay_us(50); 데이터하위4비트전송 void lcdcmd(char c){ lcd_rs=0; lcd_out=(lcd_out&0x08) (c&0xf0); lcd_e=1; lcd_e=0; delay_us(1); 컴맨드상위4비트전송 lcd_out=(lcd_out&0x08) (c<<4); lcd_e=1; lcd_e=0; delay_ms(5); 컴맨드하위4비트전송 색칠한부분은 PC3 출력을변경하지않기위한비트마스크용 AND 연산입니다. 컴맨드함수의마지막부분에사용된딜레이 5ms는대부분의컴맨드가저렇게긴딜레이를필요로하지않지만일부긴딜레이를요구하는컴맨드가있어서가장긴시간기준으로그보다좀더긴딜레이를사용했습니다. 줄여서문제가생기지않는다면줄여도됩니다. LCD 의기초가부족한분들은카페왼쪽 128LCD 강좌게시판의글을공부하시면됩니다. for(i=0;i<100;i++){ lcd_gotoxy(0,0); lcd_putsf(str2); sprintf(str," RC car %3d ",i); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(10); 간단한테스트용코드라서설명이필요없을겁니다.

딜레이가짧아서숫자가명확히안보입니다. 딜레이는적당히늘리면됩니다. void lcdcmd(char c){ lcd_rs=0; lcd_out=(lcd_out&0x08) (c&0xf0); lcd_e=1; lcd_e=0; delay_us(1); lcd_out=(lcd_out&0x08) (c<<4); lcd_e=1; lcd_e=0; delay_ms(2); for(i=0;i<100;i++){ lcd_gotoxy(0,0); lcd_putsf(str2); sprintf(str," RC car %3d ",i); lcd_gotoxy(0,1); lcd_puts(str); delay_ms(10); 컴맨드함수의딜레이를 2ms로줄이고, 메인의 for() 문딜레이를삭제하고돌리면가장빠른루프타입이됩니다.

-------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-13 코드비젼 -------------------------------------------------------- 3. RC_Servo test -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> void RC_Servo(int angle){ angle : -90도 ~ +90도 int i; if(angle<-90)angle=-90; if(angle> 90)angle= 90; i=(angle)*18 + 3000; OCR1A=i; PB5 void main(void){ int i,k; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; TCCR1A=0xAA; TCCR1B=0x1B; ICR1=40000; FAST PWM, 0.5usec*40000=20msec=50Hz while(1){ servo 90도씩회전 for(i=0;i<3;i++){ RC_Servo(-90); delay_ms(350); RC_Servo( 0); delay_ms(350); RC_Servo( 90); delay_ms(350); RC_Servo( 0); delay_ms(350); --------------------------- servo 1도씩회전 RC_Servo(-90); delay_ms(1000); 초기위치로이동 for(k=-90;k<= 90;k++){ RC_Servo(k); delay_ms(20); cw for(k= 90;k>=-90;k--){ RC_Servo(k); delay_ms(20); ccw RC_Servo( 0); delay_ms(350); 카페서보모터소스에서는 24ms 주기로동작시키고있지만 TCCR1A=0xAA; TCCR1B=0x1A; OCR1A=3000; ICR1=47999; servo pwm 라인트레이서구동소스에서는 20ms로구동하고있습니다. TCCR1A=0x2A; TCCR1B=0x1B; ICR1=40000; FAST PWM, 0.5usec*40000=20msec=50Hz L298의 PWM 출력에타이머1의나머지두개를할당하기위해서 50Hz 주기로 DC모터와서보모터를함께구동하고있습니다.

pwm 모드를상세하게설명해드리긴시간상어렵고간단히설명하면 fast pwm모드 14에서는 ICR1이주기를결정하는레지스터이고 TCNT1이 0부터 ICR까지증가한후 ICR레지스터와같아지면다시 0부터증가합니다. PWM은 TCNT1 카운터가 0일때어떤값이출력되고중간에 OCR1과같아지면출력이반전됩니다. 반대로도출력할수있으며데이터시트에서아래두개의레지스터를공부하세요 TCCR1A=0xAA; TCCR1B=0x1A; 이설정으로는 TCNT0에서 high가출력되고 OCR1과같아지면 low가출력됩니다. TCCR1A=0xFE; 설정을바꾸면처음에 low가출력되다가 OCR1과같아지면 high가출력됩니다. ICR을 40000으로설정했으므로듀티 10% 를주기위해서는 TCCR1A=0xAA; TCCR1B=0x1A; 이설정에서는 OCR1A=4000; 을설정하면되지만 TCCR1A=0xFE; TCCR1B=0x1A; 이설정에서는 OCR1A=40000-4000; 으로설정해야합니다. 어느때필요하냐.. 처음부터 high이므로듀티0을출력해도아주짧은펄스가발생됩니다. 모터처럼아주작은전력에서는꿈쩍도하지않는부하는상관없지만 LED라든가민감한부하는문제가생길수도있고, 이런경우에사용하면됩니다. 예제의딜레이는제가테스트해서짧은시간으로설정한것인데딜레이가부족하면미처다이동하기전에다른각도로넘어가버릴수있습니다. 모터가지령받은각도까지이동할수있도록충분한딜레이를줘야합니다.

시리얼통신 왼쪽 DSUB 커넥터가블루투스설정시사용하는커넥터이고오른쪽은 UART0으로 PC와연결하는용도의 RS-232 커넥터입니다.

점퍼위치에따라서 FB155BC 가 AVR 과연결되거나 PC 와연결됩니다.

불루투스설정에관해서는 http:cafe.naver.com/circuitsmanual/70224 이글을참고하세요. -------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-13 코드비젼 -------------------------------------------------------- 4. 시리얼문자전송 test -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> 시리얼0 수신인터럽트 void TX0_CH(char ch){ while(!(ucsr0a&0x20)); UDR0=ch; 송신함수 char RX0_CH(void) { while(!(ucsr0a&0x80)); return UDR0; 수신함수 interrupt [USART0_RXC] void usart0_rx_isr(void){ 수신인터럽트 unsigned char R0data; R0data=UDR0; 시리얼1 수신인터럽트 void TX1_CH(char ch){ while(!(ucsr1a&0x20)); UDR1=ch; 송신함수 char RX1_CH(void) { while(!(ucsr1a&0x80)); return UDR1; 수신함수 interrupt [USART1_RXC] void usart1_rx_isr(void){ 수신인터럽트 unsigned char R1data; R1data=UDR1; void main(void){ char k; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; TCCR1A=0xAA; TCCR1B=0x1A; ICR1=40000; servo pwm while(1){ --------------------------- 시리얼문자전송 UCSR0B=0x18; UBRR0H=0; UBRR0L=103; 9600, 송신, 수신함수 UCSR1B=0x18; UBRR1H=0; UBRR1L=103; 9600, 송신, 수신함수 for(k='a';k<='z';k++){ TX0_CH(k); UART0 RS-232 TX1_CH(k); UART1 블루투스 delay_ms(100); 100ms마다알파벳대문자 A 부터 Z 까지전송하는간단한예제입니다.

아래쪽스코프 2번채널이 AVR에서송신하는데이터의 TTL 레벨파형이고위쪽스코프 1번채널이 MAX232를거친 RS-232 레벨의파형입니다. AVR TXD 단자는데이터를보내지않을때 high 레벨이며, RS-232 출력은 -12V( 실제로는 -5.7V) 입니다. 논리적으로반전되어있으므로 MAX232 데이터시트의논리기호는 NOT게이트로되어있습니다. 아래 MAX232 데이터시트그림참고

TI 사의 MAX232 데이터시트입니다. -------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-18 코드비젼 -------------------------------------------------------- 5. DC모터 test -------------------------------------------------------- #include <mega128.h> #include <delay.h> #define L298_2_EN PORTB.6 #define L298_1_EN PORTB.7 #define L298_2_A1 PORTE.2 #define L298_2_A2 PORTE.3 #define L298_1_A1_ON (PORTG =0x08) PG3 #define L298_1_A1_OFF (PORTG&=~0x08) PG3 #define L298_1_A2_ON (PORTG =0x10) PG4 #define L298_1_A2_OFF (PORTG&=~0x10) PG4 void motor_lf(void) { L298_2_EN=1; L298_2_A1=1; L298_2_A2=0; void motor_lb(void) { L298_2_EN=1; L298_2_A1=0; L298_2_A2=1; void motor_ls(void) { L298_2_EN=0; L298_2_A1=0; L298_2_A2=0; void motor_lss(void) { L298_2_EN=1; L298_2_A1=0; L298_2_A2=0; void motor_lsss(void){ L298_2_EN=1; L298_2_A1=1; L298_2_A2=1; void motor_rf(void) { L298_1_EN=1; L298_1_A1_ON; L298_1_A2_OFF; void motor_rb(void) { L298_1_EN=1; L298_1_A1_OFF; L298_1_A2_ON; void motor_rs(void) { L298_1_EN=0; L298_1_A1_OFF; L298_1_A2_OFF; void motor_rss(void) { L298_1_EN=1; L298_1_A1_OFF; L298_1_A2_OFF; void motor_rsss(void){ L298_1_EN=1; L298_1_A1_ON; L298_1_A2_ON; void main(void){ DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; while(1){ DC motor, 브레이크제어안함 motor_lf(); motor_rf(); delay_ms(2000); motor_ls(); motor_rs(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(2000); motor_ls(); motor_rs(); delay_ms(2000); DC motor, 브레이크제어, GND motor_lf(); motor_rf(); delay_ms(2000); motor_lss(); motor_rss(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(2000); motor_lss(); motor_rss(); delay_ms(2000); DC motor, 브레이크제어, VCC motor_lf(); motor_rf(); delay_ms(2000); motor_lsss(); motor_rsss(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(2000); motor_lsss(); motor_rsss(); delay_ms(2000);

포트로구동하는간단한예제입니다. DC모터는극성을바꿔줘서전류방향이바뀌면반대로회전을합니다. http:cafe.naver.com/circuitsmanual/26834 이글에서 L298이어떻게동작하는지살펴보시고이해가안가는분들은질문해주시기바랍니다. 전원을넣지않은상태에서바퀴를잡고돌리면함께연결된바퀴가회전합니다. 회전시발생한전력으로연결된바퀴가회전하는것입니다. 모터 1개로테스트하는방법도있습니다. 모터선두개를숏트시켜둔채로모터축을회전시키면발생한전력이모터에인가되서회전을방해하게되서브레이크가걸립니다. 왼쪽바퀴 STOP 함수만보면 void motor_ls(void) { L298_2_EN=0; L298_2_A1=0; L298_2_A2=0; 이네이블신호를디저블시키는것으로서관성에의해서일정시간굴러가다가멈추게됩니다. void motor_lss(void) { L298_2_EN=1; L298_2_A1=0; L298_2_A2=0; 이네이블상태에서 A1,A2를 low로만들어서 L298 내부의 H브릿지중아래쪽두개의 TR을 ON시켜서모터전압을 GND에연결시키는것으로브레이크동작을합니다. void motor_lsss(void){ L298_2_EN=1; L298_2_A1=1; L298_2_A2=1; 이네이블상태에서 A1,A2를 high로만들어서 L298 내부의 H브릿지중윗쪽두개의 TR을 ON시켜서모터전압을 VCC에연결시키는것으로브레이크동작을합니다. 동작상태확인이어려우므로 LCD 표시를추가해야겠습니다. -------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-18 코드비젼 -------------------------------------------------------- 5. DC모터 test (LCD 추가 ) -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> #define lcd1_rs PORTC.0 #define lcd1_rw PORTC.1 #define lcd1_e PORTC.2 #define lcd1_out PORTC PORTC.4~7 4bits #define L298_2_EN PORTB.6 #define L298_1_EN PORTB.7 #define L298_2_A1 PORTE.2 #define L298_2_A2 PORTE.3 #define L298_1_A1_ON (PORTG =0x08) PG3 #define L298_1_A1_OFF (PORTG&=~0x08) PG3 #define L298_1_A2_ON (PORTG =0x10) PG4 #define L298_1_A2_OFF (PORTG&=~0x10) PG4

void lcd1data(char d){ lcd1_rs=1; lcd1_out=(lcd1_out&0x08) (d&0xf0) 1; lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (d<<4) 1; lcd1_e=1; lcd1_e=0; delay_us(50); void lcd1cmd(char c){ lcd1_rs=0; lcd1_out=(lcd1_out&0x08) (c&0xf0); lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (c<<4); lcd1_e=1; lcd1_e=0; delay_ms(5); void lcd1_init(void){ delay_ms(50); DDRA=0xFF; lcd port output lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x0c); lcd1cmd(0x06); lcd1cmd(0x01); delay_ms(30); void lcd1_gotoxy(char x, char y){ if (y==0)lcd1cmd(0x80+x); else if(y==1)lcd1cmd(0xc0+x); else if(y==2)lcd1cmd(0x94+x); else if(y==3)lcd1cmd(0xd4+x); void lcd1_puts(char *str){ while(*str)lcd1data(*str++); void lcd1_putsf(char flash *str){ while(*str)lcd1data(*str++); void motor_rf(void) { L298_1_EN=1; L298_1_A1_ON; L298_1_A2_OFF; void motor_rb(void) { L298_1_EN=1; L298_1_A1_OFF; L298_1_A2_ON; void motor_rs(void) { L298_1_EN=0; L298_1_A1_OFF; L298_1_A2_OFF; void motor_rss(void) { L298_1_EN=1; L298_1_A1_OFF; L298_1_A2_OFF; void motor_rsss(void){ L298_1_EN=1; L298_1_A1_ON; L298_1_A2_ON; void motor_lf(void) { L298_2_EN=1; L298_2_A1=1; L298_2_A2=0; void motor_lb(void) { L298_2_EN=1; L298_2_A1=0; L298_2_A2=1; void motor_ls(void) { L298_2_EN=0; L298_2_A1=0; L298_2_A2=0; void motor_lss(void) { L298_2_EN=1; L298_2_A1=0; L298_2_A2=0; void motor_lsss(void){ L298_2_EN=1; L298_2_A1=1; L298_2_A2=1; void main(void){ char str[30]; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; lcd1_init(); while(1){ DC motor, 브레이크제어안함 sprintf(str," break-off "); lcd1_gotoxy(0,0); lcd1_puts(str); motor_lf(); motor_rf(); delay_ms(500); motor_ls(); motor_rs(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(500);

motor_ls(); motor_rs(); delay_ms(2000); DC motor, 브레이크제어, GND sprintf(str," break-on GND "); lcd1_gotoxy(0,0); lcd1_puts(str); motor_lf(); motor_rf(); delay_ms(500); motor_lss(); motor_rss(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(500); motor_lss(); motor_rss(); delay_ms(2000); DC motor, 브레이크제어, VCC sprintf(str," break-on VCC "); lcd1_gotoxy(0,0); lcd1_puts(str); motor_lf(); motor_rf(); delay_ms(500); motor_lsss(); motor_rsss(); delay_ms(2000); motor_lb(); motor_rb(); delay_ms(500); motor_lsss(); motor_rsss(); delay_ms(2000); 실제바닥에놓고주행시키게되면 2초라는시간이상당히긴시간이므로 0.5초로짧게수정했습니다. 휴지위에놓고무부하로구동하는것보다바닥에놓고실제로주행해보면브레이크가있고없고의차이가뚜렷해집니다. PWM 제어를하면서브레이크를거는방법은 PWM100% 를주면 L298의이네이블이활성화되므로동일하게브레이크를걸수있습니다. 각자코드를만들어서시험해보세요

-------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-18 코드비젼 -------------------------------------------------------- 6. 센서 test -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> #define lcd1_rs PORTC.0 #define lcd1_rw PORTC.1 #define lcd1_e PORTC.2 #define lcd1_out PORTC PORTC.4~7 4bits int adc_buf[8]; void lcd1data(char d){ lcd1_rs=1; lcd1_out=(lcd1_out&0x08) (d&0xf0) 1; lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (d<<4) 1; lcd1_e=1; lcd1_e=0; delay_us(50); void lcd1cmd(char c){ lcd1_rs=0; lcd1_out=(lcd1_out&0x08) (c&0xf0); lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (c<<4); lcd1_e=1; lcd1_e=0; delay_ms(5); void lcd1_init(void){ delay_ms(50); DDRA=0xFF; lcd port output lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x0c); lcd1cmd(0x06); lcd1cmd(0x01); delay_ms(30); void lcd1_gotoxy(char x, char y){ if (y==0)lcd1cmd(0x80+x); else if(y==1)lcd1cmd(0xc0+x); else if(y==2)lcd1cmd(0x94+x); else if(y==3)lcd1cmd(0xd4+x); void lcd1_puts(char *str){ while(*str)lcd1data(*str++); void lcd1_putsf(char flash *str){ while(*str)lcd1data(*str++); void main(void){ char str[30];

int k; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; ADMUX=0x40; lcd1_init(); while(1){ for(k=0;k<8;k++){ PORTA=~(1<<k); delay_us(90); 적외선 LED-ON 후 90us 후에 ADMUX=0x40 k; ADCSRA=0xC7; ADC 변환스타트시킵니다. delay_us(120); adc_buf[k]=adcw; 120us 후에변환이완료된값을저장하고 PORTA=0xFF; 적외선 LED-OFF 시킵니다. delay_ms(1); 채널딜레이 sprintf(str,"%4d%4d%4d%4d",adc_buf[0],adc_buf[1],adc_buf[2],adc_buf[3]); lcd1_gotoxy(0,0); lcd1_puts(str); sprintf(str,"%4d%4d%4d%4d",adc_buf[4],adc_buf[5],adc_buf[6],adc_buf[7]); lcd1_gotoxy(0,1); lcd1_puts(str); delay_ms(100); 라인센서는라인트레이서의가장중요한부분중하나입니다.

적외선 LED로적외선을쏘고, 포토센서로반사파를감지해서라인유무를측정하는회로이며기본회로를위에올렸습니다. 1차공구때에는우측의 103과 47K가없었으나펄스방식으로구동하기위해서추가한회로입니다. 펄스구동방식의장점은외란광의영향을덜받는다는것입니다. 빛을받으면포토센서에전류가흐르게되고 10K 저항에전압이걸리게됩니다. 전압의변화가 103을통해서넘어가게되고 ADC로입력받게됩니다. 예제소스에주석을달아놓았으니아래사진들과함께보시기바랍니다. 흰색 (A4 용지 ) 센싱 0번부터 7번까지센서값은위사진상으로가장위쪽 ( 진행방향으로볼때왼쪽 ) 이 0번이고아래쪽 ( 진행방향으로볼때오른쪽 ) 이 7번입니다.

LED 등을센서에가까이가져다대서외란광의영향을시험 검정색색종이

검정색색종이 검정색색종이 LED 등으로외란광의영향을테스트

청색과황색색종이

적색과녹색색종이

백색과검정색색종이

이사진은 LED의캐소드 (AVR 포트출력 ) 를측정한것입니다. 이정도의전류구동에 0.24V의전압이출력포트에걸린다고생각하시면됩니다. 무슨말이냐하면..AVR 출력포트로전류를드라이브많이할수록더높은전압이걸리게됩니다. 330 옴에 3.64V 가걸리니, 3.64V / 330 옴 = 약 11mA 가흐릅니다.

포토센서수신파형입니다. 파형이잘안보이니시간레인지를조절해야겠습니다. 옆의적외선LED에서쏜신호도약하게들어옵니다.

파형의시간은소스와비교해보면쉽게이해가갈겁니다.

위쪽신호는 103을통해서넘어간파형입니다. 이신호가 ADC핀에걸려서우리가사용하게됩니다. 2V가조금넘는신호라서 ADC변환시 440 정도로읽혀지고있습니다. 휴지위에올려두면센서면은바닥에서 8~9cm 떨어지게됩니다. 이정도거리에서도 ADC변환값은검정색보다더작은값이읽히므로낭떨어지감지는간단히됩니다. 관성때문에서지못해서떨어질수는있겠지만, 센싱에문제가없습니다. 물론거대한몸집을가지고서좁은책상위에서놀일은없습니다.^^ 안드로이드운영체계의장영실대상받은로봇이낭떨어지와칼라센싱이어렵다고해서색종이실험을해봤습니다.^^

-------------------------------------------------------- 키트전자 www.i8051.co.kr KE-RC-B01 2013.08-18 코드비젼 -------------------------------------------------------- 6. 센서 test, 인터럽트방식 -------------------------------------------------------- -------------------------------------------------------- #include <mega128.h> #include <stdio.h> #include <delay.h> #define lcd1_rs PORTC.0 #define lcd1_rw PORTC.1 #define lcd1_e PORTC.2 #define lcd1_out PORTC PORTC.4~7 4bits bit adc_flag=0; char ADC_CH=0; int adc_buf[8]; char tm0_cnt=0; void lcd1data(char d){ lcd1_rs=1; lcd1_out=(lcd1_out&0x08) (d&0xf0) 1; lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (d<<4) 1; lcd1_e=1; lcd1_e=0; delay_us(50); void lcd1cmd(char c){ lcd1_rs=0; lcd1_out=(lcd1_out&0x08) (c&0xf0); lcd1_e=1; lcd1_e=0; delay_us(1); lcd1_out=(lcd1_out&0x08) (c<<4); lcd1_e=1; lcd1_e=0; delay_ms(5); void lcd1_init(void){ delay_ms(50); DDRA=0xFF; lcd port output lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x28); lcd1cmd(0x0c); lcd1cmd(0x06); lcd1cmd(0x01); delay_ms(30); void lcd1_gotoxy(char x, char y){ if (y==0)lcd1cmd(0x80+x); else if(y==1)lcd1cmd(0xc0+x); else if(y==2)lcd1cmd(0x94+x); else if(y==3)lcd1cmd(0xd4+x); void lcd1_puts(char *str){ while(*str)lcd1data(*str++); void lcd1_putsf(char flash *str){ while(*str)lcd1data(*str++);

interrupt [TIM0_COMP] void timer0_comp_isr(void){ 매치인터럽트 if (tm0_cnt== 0){ PORTA=~(1<<ADC_CH); else if(tm0_cnt== 1){ ADMUX=0x40 ADC_CH; ADCSRA =0x40; else if(tm0_cnt==12){ if(++adc_ch>7){ ADC_CH=0; adc_flag=1; if(++tm0_cnt>12){ tm0_cnt=0; interrupt [ADC_INT] void adc_isr(void){ adc_buf[adc_ch]=adcw; PORTA=0xFF; void main(void){ char str[30]; DDRA=0xFF; DDRB=0xFD; DDRC=0xFF; DDRD=0x78; DDRD=0x70; DDRE=0x0C; DDRF=0; DDRG=0xFE; lcd1_init(); ADCSRA=0x8F; ADMUX=0x40; TCCR0=0x0A; OCR0=179; TIMSK=2; 16000000/8/(179+1)=11111Hz=90us SREG=0x80; while(1){ while(adc_flag==0); adc_flag=0; sprintf(str,"%4d%4d%4d%4d",adc_buf[0],adc_buf[1],adc_buf[2],adc_buf[3]); lcd1_gotoxy(0,0); lcd1_puts(str); sprintf(str,"%4d%4d%4d%4d",adc_buf[4],adc_buf[5],adc_buf[6],adc_buf[7]); lcd1_gotoxy(0,1); lcd1_puts(str); delay_ms(100); 메인에서구동하는것을 ADC와타이머0 두개의인터럽트를사용해서구동하는예제입니다. 분석이가능한분은잘분석해보세요^^ 만든사람도있으니만들어진것분석도가능하겠죠..^^ TV 리모콘과초음파센서는 128LCD 강좌의게시글을공부하면될것같습니다. 이상으로간단한설명을마칩니다. 위코드나설명에미흡한부분은메일로질문하여주시기바랍니다. 여기까지읽어주셔서감사합니다.^^