회원가입 ID/PW 찾기
AA
1. 사용환경 :
  - chip : RealTech 2120
  - compiler: Keil 컴파일러 v3.5
 2. 목적.
  - UART로 외부에서 통신사용 및  내부타이머 사용.
 3. 문제점.
  : 기존코드에서는  UART 통신이 문제가 없었음. 그러나 내부 타이머 동작이 uart로 메세지 출력해야
    내부타이머 동작이되는 문제가 있어, 타이머 인터럽트 우선순위를 high로 설정함. 그후, 타이머
    는 정상적으로 동작이 되나, UART 통신의 receive가  제대로 동작이 안됩니다.
    내부 타이머도 정상적으로 사용하면서, UART 로 수신 기능도 사용하는 방법이 없을까요.
 
4. 초기화 코드
=> 아래 코드에서     " PT0 = 1; // add by gchwang for Timer0 Priorty High "
    부분막 막으면, UART Receive 가 제대로 동작합니다만, 대신 내부 타이머 0번이
    UART 로 메세치 보낼때마다 Timer에 등록된 함수가 한번씩 호출되는것 같습니다.
///////////////////////// MCU 초기화 /////////////////////////////
void CMcuInitial(void)
{
    IE      = 0x00;                         // Disable all interrupts
    TMOD    = 0x11;                         // Program Timer0 & Timer1 to Mode#1 // timer 0/1 번 사용
    TR0     = 0;                            // Stop Timer0
    TF0     = 0;                            // Clear Timer0 Overflow Bit
    TL0     = _TIMER0_COUNT_LBYTE;          // Load Timer0 low-byte   (for 0.375ms)
    TH0     = _TIMER0_COUNT_HBYTE;          // Load Timer0 high-byte  (for 0.375ms)
    TR1     = 0;                            // Stop Timer1
    TF1     = 0;                            // Clear Timer1 Overflow Bit
//    IE      = 0x8a;                         // Enable interrupts of Timer0
    IE      = 0x8e;                         // 061226
   CKCON    = 0x00;     //070517_V403_Patch  // Stretch Memory Cycle = 0

///////////////////////// UART 초기화 /////////////////////////////
void    CUartInitial(void)
{
    DWORD    Temp;

    EA        = 0;

    SCON    = 0x50;

    ES        = 1;
    PS        = 1;

    T2CON    = 0x34;

    //(65536 - (24576 / 57600 * 32)) = 0xFFF2
    Temp    = 65536 - (((DWORD)_MCU_XTAL) * 32 / _UART_BUAD_RATE);
    RCAP2L    = Temp & 0xFF;
    RCAP2H    = Temp >> 8;

    uartRxCnt = 0;
    pwUartRx = 0;     
    prUartRx = 0;     

    TI         = 0;
    EA        = 1;
}
////////////////////// MAIN 함수 에 추기한 초기화문 ////////////////////
void CMainSystemInitial(void)
{                     
    // Initial MCU

    CMcuInitial();
//    CTimerDelayXms(250);
       CUartInitial();

    TR0 = _ON;
    TL0 = _TIMER0_COUNT_LBYTE;
    TH0 = _TIMER0_COUNT_HBYTE;
    TR0= _ON; // GC IR
    ET0 = 1;

    EX1=1;// gc ir  interrupt 1 enable
    IT1 = 1;  // set to specify falling edge trigger
    PT0 = 1; // add by gchwang for Timer0 Priorty High
//    CDdcciInitial();
    P1 = 0xff;

////////////////////// MAIN 함수 에 UART Recive 부분 ////////////////////
void main()
{
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if(uartRxCnt>1)
            {

#if 1
                wBuf =0;
                for( i=0; i<uartRxCnt; i++)
                {
                    if(i+1 <uartRxCnt )
                    {
                        switch(uartRxBuf[prUartRx+i])
                        {
                            case 0x38:
                            case 0x39:                       
                            case 0x41:
                            case 0x42:
                            case 0x43:
                            case 0x44:
                            case 0x45:
                            case 0x46:
                            case 0x49:
                            case 0x50:
                                wBuf = uartRxBuf[prUartRx+i];
                                wBuf <<= 8;
                                wBuf += uartRxBuf[prUartRx+i+1];                           
                                break;
                        }
                    }
                }
                prUartRx += uartRxCnt;
                prUartRx %= 16;
                uartRxCnt = 0;
//////////////////// UART Interrupter Handler /////////////////


void    CUartInterruptHandler(void)    interrupt 4
{
    ES = 0;
/*
    if (TI)
    {
        TI = 0;
    }
 */
    if (RI)
    {
        RI = 0;
        if(uartRxCnt<16)
        {
            uartRxBuf[pwUartRx] = SBUF;
            pwUartRx++;
            pwUartRx %= 16;
            uartRxCnt++;
        }
    }

    ES = 1;
}
///////////////////////////////////////////////////////////////////////
댓글 3
  • No Profile
    글쌔요 소스가 쪼개져서 잘 모르겠네요..
    통신데이터를 버퍼를 이용해서 받으므로 main문에서 while 루프에서 데이터를 처리해주시면 될듯합니다.
    물론 타이머에서는 데이터가 업데이트 되면 트리거 변수를 하나 설정해서 데이터 업데이트를 알려주시고요^^
  • No Profile
    글쓴이 처니 10.07.10 14:29 댓글 좋아요 0 싫어요 0
    uart RX 처리하는부분이 빠졌네요. 관련 코드 다시 추가했습니다. ^^;
    타이머 인터럽트 우선순위를 high로 설정하면,  Uart 인터럽트 핸들러가 동작가 아예 동작 되지 않느것 같아요.
    그게 동작되야 메인에서 버퍼 카운트 확인해서 읽어 버리는데, 카운트값이 증가가 안되니...
    그래서, 혹시 초기화 세팅에 문제가 있는지 해서요.
    지금당장 시간이 없어서 프로그램 2가지로 나누려고 합니다. 
  • No Profile
    코드가 눈에 잘 들어오지가 않네요.ㅠㅠ
    우선순위랑은 별 상관이 없습니다.  로직의 시퀀스 구성이 좀 문제인거 같은데요.
    원하는 기능들을 주석으로 달아놓으면 주석과 소스구현이 다른부분을 쉽게 찾아드릴꺼 같습니다.
    소스만 주욱 나열해놓으니 최근에 8051을 안하고 있는 저로서는 좀 힘드네요.
    추천해드리고 싶은 방법은 uart인터럽트에 동작여부만 판단하기 위해 usart 인터럽트 함수 호출시 led나 lcd로 표시하는 겁니다. 동작안된다고 하시는데 이것은 로직이 틀린건지 레지스터 설정이 꼬여서 함수콜이 안되는지 알 수 없습니다.

하드웨어 설계 및 개발에 대하여 개발자들이 자유롭게 토론하는 공간입니다.
- Q&A, 자유주재 토론, 관련 정보 공유
- 분야 : 마이크로프로세서 응용, 전기/전자(아날로그/디지털) 회로 설계, C/C++ 프로그래밍, 펌웨어,
         PCB Artwork, 트러블슈팅 등 하드웨어 설계에 관한 전반인 내용
※ 게시글에 맞는 분류를 선택하여 글을 작성해 주시면 쾌적한 사이트 운영에 많은 도움이 됩니다.
※ 하드웨어 인사이트는 회원들간의 거래정보를 게재할 뿐이지, 그 어떤 책임과 의무도 가지지 않습니다.

search
번호 분류 제목 글쓴이 조회 수 날짜
568 마이크로프로세서 HOTatmaga128 에서 uart통신을 두개 동시에 쓸수있나요?4 광주공돌이 1445 2010.07.24
567 마이크로프로세서 HOT스텝모터 연결법 좀 알려주세요10 보리리 3634 2010.07.20
566 마이크로프로세서 HOTAVR 학습 방법에 대해...9 Brad 1388 2010.07.20
565 마이크로프로세서 HOTPIC16F684 외부인터럽트 질문입니다.2 세종허리케인 3567 2010.07.15
564 마이크로프로세서 HOT안녕하세요^^ ATmega128 초보자 입니다.^^5 sk민호 1147 2010.07.15
563 마이크로프로세서 HOTPIC16F684 프로그램 로직 질문드립니다..초보에요..ㅠㅠ 세종허리케인 971 2010.07.14
562 마이크로프로세서 HOTText LCD 동작을 안해서..ㅠㅠ7 호그니 1406 2010.07.13
561 마이크로프로세서 HOTCadence SPB 16.2 설치 방법 알려주세요 ㅠ4 해녀땅파 4963 2010.07.09
560 마이크로프로세서 HOTavr128로 IO 포트로 레지스터없이 I2C통신하기1 미틴개발자 2311 2010.07.08
559 마이크로프로세서 HOT8051과 RFID를 연동할때 C언어 소스..1 president 1767 2010.07.02
558 마이크로프로세서 HOT8051 전공은 무엇을 ㅠ?7 날아라신동 1049 2010.07.01
마이크로프로세서 HOT8051에서 timer 와, rs232 동시에 사용하기.3 처니 2095 2010.06.29
556 마이크로프로세서 HOT온도센서 하이퍼 터미널 값이 제대로 출력이 안되요 ㅠㅠ3 꿈꾸는몽상가 3137 2010.06.29
555 마이크로프로세서 HOTatm 128 전자자물쇠 관련.2 수환 1403 2010.06.25
554 마이크로프로세서 HOT8051 막 배우기 시작햇는데 도와주세요4 츄리닝 1165 2010.06.25
553 마이크로프로세서 HOTFirmsys RFID Demo Kit와 atmaga128 UART통신좀 봐주세요~1 해돌이 2892 2010.06.24
552 마이크로프로세서 HOT완전초보가 당장 만들 수 있는게 뭐가 있을까요?13 dozzamon 1315 2010.06.22
551 마이크로프로세서 HOT어셈블리어 난수 생성1 croquette 2529 2010.06.21
550 마이크로프로세서 HOT4433을 atmega8로 어셈블리어 수정 부탁 드릴게요 qusgmltjd 1383 2010.06.21
549 마이크로프로세서 HOT스위치 / LED 제어관련해서 질문드립니다ㅠ1 으잌ㅠㅠ 1422 2010.06.20
Prev 1 ... 17 18 19 20 21 22 23 24 25 26 ... 50 Next
  • 전쟁에선 어느 편이 스스로를 승자라고 부를지라도 승리자는 없고 모두 피해자뿐이다.
    - 챔벌린
  • * 납포인트 정보 *
  • 글 작성 : 3
  • 댓글 작성 : 1
  • 내 글이 추천받음 : 1
저작권법에 위배되는 콘텐츠는 등록 불가하며, 저작물에 대한 권리는 저작자에게 있습니다.
Copyright 2006-2021 © hardwareis.com, All rights reserved.