일반

LED 깜빡 거림.

by 러빙유 posted Jan 08, 2008
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?
  • 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
    구조가 잘 되어 있는 소스를 보면 많은 도움이 될겁니다.^^
    많이 해보시구요...

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