티스토리 뷰
----------------------------오전----------------------------
7-SEGMENT에 원하는 값을 출력해보자
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main()
{
volatile unsigned int uiCnt;
DDRA = 0xFF;
PORTA = 0x00; //모든 포트 출력을 0으로 바꿈--> 기판에 00이 출력됨
PORTA = 0x01; //이 부분의 hex값에 따라 값이 바뀌게 된다.
while(1)
{
}
return 0;
}
|
|
만약 0x10을 하게 되면 10이 출력되지는 않는다.
34를 띄워보자
34를 띄우기 위해서는 34에서 3과 4를 분리해야한다.
- 34를 10으로 나누면 3이 나오고, 그 값을 4번 왼쪽으로 밀어준다.-->0011 -->00110000
- 34를 10으로 나누고 남은 나머지 4를 or연산으로 1번의 결과와 더해준다. -->00110000+0100 -->00110100 = 34가 된다.
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main()
{
volatile unsigned int uiCnt;
DDRA = 0xFF;
PORTA = ((34/10)<<4)|(34%10);
//3을 4칸 밀어라-->30자리 획득(00110000),4를 추출(bit or)
while(1)
{
}
return 0;
} |
|
/*
위의 소스에서 uiCnt라는 변수에 34를 집어넣고 34를 uiCnt로 바꾸어 보았다.
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main()
{
volatile unsigned int uiCnt;
DDRA = 0xFF;
uiCnt = 34;
PORTA = ((uiCnt/10)<<4)|(uiCnt%10);
while(1)
{}
return 0;
} |
|
/*
위의 소스에서 uiCnt라는 변수에 92를 집어넣고 34를 uiCnt로 바꾸어 보았다.
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main()
{
volatile unsigned int uiCnt;
DDRA = 0xFF;
uiCnt = 92;
PORTA = ((uiCnt/10)<<4)|(uiCnt%10);
while(1)
{}
return 0;
} |
|
숫자를 순차적으로 변하게 해보자
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main()
{
volatile unsigned int uiCnt;
volatile unsigned int uiLoop;
DDRA = 0xFF;
uiCnt = 0;
while(1)
{
PORTA = ((uiCnt/10)<<4)|(uiCnt%10);
for(uiLoop = 0;uiLoop > 60000; ++uiLoop);
}
return 0;
} |
88로 출력되고 아무 변화가 없었다.
... |
/*
버그를 수정해보자
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
volatile unsigned int uiLoop;
DDRA = 0xFF;
PORTA = 0x00;
uiCnt = 0;
while(1)
{
PORTA = ((uiCnt/10)<<4)|(uiCnt%10);
for(uiLoop = 0; uiLoop>60000; ++uiLoop);
++uiCnt;
if(uiCnt > 99)
{
uiCnt = 0;
}
}
return 0;
} |
마찬가지로 88로 출력되고 변화가 없음... |
/*
문제를 해결했다. for문의 비교 연산자 방향이 잘못되었던것.
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
volatile unsigned int uiLoop;
DDRA = 0xFF;
PORTA = 0x00;
uiCnt = 0;
while(1)
{
PORTA = ((uiCnt/10)<<4)|(uiCnt%10);
for(uiLoop = 0; uiLoop<60000; ++uiLoop);
++uiCnt;
if(uiCnt > 99)
{
uiCnt = 0;
}
}
return 0;
} |
|
if문을 추가하여 100이 넘어갈때 uiCnt 를 0으로 초기화 해준다.
----------------------------오후----------------------------
LED를 왔다갔다하게 해보자
이 키트의 LED보드를 켜기 위해서는 1이 아닌 0 값을 넣어줘야 스위치가 연결되어 LED가 켜지게된다.
노가다 소스
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
volatile unsigned int uiLoop;
DDRA = 0xFF;
PORTA = 0x00;
uiCnt = 0;
while(1)
{
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0x7F;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xBF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xDF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xEF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xF7;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFB;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFD;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFE;
}
return 0;
}
|
|
/*
반대로도 왔다갔다 하게 해보자
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
volatile unsigned int uiLoop;
DDRA = 0xFF;
PORTA = 0x00;
uiCnt = 0;
while(1)
{
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0x7F;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xBF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xDF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xEF;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xF7;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFB;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFD;
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = 0xFE;
}
return 0; } |
|
개선된 소스--------------------------------------------------------------
/*
배열로 만들어 보았다.
*/
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
DDRA = 0xFF; //DDRA를 출력으로
PORTA = 0xFF; //PORTA를 꺼놓음
uiCnt = 0;
int i=0;
int iArr[15]= {0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
while(1)
{
for(uiCnt = 0; uiCnt<60000; ++uiCnt);
PORTA = iArr[i];
++i;
if(i > 15)
{
i=1;
}
}
return 0;
}
|
|
잠깐 if-else문을 짚고 넘어가자
#include <stdio.h>
int main()
{
int iNum;
printf("숫자를 입력하시오\n");
scanf("%d",&iNum);
if(100<iNum)
{
printf("100보다 큰수 입니다.\n");
}
else
{
printf("100보다 작은 수 입니다.\n");
}
return 0;
} |
|
비트 연산자와 if문을 이용해서 만들어보자
#define PINA (*((volatile unsigned char *)0x20))
#define DDRA (*((volatile unsigned char *)0x21))
#define PORTA (*((volatile unsigned char *)0x22))
int main(void)
{
volatile unsigned int uiCnt;
volatile unsigned int uiloop;
int iDir;
unsigned int uiPos;
DDRA = 0xFF;
PORTA = 0x00;
iDir = 1;
uiPos = 0;
while(1)
{
if(1 == iDir)
{
PORTA = ~(1<<uiPos);
}
else
{
PORTA = ~(0x0080>>uiPos);
}
uiPos = uiPos + 1;
if(uiPos>7)
{
iDir=iDir * -1;
uiPos=0;
}
for(uiCnt = 0; uiCnt < 60000; ++uiCnt);
}
return 0;
} |
|
여기서 ~는 not을 수행한것
인터럽트의 개념
인터럽트(interrupt) <---반대 개념---> polling
interrupt |
polling |
마이크로프로세서에서 인터럽트(interrupt, 문화어: 중단, 새치기)란 마이크로프로세서(CPU)가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 또는 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것을 말한다.[ |
폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황에서 주로 사용된다. 서버의 제어 장치(또는 프로그램)는 순차적으로 각 단말 장치(또는 프로그램)에 회선을 사용하기 원하는지를 물어본다. |
cpu가 반복적으로 하는 동작 : polling
polling도중 다른 명령이 가능하게 하는 것 : interrupt
인터럽트 때만 호출되는 함수 : 인터럽트 함수
Interrupt Service Routin ( ISR ) : 인터럽트 일을 하는 함수= 인터럽트 함수