티스토리 뷰


----------------------------오전----------------------------

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를 분리해야한다.
  1. 34를 10으로 나누면 3이 나오고, 그 값을 4번 왼쪽으로 밀어준다.-->0011 -->00110000
  2. 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 ) : 인터럽트 일을 하는 함수= 인터럽트 함수


























공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함