ARM 보고서 (AT91SAM7S256) 스마트컨트롤과정 2013 김성엽
INDEX 1. DataSheet 및 Circuit 1-1 DataSheet 1-2 Circuit 2. ADC 를통한조도센서, 온도센서활용. 2-1 조도센서, 온도센서활용 (ADC) 3. DBGU 를통한 LED, Relay, LCD, 초음파센서활용. 3-1 LED 토글 ( PIO 활용 ) 3-2 Relay 토글 ( PIO 활용 ) 3-3 LCD 한글띄우기 ( CGRAM 활용 ) 3-4 초음파센서활용 ( Timer/Counter, AIC 활용 ) 4. 사용한프로그램 4-1 Cygwin 4-2 GNUARM 4-3 Atmel SAM-BA In-system Programmer
1. DataSheet 및 Circuit DataSheet SAM7S Series Complete (http://www.atmel.com/devices/sam7s256.as px?tab=documents) Circuit AT91SAM7S-EK Evaluation Board User Guide or UST-MPB-AT91SAM7S256 v1 (http://www.atmel.com/devices/sam7s256.as px?tab=documents) or (http://www.us-technology.co.kr/product/pro duct_main.asp?mode=102&smode=3) 2. ADC 를통한조도센서, 온도센서활용 1. 실습목적 ARM칩내부기능인 ADC( Analog-to-Digital Converter ) 를이용해서빛과온도의세기를측정하여 LCD 에값을띄운다. 이를통해서 ADC를통한측정센서를활용해볼수있고, LCD에값을띄워직접적으로확인해볼수있다. 2. 사용기기및재료 (1) AT91SAM7S256 (2) Cds 센서 (3) NTC 서미스터온도센서 (4) LCD 3. 기본이론 & Source Code ADC( Analog-to-Digital Converter ) 는 ARM에서제공하는기능중하나로, 아날로그입력을디지털출력으로변환하여주는장치이다. 온도나빛의세기, 음향의크기등등을샘플링추출을하여원하는위치의값을확인할수있게해준다. 이번조도센서와온도센서를이용하면센서안의저항크기의변화에따라전압차가생기고, 이를이용해측정하고자하는시점에축차비교법을이용하여그때의값을확인가능합니다. Used Register Mapping ( Table 2-1 ) Offset Register Name Access Reset 0x0010 Peripheral Clock Enable Register PMC _PCER Write-only 0x00 Control Register ADC_CR Write-only 0x04 Mode Register ADC_MR Read-write 0x00000000
0x10 Channel Enable Register ADC_CHER Write-only 0x1C Status Register ADC_SR Read-only 0x000C0000 0x20 Last Converted Data Register ADC_LCDR Read-only 0x00000000 0x40 Channel Data Register 4 ADC_CDR4 Read-only 0x00000000 0x44 Channel Data Register 5 ADC_CDR5 Read-only 0x00000000 0x0010 Output Enable Register PIO_OER Write-only - 0x0000 PIO Enable Register PIO_PER Write-only - 0x0034 Clear Output Data Register PIO_CODR Write-only - 0x0030 Set Output Data Register PIO_SODR Write-only - Peripheral Identifiers ( Table 2-2 ) 4 ADC Analog-to Digital Converter - 메모리맵핑 (1) DataSheet 의메모리맵핑 (Page.20) 을이용하여사용할레지스터의처음주소값을찾아그값에 Offset 만큼의값을더하여정의해준다. Main.c ADC.c
ADC.h
LCD.c
LCD.h
4. 설명 & 고찰, 결과사진 ( Table 2-3 ) ( Table 2-3 확대화면 ) 4-1 ADC 초기설정 (1) Power Management Controller( PMC ) 에서내부기능인 ADC 를 Peripheral Clock Enable Register 를이용하여활성화시켜줍니다. 0x0010 Peripheral Clock Enable Register PMC _PCER Write-only
(2) ADC Control Register 를통해서 ADC 회로를동작하기전에 Reset 시켜줍니다. 0x00 Control Register ADC_CR Write-only (3) ADC값을센서로부터받을핀을지정, 활성화해줍니다. ( 핀종류 : 공용핀 PA17,PA18 전용핀 : AD4,5,6,7 ) 0x40 Channel Data Register 4 ADC_CDR4 Read-only 0x00000000 0x44 Channel Data Register 5 ADC_CDR5 Read-only 0x00000000 AD4, AD5 를활성화하였습니다. 0x10 Channel Enable Register ADC_CHER Write-only (4) ADC_MR 을이용해서분주율을약 4Mhz 로맞추고, 분해능을 10bit 로설정해줍니다. 0x04 Mode Register ADC_MR Read-write 0x00000000 : ADCClock = 48000000/((5+1)*2) = 4000000Hz = 4Mhz : 10bit 분해능
(5) ADC_CR에서 Conversion을시작하고, ADC_SR에서 Conversion Time이끝나면 DRDY 값이 1 을나타내므로 Conversion이끝나면최종적으로 ADC_LCDR을통해서값을읽어옵니다. 추출한값은 ADC_CDR4,5를통해반환해줍니다. 0x20 Last Converted Data Register ADC_LCDR Read-only 0x00000000
(6) 반환할때한번에두개의값을같은메모리위치에저장할수없으므로광센서의값은 16bit 만큼 Shift 해서보내고, 온도센서값은그대로보냅니다. 나중에반환한값을다시 Shift 해주어값을동시에출력을가능하게합니다. Source Code return((adc_cdr4&0x3ff)<<16) (ADC_CDR5&0x3FF); // 앞부분 16bit는 0x10, // 뒷부분 16bit는 0x20 으로반환. LCD_number(1, ui_num&0x0000ffff); // Shift 연산을통해서 LCD_number(2, ui_num>>16); // 광센서의값 (10bit) 을 16bit쪽에저장해두고 // 다시값을 Shift 연산을통해출력하였다. 4-2 LCD 타이밍도읽기.
: 타이밍도를읽어서 PIO 의 High/Low 와 Delay 를맞춰줘야 Data Bus 로부터데이터를읽고 / 쓰고 LCD 의내부기능을명령해줄수있다, (1) LCD에명령을입력하려면 RS를 Low 로초기화시켜줘야하고, 데이터를입력하려면 High 로초기화시켜준다. (2) ⓶ ~ ⓷ : RS와 RW가동작을끝내기전까지 LCD_EN을딜레이시켜줘야함. (3) ⓷ ~ ⓸ : EN이 High( 활성화 ) 시킴. (4) ⓸ ~ ⓹ : Data Bus에변화가생기는부분시간을딜레이시킴. (5) ⓸ ~ ⓹ : 데이터전송하기전까지딜레이시킴. (6) ⓹ ~ ⓺ : 한주기끝나기전까지딜레이시킴. 4-3 결과사진 TEMP : 평상시상태. TEMP : 손으로잡으니 TEMP 값이올라갔음. LIGHT : 조도센서를가려서값이내려감. LIGHT : 빛을비춰주니값이올라감.
3. DBGU 를통한 LED, Relay, LCD, 초음파센서활용 1. 실습목적 ARM 내부기능인 DBGU( Debug Unit ) 를가지고 CPU 와하이퍼터미널통신을통하여 Menu ( Table 3-1 ) 1. LED Toggle 2. LCD Test 3. Relay Toggle 4. Ultra Sonic 위의 Table 3-1 과같이번호를누를때마다기능을활성화시켜사용해볼수있다. LED 와 Relay 토글, LCD 에한글띄우기, 초음파센서거리측정. 이를통해서 Debug Unit ( DBGU ), Advanced Interrupt Controller ( AIC ), Timer Counter ( TC ) 를사용할수있다. 2. 사용기기및재료 (1) AT91SAM7S256 (2) LED (3) LCD MODULE ( OCM-16216D-4-B102A ) (4) APA3319 Relay (TUV) (5) Ultra-Sonic Ranger ( SRF05 ) 3. 기본이론 & Source Code 3-1 Debug Unit ( DBGU ) DBGU란 Serial 통신의일종으로 UART (Universal Asynchronous Receiver/Transmitter : 범용비동기화송수신기 ) 에속하며, 비동기직렬통신을처리하는장치이다. 모든컴퓨터에는직렬포트를관리하기위해 UART가있고모든내부모뎀도각자의 UART를가지고있다. UART는컴퓨터에게 RS-232C DTE 인터페이스를제공함으로써, 모뎀이나기타다른직렬장치들과통신하거나데이터를주고받을수있게한다. ( Table 2-3 확대화면 )
3-2 Advanced Interrupt Controller ( AIC ) 인터럽트가발생하면프로세서는현재수행중인프로그램을멈추고, 상태레지스터와 PC(Program Counter) 등을스택에잠시저장한후인터럽트서비스루틴으로점프한다. 인터럽트서비스루틴을실행한후에는이전의프로그램으로복귀하여정상적인절차를실행한다. ( Table 3-2 ) 3-3 Timer Counter ( TC ) Timer Counter ( TC ) 란 AT91SAM7S256 안에 MCK 를이용해서세부적인시간을셀수있게해준다. 축차비교법과오버플로우비교법 (Table 3-3) Used Register Mapping ( Table 3-4 ) Offset Register Name Access Reset 0x00 + channel * 0x40 + 0x00 Channel Control Register TC_CCR Write-only - 0x00 + channel * 0x40 + 0x04 Channel Mode Register TC_CMR Read-write 0 0x00 + channel * 0x40 + 0x1C Register C TC_RC Read-write 0 0x00 + channel * 0x40 + 0x20 Status Register TC_SR Read-only 0 0x00 + channel * 0x40 + 0x24 Interrupt Enable Register TC_IER Write-only 0x00 + channel * 0x40 + 0x28 Interrupt Disable Register TC_IDR Write-only 0x0000 Control Register DBGU_CR Write-only 0x0020 Baud Rate Generator Register DBGU_BRGR Read-write 0x0 0x0004 Mode Register DBGU_MR Read-write 0x0 0x001C Transmit Holding Register DBGU_THR Write-only 0x0018 Receive Holding Register DBGU_RHR Read-only 0x0 0x0004 PIO Disable Register PIO_PDR Write-only 0x0070 Peripheral A Select Register PIO_ASR Write-only 0x0030 Set Output Data Register PIO_SODR Write-only - 0x0010 Output Enable Register PIO_OER Write-only 0x0000 PIO Enable Register PIO_PER Write-only 0x0034 Clear Output Data Register PIO_CODR Write-only
Main.c
Timer.c
Timer.h
Ultra_AIC.c
Ultra_AIC.h DBGU.c
DBGU.h
LED.c LED.h Relay.c Relay.h
LCD.c 와 LCD.h 의소스는 1. 조도센서온도센서활용 에있음. 4. 고찰 & 결과사진 4-1 Debug Unit 초기화 ( DBGU ) (1) DBGU_CR 에서송수신을비활성화시켜줌.( 초기화 ) (2) DBGU_BRGR 을이용해서 Baud Rate 값을송수신시에속도를맞춰주기위해서 CD(Clock Divisor) 값을구해서 DBGU_BRGR 레지에넣어준다.
(3) DBGU_MR 에서는패리티비트 ( 짝수패리티 ) 와노말모드로설정해주었다. (4) 송수신포트로사용해야하므로같이쓰이는 PIO 9 번, 10 핀을비활성화해주고, 송수신포트에활 용될 DRXD, DTXD 를활성화해준다.
(5) 송수신활성화스타트 4-1-1 Recv_Char() 함수설명 : 데이터받기 (1) RXRDY 비트가 Set 되는순간, 데이터를받을준비가된상태. 그때 DBGU_RHR 에그값을저장한다. 이값은다른작업중에입력을받거나 ( 인터럽트 ), DBGU를통한키보드입력을받는등, 데이터입력을받을때사용가능하겠다. 4-1-2 Send_Char() 함수설명 : 데이터보내기 (1) RXRDY 와마찬가지로 Set 되는순간데이터를보낼준비가된상태. 준비가되면 DBGU.THR 에값을저장해서데이터를보내면된다. 인자가문자형이므로문자형데이터를보내면값이나오게하였다. 4-1-3 DBGU_String() 함수설명 : 문자열로보내기 (1) 문자열로데이터를보내기위해서인자로 void 포인터를사용해서주소값을넘겨받아그값을하나씩 Send_Char() 함수로보내고, 주소값을이동시켜하이퍼터미널을통해문자열로띄우기가능하게하였다.
4-2 LED, Relay Toggle 하기. (1) Parallel Input/Output Controller (PIO) 의 PIO 활성화레지 (PIO_PER), PIO 출력활성화레지 (PIO_OER) 를 Set 해주어사용가능하게한후, High/Low(Set/Clear) 값을주기위해 PIO_SODR, PIO_CODR를이용하였다. 출력핀은 PA0번, PA1번핀을사용하였다. 그리고함수안에 static 변수를이용해서호출이될때마다 On/Off 가된다. 4-3 Timer/Counter 를이용하여 Delay 주기 (1) 타이머카운터 0 사용을위한 PMC 활성화 PMC_PCER = 1<<TC0; (2) 타이머클럭비활성화 (TC_CCR 설정 ) TC0_CCR = 1<<CLKDIS; ( Table 3-4 ) (3) 타이머인터럽트비활성화 (TC_IDR 설정 ) TC0_IDR = (1<<COVFS) (1<<LOVRS) (1<<CPAS) (1<<CPBS) (1<<CPCS) (1<<LDRAS) (1<<LDRBS) (1<<ETRGS);
(4) 인터럽트상태정보초기화 (TC_SR 읽기 ) TC0_SR; : TC_SR 을초기화하기위해서값을불러준다. (5) 분주비 128, 비교방식레지스터설정 (TC_CMR, DIV5_CLOCK, CPCTRG) MCKR divided by 128 => 2.6us(TC_RC 설정 :375) TC0_CMR = (TIMER_CLOCK4<<TCCLKS) (1<<CPCTRG); TC0_RC = 375; : 읽을시간을맞추어주기위해 MCK 를분주비로나누어시간을세분화시킬수있다. 아래 ( Table 3-5 ) 를보면주파수를 1 초로나누어 Clock 하나당시간을구하였고, Clock 하나당시간에 TC_RC ( 곱해주는값 ) 을넣어주어원하는시간 (1ms) 를구해주었다. 여기서는오차가가장적은 128 분주비를 사용하였다. MCK 분주비 주파수 Clock 당시간 배수 (RC) ms 오차 ( 초 ) 2 24000000 0.000000041666666 66667 24000 1.000000 0000 0.00000000000000 008 8 6000000 0.000000166666666 66667 6000 1.000000 0000 0.00000000000000 002 48000 000 32 1500000 0.000000666666666 66667 1500 1.000000 0000 0.00000000000000 0005 128 375000 0.000002666666666 66667 375 1.000000 0000 0.00000000000000 000125 1024 46875 0.000021333333333 33330 47 1.002666 6667 0.00000266666666 66651 ( Table 3-5 ) (6) 타이머카운터 0 인터럽트비활성화 (AIC_IDCR, TC0) AIC_IDCR = 1<<TC0; : 축차비교를통해시간을세는것을완료할때마다인터럽트가동작을해야하므로, 인터럽트기능 을추가해야한다. (7) 타이머카운터 0 인터럽트핸들러등록 (AIC_SVR[TC0], Timer_Handler) AIC_SVR[TC0] = (volatile unsigned int )Timer_Handler; : ARM에는인터럽트의개수가 33개가있는데 (IRQ가 32개 FIQ 1개 ) 이배열안에사용하고자하는주변장치 (Peripheral Identifiers) 의번호를넣어줘서 Handler를호출할때마다점프하게될함수 (Timer_Handler) 의주소만을저장, 저장된주소로 MCU의 PC(Program Counter) 가다음동작을실행하고, 스택영역에저장해둔메인루틴의다음명령주소를저장해서메인프로세스로돌아간다.
(8) 타이머카운터 0 인터럽트모드설정 // (AIC_SMR[TC0], AIC_SRCTYPE_INT_HIGH_LEVEL, PRIOR_LOWEST) AIC_SMR[TC0] = ((0<<PRIOR) (3<<SRCTYPE)); : 우선순위를정해주고, 노말모드를설정해준다. (9) 타이머카운터 0 인터럽트클리어 (AIC_ICCR, TC0) AIC_ICCR = 1<<TC0; : 켜기전에 Clear 시켜둔다. (10) TC_RC 값비교타이머인터럽트활성화 (TC_IER, CPCS) TC0_IER = 1<<CPCS; : 축차비교방식으로읽기때문에비교타이머로활성화시켜주었다. (11) 타이머카운터 0 인터럽트활성화 (AIC_IECR, TC0) AIC_IECR = 1<<TC0; (11-1) 타이머클럭활성화 (TC_CCR, CLKEN) TC0_CCR = 1<<CLKEN; : 인터럽트와클럭을활성화시켜준다. (12) 타이머시작 (TC_CCR, SWTRG) TC0_CCR = 1<<SWTRG; : TC 는 Reset 이되고카운터를시작함. (13) Timer_Handler() 함수 TC0_SR; : TC0_SR 에 CPCS 비트에 1이들어있는상태면인터럽트가비활성화됨. 그래서초기화를한번해줌. TC0_SR 에접근 ( 읽으면 ) 0 으로만듬. (14) 전역변수 static volatile unsigned int ui_tic 활용 ++ui_tic; : 전역변수를이용하여 0부터시작할수있고, 빠른접근이가능하며, 처리가끝나고나서도값이변하지말아야하기때문에전역변수를이용하여 1ms 마다 ui_tic이카운터되서올라간다. (15) MS_DELAY() 함수 ui_tic = 0; while(ui_ms > ui_tic); : ui_tic 이 0.01초마다계속인터럽트되서 ++ui_tic 되므로, 1000번이다되면 1초가계산된다.
4-3 초음파센서활용 4-3-1 Ultra Run 함수설명 (1) 함수선언. unsigned char *ULTRA_RUN() : 거리값 ( 문자열 ) 반환값으로보내줄것이기때문에반환형을 unsigned char * 로맞춘다. (2) 거리저장할배열확보. static unsigned char uc_dist[] = "---cm"; : uc_dist[] 배열의 0,1,2 번째값을보내줘서거리를띄울것이므로, 미리배열을확보. (3) Trigger Toggle TRG_PULSE_Toggle(); : 초음파센서가초음파를쏘라고명령을내려주게하기위해서 Trigger를걸어준다. 10us의 High Pulse를출력한다. (4) 거리측정변수초기화 ui_tic = 0; // 미리 0cm 로초기화. ui_dist = 0; // 계속동작중인 ui_tic 에다가값을넣어서. 실제거리를제려고. : 소리는 1초에 340m를가고, 이를 1cm 단위당거리를계산하면약 29us가나온다. 하지만 Echo Pulse가돌아온시간을계산해야하므로 58us 정도가나온다. 즉 1cm 당 58us 라할수있다. 이값을 ui_tic이인터럽트가걸릴때마다저장을할것이다. (5) Echo Pin 의시작부분알기 while( 0 == ((AT91C_BASE_PIOA->PIO_PDSR) & ( 1<<Echo_PIN )) ); : 8 cycles off Sonic Burst가물체에부딪혀반사되서센서로되돌아오면 Echo Pin이해당거리에따라 High Pulse 의상태가되는데, High Pulse 되는순간을발견함 (6) 타이머클럭활성화 (TC_CCR, CLKEN) & 타이머시작 (TC_CCR, SWTRG) AT91C_BASE_TC0->TC_CCR = AT91C_TC_CLKEN; AT91C_BASE_TC0->TC_CCR = AT91C_TC_SWTRG; : Timer/Counter 를활성화시키고, 시작. (7) Handler를이용하기위해인터럽트활성화. AT91C_BASE_PIOA->PIO_IER = 1<<Echo_PIN; AT91C_BASE_AIC->AIC_IECR = 1<<AT91C_ID_PIOA; : Echo Pin에인터럽트가걸리게활성화시켜주고, PIO핀장치번호인터럽트를활성화시켜준다.
(8) 측정이끝날때까지잡아두기. ui_state = 1; while( 1 == ui_state ); : ULTRA_Handler에서측정이끝나면 ui_state가 0이되는데다음번측정을하기전까지 while문을이용해잡아둠. (9) 측정이끝나고다시대기 U_Timer_Init(); ECHO_INIT(); : Timer와 Echo를초기화시켜서꺼줌. (10) 측정값넘기기. uc_dist[0]= '0' + ((ui_dist%1000)/100); // ui_dist의실제거리를넣어둠. uc_dist[1]= '0' + ((ui_dist%100)/10); uc_dist[2]= '0' + ((ui_dist%10)); return uc_dist; : 측정된값은 uc_dist[] 의문자열로넘겨서값을 DBGU_String 과 LCD_String 에값을띄움. 4-3-2 Echo_INIT 함수설명 (1) Echo Pin 핀활성화, 인터럽트비활성화 AT91C_BASE_PMC->PMC_PCER = 1<<AT91C_ID_PIOA; AT91C_BASE_PIOA->PIO_ODR = 1<<Echo_PIN; AT91C_BASE_PIOA->PIO_PER = 1<<Echo_PIN; AT91C_BASE_PIOA->PIO_IDR = 1<<Echo_PIN; AT91C_BASE_AIC->AIC_IDCR = 1<<AT91C_ID_PIOA; : 핀만활성화시켜놓고, 인터럽트를비활성화시켜서대기시켜둔다. (2) 타이머카운터 0 인터럽트핸들러등록 (AIC_SVR[TC0], AIC_Handler) AT91C_BASE_AIC->AIC_SVR[AT91C_ID_PIOA] = (volatile unsigned int )ULTRA_Handler; : Timer_Handler 와같은형식으로 Echo Pin에인터럽트가걸리면 Handler를호출하도록배열에주소값을저장. (3) 타이머카운터 0 인터럽트모드설정 AT91C_BASE_AIC->AIC_SMR[AT91C_ID_PIOA] = ((AT91C_AIC_PRIOR_LOWEST) (AT91C_AIC_SRCTYPE_EXT_NEGATIVE_EDGE)); :Source type 은외부인터럽트 Negative 로맞춰줘서 Echo Pin이하강되는순간을젤수있도록함.
(4) PIOA 장치에인터럽트를 Clear/Set & 잡음제거. AT91C_BASE_AIC->AIC_ICCR = 1<<AT91C_ID_PIOA; AT91C_BASE_PIOA->PIO_IFER= 1<<Echo_PIN; AT91C_BASE_AIC->AIC_ISCR = 1<<AT91C_ID_PIOA; : PIO 핀을미리모두 Clear 시켜놓고, 오차를줄이기위해내부기능인필터를켠후, 다시 PIO 핀인터럽트를 Set 시켜서외부인터럽트에반응하게끔대기. 4-3-3 ULTRA_Handler 함수설명. (1) 인터럽트상태확인. AT91C_BASE_PIOA->PIO_ISR; // 미리만들어둔다. : Timer/count 와는다르게인터럽트는 32개다반응하므로 PIO로외부인터럽트신호를확인한다. (2) 거리저장 & 다음타이머순간을위한초기화. ui_dist = ui_tic; ui_state = 0; : 하강인터럽트걸리는순간까지도 ui_tic 은계속돌고있다. 그래서 ui_dist 에다가인터럽트걸리는순간에실제거리를저장해놓는다. ui_state 는앞서 while( 1 == ui_state ) 로잡아두었고, 측정이끝났으므로 0 으로다음번타이머를받기위해초기화시켜준다. (3) 인터럽트종료확인. AT91C_BASE_AIC->AIC_EOICR = 0; : 인터럽트종료. 4-3-4 U_Timer_Init(), U_Timer_Handler() (1) 앞서적은 Timer/Counter 와같은소스이므로참조. 4-3-5 Trigger init(), Trigger_Pulse_Toggle() (1) 초기화하기위해서 Trigger Pin을활성화하고 Clear로맞춰줌. (2) Trigger Pin을 Set 해주고, Trigger Toggle에서 for 문을이용해 10us 정도의시간을벌어줌. Timing Diagram 읽기.
4-3-6 LCD 에사용자정의한글입력사용. : LCD 의사용자정의로 CGRAM 부분을건드려한글을입력할수있다. (1) 한 dot 마다 1bit 라고하면은가로줄당 5bit 를사용한다. 1byte 면사용가능하고상위 3bit 는필 요가없다. 총가로줄이 8 줄이므로 8byte 면한칸을완성할수있다. unsigned int pname[] = { 0x09, 0x17, 0x15, 0x01, 0x00, 0x02, 0x05, 0x02, // ' 성 ' 0x00 0x01, 0x0B, 0x15, 0x0B, 0x05, 0x07, 0x05, 0x07, // ' 엽 ' 0x01 0x01, 0x09, 0x15, 0x15, 0x09, 0x01, 0x01, 0x01, // ' 이 ' 0x02 0x05, 0x07, 0x02, 0x00, 0x0A, 0x0E, 0x04, 0x00, // ' 하트 ' 0x03 0x00, 0x0A, 0x0E, 0x04, 0x00, 0x14, 0x1C, 0x08}; // ' 하트 ' 0x04 : 16진수로값을바꿔서배열안에다가찍어줄 dot 값을각각저장해주었다. (2) LCD_data_write에다가각각저장. for(icnt=0; icnt<40; ++icnt) { LCD_data_write(pName[iCnt]); } (3) LCD에다가출력 LCD_cmd_write(0x80); // DD RAM 첫번째라인. LCD_data_write(0x00); // 성, 첫번째가로줄의주소. : LCD_cmd_write() 를이용하여 LCD에출력하고싶은부분을찍어주고, 한칸당 8byte 뿐이못들어 가므로출력할글자의가로줄 1byte 첫부분주소를 LCD_data_write() 에다가적어주면자동으로 8 줄이들어가 8byte가찍어지며글자가찍힌다.
4-4 결과사진 LED Off LED On Relay 회로도, 동작시에 딸칵 소리가 난다. 하이퍼터미널에서 동작 상태 사진. 하이퍼터미널에서 동작 상태 사진. 초음파센서 동작 사진.
DBGU 를통해 Test 문자열출력전 (Shift 중임 ) DBGU 를통해 Test 문자열출력후 (Shift 중임 ) 4. 사용한프로그램 1. Cygwin : 리눅스환경을윈도우에서쓸수있도록하는프로그램. (http://cygwin.org/) 2. GNUARM : ARM 컴파일러 (http://www.gnuarm.com/) 3. Atmel SAM-BA In-system Programmer : 파일을개발보드로다운로드시킬때사용한다. (http://www.atmel.com/tools/atmelsam-bain-systemprogrammer.aspx)