메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
일반
2008.01.08 12:57

LED 깜빡 거림.

조회 수 15,505 추천 수 0 댓글 8
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?
  • WhiteAT 2008.01.08 13:40
    main() 함수에서 LED 관련함수를 계속 호출하고,
    LED 관련함수에서는 일정 시간이 되면 일을 하게 하는 방법은 어떨까요?

    일단 몇가지 변수를 추가하고요.
    byte g_byteLEDOperMode; //  0 : LED off
                                           //  1: LED ON
                                           //  2: LED BLINK
    UINT16
    g_uiOperatingOutLEDTimer;
    UINT16 g_uiOperatingOutLEDStatus;

    메인에서
    OperatingOutLED() 함수를 루프로 호출하고
    main(){
        while(1) {
             OperatingOutLED();
        }
    }


    void OperatingOutLED(){
         // 일정시간이 되지 않았으면 리턴
         if(g_uiOperatingOutLEDTimer >0) return;

         // 일정시간이 되면 실행하겠다.
          if(2==g_byteLEDOperMode){
                  // blink 모드이다.
               g_uiOperatingOutLEDTimer=1000;     // 다음에 1000이 경과된 후에 OperatingOutLED() 들어와라  
                if(0==g_uiOperatingOutLEDStatus){
                          //  LED OFF
                         
    g_uiOperatingOutLEDStatus = 1;
     
                 }
              }else if(1==g_uiOperatingOutLEDStatus){
                          //  LED ON
                         
    g_uiOperatingOutLEDStatus = 0;
     
                 }
          }

    }

    타이머인터럽트 에서
    if(g_uiOperatingOutLEDTimer >0) g_uiOperatingOutLEDTimer--; // 감소시켜 주고.


    이 방법이 처음에는 어려워 보일수 있으나 확장성이 좋고, 프로그램이해가 쉬운 방법입니다.


    제가 사용한 소스를 보여드릴테니 참고하세요.^^
     void OperatingLED(){
    
        struct _FUNC_INFO structThisState;
        structThisState= stateOperLED;
        if(structThisState.uiTimer0) return;
    
        structThisState.uiTimer0=1000;
    
        switch(structThisState.uiState){
            case 0:    // A positive
                structThisState.uiState=1;
                OPERATING_LED = 0;
    
                break;
            case 1:    // B positive
                structThisState.uiState=0;
                OPERATING_LED = 1;
    
                break;
            default:
                structThisState.uiTimer0=1;
                structThisState.uiState=0;
                break;
            
        }
        stateOperLED = structThisState;    
    }
    
    ////////////////////////////////////////////////////////////////////
            if(stateOperLED.uiTimer0)        stateOperLED.uiTimer0--;
    
    
    ///////////////////////////////////////////////////////////////
        while(1) { 
    
            #asm("WDR")
             OperatingLED();
            OperatingADC();
            
        }
    
    
    






  • 러빙유 2008.01.08 14:26
    감솨합니다. 상당히 괜찮은 구조인 것 같습니다. 혹시 LED BYTE별 제어가 아니라 비트별 제어를 하게 된다면,

    Switch case 문같은 선택문이나 for 같은 반복문을 써서 비트별로

    (2==g_byteLEDOperMode){
                  // blink 모드이다.
               g_uiOperatingOutLEDTimer=1000;     // 다음에 1000이 경과된 후에 OperatingOutLED() 들어와라  
                if(0==g_uiOperatingOutLEDStatus){
                          //  LED OFF
                         
    g_uiOperatingOutLEDStatus = 1;
     
                 }
              }else if(1==g_uiOperatingOutLEDStatus){
                          //  LED ON
                         
    g_uiOperatingOutLEDStatus = 0;
     
    위 사항을 실행시켜 주어야 하는 것이나요?  아님, 다른 정형화된 것이 있는지요?..
  • WhiteAT 2008.01.08 14:47
    질문을 정확히 이해를 못했는데요^^.
    그 구조와 비슷하게 하시면 됩니다. (byte가 bit 보다 8배 공간이 크다는 차이뿐이 없습니다)

  • 러빙유 2008.01.08 15:12
    감솨합니다. 일단 제가 이래 저래 해보고 하다가 막히는 것만 질문 드리겠습니다. 감솨합니다.
  • 러빙유 2008.01.08 15:22 글쓴이

    아. 아무래도 여쭈어 봐야 겠습니다.

    제가 하고자 하는 것은 비트별 깜빡거림 구현이었습니다.

    그러니깐 main() 에서 LED[0] = 2 하면 BLINK 모드로서

    첫번재 LED만 깜빡거리고 나머지 LED 7개는 점등, 또는 소등 되어 있는 상태를 구현하고 싶습니다.

    결국, 그렇다면 위에 보여주신 구조가 8개가 반복되어야 하는 것인지...구조가 감이 안 잡혀서 질문을 드립니다....--

  • WhiteAT 2008.01.08 15:53
    1. 좀 무식한 방법으로 ㅡㅡ;
        제가 알려드린 소스를 8개 만들어서 각각의 비트를 제어할수 있구요^^

    2.
    LED로 보낼 데이터를 임시로 보관할 변수를 만들고,
    BYTE g_byteLEDOutput;

    // 만약 3번째(즉,bit2)를 blink 해야 한다면
    g_byteLEDOutput = g_byteLEDOutput & ~(1<<2); // bit2 => CLEAR
    g_byteLEDOutput = g_byteLEDOutput |    (1<<2); // bit2 => SET
    // 즉 위의 두줄은 다른 비트에 영향을 주지 않기 때문에, 사용할 비트만 제어할수 있습니다.
    // 이 소스를 앞에서 말한 소스(바이트 제어하는 소스)에 넣으면 될겁니다.^^
     

    마지막에 LED <= g_byteLEDOutput; // 포트로 LED 출력 보내는거 잊지 마시구요^^.

  • 러빙유 2008.01.08 16:18 글쓴이
    아. 그렇군요. 많은 도움이 될 것 같습니다. 정말 프로그램 간단한 것은 정말 간단한 것인데, 저는 프로그래밍 기법보다 구조를 잡는 것이 제일 힘드네요..
  • WhiteAT 2008.01.08 16:50
    구조가 잘 되어 있는 소스를 보면 많은 도움이 될겁니다.^^
    많이 해보시구요...

    여하튼 잘 해결되길 바랍니다.~~.

  1. VC++ RS232C통신 및 Log data 수집

    Date2009.04.04 Category :일반 Reply1
    Read More
  2. [MFC]키보드 입력 관련 질문입니다.

    Date2009.02.03 Category :일반 Reply1
    Read More
  3. 어제 테트리스에 댓글 달았던 학생입니다

    Date2008.12.13 Category :일반 Reply2
    Read More
  4. 테트리스 소스에 대한 질문이있습니다.

    Date2008.12.12 Category :일반 Reply1
    Read More
  5. 기술자료실에 127번 글에서 질문있습니다..

    Date2008.12.01 Category :일반 Reply1
    Read More
  6. 문제 답변 쫌 부탁드려요~ ^^

    Date2008.11.09 Category :일반
    Read More
  7. 조언 부탁드립니다. 필드에서 지적 받은건데요..

    Date2008.06.13 Category :일반
    Read More
  8. c++구조체와 함수를사용해서 성적표만들기2

    Date2008.05.29 Category :일반 Reply1
    Read More
  9. c++구조체와 함수를사용해서 성적표만들기

    Date2008.05.29 Category :일반 Reply1
    Read More
  10. mfc 테트리스 질문이요~

    Date2008.05.15 Category :일반 Reply1
    Read More
  11. RS485 통신 방법

    Date2008.01.22 Category :일반 Reply3
    Read More
  12. 함수인자를 구조체 변수나 구조체 주소로 받는 것.

    Date2008.01.14 Category :일반 Reply2
    Read More
  13. 인터럽트 루틴을 메인으로 빼고자 하는데 가능할 지요?

    Date2008.01.09 Category :일반 Reply12
    Read More
  14. LED 깜빡 거림.

    Date2008.01.08 Category :일반 Reply8
    Read More
  15. IAR 컴파일러 환경에서 AVR128 Timer1 인터럽터 구현이 안되요..

    Date2008.01.04 Category :일반 Reply2
    Read More
목록
Board Pagination Prev 1 2 3 4 Next
/ 4