[내장형]이동현_0916일일보고서
◎ ARM
-포팅(Porting)은 기본 골격은 유지하면서 조금씩 변화 시키는 것을 포팅이라 한다.
-포팅이란 다른 소스를 가져와 자신의 하드웨어에 맞게 디파인 값을 변경하는 것이다.
(재원형님의 좋은 정보!!)
◇ 초음파 센서(Ultra_sensor)
★ 소스보기
열기 접기
#include "ultra.h"
static unsigned int UI_DIS; //파일간 전역변수 접근을 막기 위해서 C에서 유일한 보안 프로그램
void TRG_INIT( void )
{
PIO_PER = ( 1 < < TRG_PIN);
PIO_OER = ( 1 < < TRG_PIN);
PIO_PUDR = ( 1 < < TRG_PIN);
PIO_CODR = ( 1 < < TRG_PIN);
}
void ECHO_INIT( void )
{
PMC_PCER = 1 < < PIOA;
PIO_ODR = ( 1 < < ECHO_PIN);
PIO_PER = ( 1 < < ECHO_PIN);
PIO_IDR = ( 1 < < ECHO_PIN); // 비활성화
AIC_IDCR = 1 < < PIOA;
AIC_SVR[PIOA] = ( unsigned int )ECHO_PIN_ISR;
AIC_SMR[PIOA] = ( 3 < < SRCTYPE) | ( 0 < < PRIOR); //상승 에지
AIC_ICCR = 1 < < PIOA;
PIO_IFER = ( 1 < < ECHO_PIN);
AIC_ISCR = 1 < < PIOA;
//PIO_IER = (1 < < ECHO_PIN);
AIC_IECR = 1 < < PIOA;
}
void ECHO_PIN_ISR( void )
{
static unsigned int UI_STATE = 0 ;
static unsigned char buf[] = "000cm\n\r" ;
if (UI_STATE = = 0 )
{
UI_DIS = 0 ; //거리를 초기화
TC_CCR0 = 1 < < CLKEN; //켜는것
TC_CCR0 = 1 < < SWTRG;
AIC_SMR[PIOA] = ( 1 < < SRCTYPE) | ( 0 < < PRIOR); //하강 엣지
UI_STATE = 1 ;
}
else
{
LCD_Inst(LCD_DD); //set DDRAM address 0번지(MSB가 1)
TC_CCR0 = 1 < < CLKDIS; // Timer off
buf[ 0 ] = ( '0' +((UI_DIS % 1000 )/1 00 ));
buf[ 1 ] = ( '0' +((UI_DIS % 100 )/1 0 ));
buf[ 2 ] = ( '0' +((UI_DIS % 10 )));
Send_String(buf);
LCD_String(buf);
PIO_IDR = ( 1 < < ECHO_PIN); //비활성화
UI_STATE = 0 ;
}
PIO_ISR;
AIC_EOICR = 0 ;
}
void uTIMER0_INIT( void )
{
PMC_PCER = 1 < < TC0; // Timer0 Power On
TC_CCR0 = 1 < < CLKDIS; // Timer off
TC_IDR0 = 0x FF; // Interrupt off
TC_SR; // Status Register Clear
AIC_IDCR = 1 < < TC0;
AIC_SVR[TC0] = ( unsigned int )uTIMER0_ISR;
AIC_SMR[TC0] = ( 2 < < SRCTYPE) | ( 0 < < PRIOR);
AIC_ICCR = 1 < < TC0;
TC_CMR0 = (TIMER_CLOCK1 < < TCCLKS) | ( 1 < < CPCTRG);
//TC_RC0 = 25166; // 분주비 2
TC_RC0 = 1455 ; //분주비 2
TC_IER0 = 1 < < CPCS;
AIC_IECR = 1 < < TC0;
//TC_CCR0 = 1 < < CLKEN; //켜는것
//TC_CCR0 = 1 < < SWTRG;
}
void uTIMER0_ISR( void )
{
++UI_DIS;
TC_SR;
}
void Ultra_TRG( void )
{
volatile unsigned int ui;
PIO_SODR = ( 1 < < TRG_PIN);
for (ui = 0 ; ui < 1000 ;ui++);
PIO_CODR = ( 1 < < TRG_PIN);
PIO_IER = ( 1 < < ECHO_PIN); //핀의 활성화
AIC_SMR[PIOA] = ( 3 < < SRCTYPE) | ( 0 < < PRIOR);
}
void Ultra_INIT( void )
{
TRG_INIT();
ECHO_INIT();
uTIMER0_INIT();
}
접기
※ ISR(interrupt service routine)
-인터럽트 발생시에 무엇인가를 해야합니다. 그때 그 무엇인가를 하는 부분을 인터럽트 서비스 루틴이라고합니다. 타이머랑 Echo_Pin이 있습니다.
※PIO_ISR
-읽기만 하면 지워진다.
※AIC_EOICR = 0
-종료에따라 신호를 보내주기 위해서 이다. 숫자는 아무거나 상관이 없다. 인터럽터가 하나일때는 사용하지않아도 되는데 여러개의 인터럽트가 발생하였을때 종료를 한다는 신호 역할이다?!
※클리치 필터(PIO_IFER)
-잡음을 걸러주기 위해서 사용한다. IFDR은 필터를 끈다.
★분주비
-TCCLKS : Clock Selection
000 = TIMER_CLOCK1(MCK/2)
001 = TIMER_CLOCK2(MCK/8)
010 = TIMER_CLOCK3(MCK/32)
011 = TIMER_CLOCK4(MCK/128)
100 = TIMER_CLOCK5(MCK/1024)
101 = XC0
110 = XC1
111 = XC2
1초
-50331648은 48*1024*1024이다.
0.001초
초음파 센서 1CM의 거리 시간을 계산할때?!
-초음파 센서는 1초에 온도가 24℃일때 346m를 간다. 온도에 따라 다르지만 온도가 높으면 높을수록 멀리갑니다. 공기중에 음속은
v = (331.5 + 0.61T)m/s
331.5는 0℃ 1기압에 공기중에서의 물질의 속도입니다. T는 온도가 되며 0.61은 온도가 1℃높아지면 0.61m/s 씩 빨라집니다 그러므로 온도가 높아지면 속도가 빨라집니다.(춘우님의 댓글 감사합니다!)
-0.0000578은 28.901734는 편도거리기 때문에 왕복의 거리를 시간을 나타내기위해서 *2를 해준다.
-여기서 분주비가 2일때 가장 적은 오차범위를 가지기 때문에 TC_RC0=1455 를 넣어준다.
※ static unsigned int UI_DIS;
전역변수에 static을 사용하는 이유는 외부에서 접근하지 못하도록 하려고 전역변수에 static를 사용한다. C에서 유일하게 보안기능을 가진다.
-3<<SRCTYPE는 상승모드를 나타낸다.
★결과
◎ WIN API
◇ 폰트(Font)
☆CreateFont
더보기 접기
#include "MsgProc.h"
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont, OldFont;
TCHAR *str = TEXT("폰트 Test 1234" );
LRESULT OnCreate (HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
hdc = BeginPaint(hWnd,& ps);
hFont= CreateFont(50 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,HANGEUL_CHARSET,0 ,0 ,0 ,VARIABLE_PITCH| FF_ROMAN,TEXT("궁서" ));
OldFont = (HFONT)SelectObject(hdc,hFont);
TextOut(hdc,100 ,100 ,str,lstrlen(str));
SelectObject(hdc,OldFont);
DeleteObject(hFont);
EndPaint(hWnd,& ps);
return 0 ;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0 );
return 0 ;
}
접기
☆결과
※CreateFont함수
-nHeight = 폰트의 높이를 논리적인 단위로 지정한다.
-nWidth = 폰트의 폭을 지정
-nEscapement = 폰트의 각도 설정
-nOrientation = 글자 한자와 X축과의 각도를 지정한다.
-fnWeight = 폰트의 무게를 0~1000까지의 값으로 설정한다.쉽게 말해서 폰트의 두께를 설정한다. 보통 굵기인 FW_NORMAL이 400이다.
-fdwItalic, fdwUnderline, fdwStrikeOut = 기울임체, 밑줄 관통선 속성을 설정한다.
-fdwCharSet = 문자코드와 문자의 대응관계를 정의하는 문자셋이다. 폰트정보중 가장중요하다
-fdwOutputPrecision = 출력 정확도를 설정
-fdwClipPrecision = 클리핑 정확도 설정
-fdwQuality = 논리적 폰트를 물리적 폰트에 얼마나 근접시킬 것인가를 지정한다.
-fdwPitchAndFamily = 폰트의 피치와 그룹을 설정
-lpszFace = 글꼴의 이름을 나타내는 문자열을 설정한다.
☆LOGFONT구조체를 이용한 폰트생성
더보기 접기
#include "MsgProc.h"
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont, OldFont;
TCHAR *str = TEXT("폰트 Test 1234" );
LOGFONT lf;
LRESULT OnCreate (HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
hdc = BeginPaint(hWnd,& ps);
lf.lfHeight = 50 ;
lf.lfWidth = 0 ;
lf.lfEscapement = 0 ;
lf.lfOrientation = 0 ;
lf.lfWeight = 0 ;
lf.lfItalic = 0 ;
lf.lfUnderline = 0 ;
lf.lfStrikeOut= 0 ;
lf.lfCharSet= HANGEUL_CHARSET;
lf.lfOutPrecision= 0 ;
lf.lfClipPrecision= 0 ;
lf.lfQuality= 0 ;
lf.lfPitchAndFamily= VARIABLE_PITCH| FF_ROMAN;
lstrcpy(lf.lfFaceName,TEXT("궁서" ));
hFont = CreateFontIndirect(& lf);
OldFont = (HFONT)SelectObject(hdc,hFont);
TextOut(hdc,100 ,100 ,str,lstrlen(str));
SelectObject(hdc,OldFont);
DeleteObject(hFont);
EndPaint(hWnd,& ps);
return 0 ;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0 );
return 0 ;
}
접기
-출력결과는 CreateFont함수를 사용한 것과 동일하다. CreateFont함수의 인수에 폰트의 특징을 모두 나열하는 방법에 비해 LOGFONT 구조체를 사용하는 방법은 몇가지 장점이 있는데 우선 전달되는 인수의 개수가 적으므로 호출 속도가 빠르고 여러 벌의 폰트를 만들어야 할때 LOFGONT의 맴버중 일부만을 변경하여 재사용할 수 있으며 또한 LOFGONT 구조체 배열을 사용하면 사용할 폰트의 목록을 미리 작성해 놓을 수도 있다.
☆텍스트의 색상
더보기 접기
#include "MsgProc.h"
HDC hdc;
PAINTSTRUCT ps;
HFONT hFont, OldFont;
TCHAR *str = TEXT("폰트 Test 1234" );
HBRUSH MyBrush, OldBrush;
LRESULT OnCreate (HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
hdc = BeginPaint(hWnd,& ps);
MyBrush = CreateHatchBrush(HS_CROSS,RGB(0 ,0 ,255 ));
OldBrush = (HBRUSH)SelectObject(hdc,MyBrush);
Rectangle(hdc,50 ,50 ,400 ,200 );
SelectObject(hdc,OldBrush);
hFont= CreateFont(30 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,HANGEUL_CHARSET,0 ,0 ,0 ,VARIABLE_PITCH| FF_ROMAN,TEXT("궁서" ));
OldFont = (HFONT)SelectObject(hdc,hFont);
SetTextColor(hdc,RGB(255 ,0 ,0 ));
SetBkColor(hdc,RGB(255 ,255 ,0 ));
TextOut(hdc,100 ,100 ,str,lstrlen(str));
SetBkMode(hdc,TRANSPARENT);
TextOut(hdc,100 ,150 ,str,lstrlen(str));
SelectObject(hdc,OldFont);
DeleteObject(MyBrush);
DeleteObject(hFont);
EndPaint(hWnd,& ps);
return 0 ;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0 );
return 0 ;
}
접기
☆결과
※텍스트 색상 함수
-SetTextColor = 글자 색을 지정
-SetBkColor = 글자 뒤쪽의 배경 색상을 지정
-SetBkMode = 배경색상을 사용할 방법을 설정
iBkMode자리에 OPAQUE를 쓰면 불투명한 배경색상을 사용한다.
iBkMode자리에 TRANSPARENT를 쓰면 투명한 배경색상을 사용한다.
☆글자 회전시키기
더보기 접기
#include "MsgProc.h"
HDC hdc;
PAINTSTRUCT ps;
int i;
HFONT MyFont, OldFont;
TCHAR *str = TEXT(" Beautiful Korea" );
LRESULT OnCreate (HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnCommand(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnLButtonDown(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
return 0 ;
}
LRESULT OnPaint(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
hdc = BeginPaint(hWnd,& ps);
SetBkMode(hdc,TRANSPARENT);
for (i= 0 ;i< 900 ;i+= 100 )
{
MyFont = CreateFont(50 ,0 ,i,0 ,FW_NORMAL,FALSE,FALSE,FALSE,
ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,VARIABLE_PITCH| FF_SWISS,
TEXT("Times New Roman" ));
OldFont = (HFONT)SelectObject(hdc,MyFont);
TextOut(hdc,0 ,450 ,str,lstrlen(str));
SelectObject(hdc,OldFont);
DeleteObject(MyFont);
}
EndPaint(hWnd,& ps);
return 0 ;
}
LRESULT OnDestroy(HWND hWnd, WPARAM wParam,LPARAM lParam)
{
PostQuitMessage(0 );
return 0 ;
}
접기
☆결과
-CreateFont에서 3번째 인수인 nEscapement를 0~900까지 100단위로, 즉 각도를 10단위로 계속 증가시키며 문자열을 출력한 것이다.