기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요.
Mp3 플레이어를 만들고 있는데요,

숏키는 구현했는데, 롱키 구현이 잘 안되어서 문의드립니다.
아래는 숏키를 구현한 소스인데요,
여기에 롱키 루틴을 집어넣어야 하는데,
어떤식으로 해야하는지, 롱키 해보신분 계신가요.

###########################################################
void Timer0_ISR
{
     KeyIn();    // 1ms마다 주기적으로 인터럽트가 걸립니다.
}


void main (void)
{
     while(1)
     {
          KeyPro(); // 키에 대한 동작을 실행하는 루틴
     }
############################################################

//----------------------------------------------------------------------------
// 키가 눌렸는지 체크하는 루틴
//----------------------------------------------------------------------------
void KeyIn(void) // 키를 스캔하여 값을 저장
{
        unsigned char tData;

        if(KeyInDeFlg)
                return;

        tData = (poDATA^0xff) & 0x1f;
        
        if(tData != OldKeyData) // 이전 키값과 같지 않다면..
        {
                KeyInChatCnt = 0;
                OldKeyData = tData;
        }
        else // 이전 키 값과 같다면, 55번 똑같은 신호 감지후, 키 값을 넘겨줌.
        {
                KeyInChatCnt++;
                if(KeyInChatCnt > 55) // 채터링 방지
                {
                        KeyInChatCnt = 0;
                        if((KEYFLG.all == 0)&& tData)
                        {
                                KeyInFlg = SET;
                        }
                        KEYFLG.all = tData; // 키 값을 넘겨준다.
                }
        }
}



//----------------------------------------------------------------------------
// 키가 눌렸다면 그 버튼에 대한 기능 수행.
//----------------------------------------------------------------------------
void KeyPro(void)
{

        if(!KeyInFlg)
                return;
        
        KeyInFlg = CLR;

        
        if(KEY_PLAY_STOP)                        // 재생/정지 키가 눌렸다면
                key_play_stop();

        if(KEY_PREV)                // 이전곡 키가 눌렸다면
                key_prev();

        if(KEY_NEXT)                // 다음곡 키가 눌렸다면
                key_next();

        if(KEY_VOLUP)                // 볼륨+ 키가 눌렸다면
        {
                key_vol_up();             // 볼륨을 올리고
        }

        if(KEY_VOLDOWN)                // 볼륨- 키가 눌렸다면
        {
                key_vol_down();        // 볼륨을 내리고
        }


}

김광준

2008.05.08 20:56:30
*.94.41.89

KeyPressed와 KeyReleased를 분리하여 처리하여야 합니다.
키스캔 로직이 하드웨어로 구현되어 있다고 가정한다면
KeyPressed event가 발생하면 타이머를 동작시킵니다.
타이머가 expire되기 전에 KeyReleased event가 들어오면 short키로 처리하고
반대로 KeyReleased event보다 타이머 event가 먼저오면 long키로 처리합니다.

이세종

2008.05.08 21:39:05
*.148.96.152

광준님 답변 감사드립니다. 롱키, 숏키를 같이 구현하려고 하니 여러가지 조건 처리 때문에 머리가 복잡하네요.^^; 참고하도록 하겠습니다.

이세종

2008.05.09 00:17:16
*.148.96.152

현재 상태는 128kbps 재생시 키 버튼이 잘 동작하는데요,
192kbps를 재생하면 타이머ISR 쪽이 넘 늦게(먹통) 동작을 합니다.
MP3 디코더 칩으로부터 외부0인터럽트로 mp3 데이터 요청을 받거든요.

128kbps는 잘 되는데 192kbps 재생시에만 타이머쪽이 느리게 동작하니..
원인을 못찾아서 헤메고 있습니다. 키 루틴은 타이머가 잘 동작해야 하는데..

고현철

2008.05.09 11:17:01
*.59.122.203

192kps처리서 while문이나 이런 부분들에서 cpu를 점유하는 모양이네요.

timer interrupt를 밀어낼정도로요. RTOS면 설계를 잘못할 경우 가끔 발생하는 문제인데, 이런 일이 발생해서는 안되는 일입니다.

인터럽트 금지를 하고, 루프를 도는 루틴이 있으면 그 부분을 수정하셔야 할 듯 합니다.

이세종

2008.05.09 17:30:20
*.148.96.152

네, 외부0 ISR 쪽을 보니 while(1)문 하나가 들어있는데요, 50->0까지 카운트하고 break;걸리게 되어있어서, 이 숫자를 5 정도로 잡아주니 타이머가 이전보다 많이 빨라졌습니다. RTOS는 탑재되지 않았고, 8051+mp3디코더를 사용하고 있습니다.
List of Articles
번호 제목 글쓴이 날짜 조회 수
248 [re] 2440 TFT-LCD.? <== 다시 수정요 [1] 손성원 2008-05-16 597
247 임베디드 보드 개발 의뢰를 할까 합니다 [20] 김형섭 2008-05-15 1084
246 오픈소스 arm porting 관련 사이트가 있나요? [2] 정재용 2008-05-14 834
245 [질문] nand flash의 bad발생때문에 고민입니다. [3] 오대광 2008-05-14 642
244 [완료] FAT16에서 특정부분으로 가려고 하는데, 속도가 딸립니다. [6] 이세종 2008-05-13 663
243 [완료]home server제품에 대해서… [3] 강용근 2008-05-13 656
242 [완료]warning message에 대해서… [1] 김진희 2008-05-09 744
» [완료] 롱키, 숏키에 대한 문의입니다. [5] 이세종 2008-05-08 1380
240 802.11g 를 지원하는 무선랜에서 ad-hoc 모드에 관한 질문입니다 ^^ 서두원 2008-05-06 938
239 s3c2440관련 질문입니다. [3] 김해성 2008-05-03 714
238 camstream arm poting후 이런 에러 메세지가 뜨네요 [1] 정재용 2008-05-03 741
237 webcam 타겟보드에서 테스트할 수 있는 app좀 알려주세요. [1] 정재용 2008-05-02 837
236 [완료]컴파일에 관해서 몇가지 여쭙니다. [2] 김경식 2008-04-30 765
235 고도리님, 90번글에 대해 질문입니다~!! [4] 정재용 2008-04-29 846
234 [re] 이렇게 하시면 됩니다. 고현철 2008-04-30 1003
233 [re][re] 이렇게 하시면 됩니다. [2] 정재용 2008-04-30 729
232 [질문] POLLUX에 대해서 몇가지 질문 드립니다. [5] 장병남 2008-04-29 779
231 [re] IDCT 라는 용어가 나와서,,, [1] 장병남 2008-04-30 734
230 camstream-0.27 ARM(s3c2440)용으로 컴파일 오류...Help~! [3] 정재용 2008-04-28 942
229 GUI 프로그래밍??? [1] 한기태 2008-04-23 911

사용자 로그인