2017-11-08 28 views
0

내가 Attiny167의 uart를 통해 데이터를 얻으려고하는데, 전송 속도 57600에서 인터럽트 모드로 작동하지만, 내가 디버그 할 때만 수신합니다. CR & LF 데이터가 수신되지 않습니다. 아래의 컨트롤러는 내 코드입니다.Atiny167 컨트롤러에서 Uart 문제

#define CPU_CLOCK_FREQ 8000000UL 
#define SAMPLES_PER_BIT 8 
#define BAUD_RATE 57600 
    ISR(LIN_TC_vect) 
    { 
     cli(); 
     temp=LINDAT; 

      buff[i]=temp; 
      i++; 


     sei(); 

    } 
    void USARTInit() 
    { 

     DDRA = 0x02; // Port A Rx/Tx as input/output for PIN0 and PIN1 

     /* Set PORTB as input from FACS MAin BOX on PIN0 and PIN1 , initially high */ 
     DDRB = 0x00; 
     PORTB= 0xFF; 

     /* Set samples per bit and UART baud */ 
     LINBTR = (1 << LDISR) | SAMPLES_PER_BIT; 
     LINBRR = (((CPU_CLOCK_FREQ)/SAMPLES_PER_BIT)/BAUD_RATE) - 1; 

     /* Configure LIN UART in UART mode */ 
     LINCR = (1 << LENA) | (1 << LCMD0) | (1 << LCMD1) | (1 << LCMD2); 
     // enable transmit and recieve interrupts for LIN/UART transfer 
     LINENIR = (1 << LENRXOK); 

     sei(); 

    } 

도와주세요.

+1

에서 내 경우에는 작동 클럭입니다 않았다가 아닌가 모든 마스크 가능한 자동 중단 인터럽트가 호출되면 CPU에 의해 차단됩니까? 저것은 마이크로 제어기가 보통 일하는 방법이다, 나는 AVR가 어떤 다른다고 믿지 않는다? – Lundin

+0

전송 속도 불일치로 인해 CR/LF 만 수신 될 수 있습니다. 전송 속도 문제로 인해 CR 및 LF 만 수신 할 수 있습니다. 확인 : 주변 클럭이 8MHz의 2입니다 1. 경우에 당신은 당신이 정말로 LINDAT 레지스터를 읽어 0 3. 마스킹 비트 [15시 12분]와 LINBRR 레지스터 내로 짧은 INT (16 비트)를 작성하는 것이 unsigned char 변수 4. LIN_ERR_vect를 등록하고 주변 장치의 오류가 있는지 확인하십시오. – fisehara

답변

0

귀하의 질문에 매우 중요한 것을 언급하는 것을 잊어 버렸습니다. ISR이 호출되면? 들어오는 문자 나 나가는 문자에 대해 인터럽트를 지정했지만 버퍼에서 읽거나 쓸 때 ISR이 호출되는지는 알려주지 않았습니다. 이렇게하면 실제로 제안 할 때 도움이됩니다.

ISR이가 문자를 인쇄하는 것을 가정했다 즉, 문제는 여기에있을 것 같다 : 당신은 아마 반대 의미

buff[i]=LINDAT; 

:

LINDAT=buff[i]; 

을이은을 쓸 것 같은 바이트를 레지스터에 넣고 작은 것은 자동으로 uart에 전달해야합니다 (LBUSY 버퍼처럼 일부 비트를 토글하여 버퍼 오버플로가 발생하지 않도록 도와줍니다)

LINBRR = (((CPU_CLOCK_FREQ)/SAMPLES_PER_BIT)/BAUD_RATE) - 1; 

당신 반올림 오류의 좋은 많은 일으켜 :이 계산하기 때문에, 전혀 인쇄 아무것도 볼 수 있다면 내가 놀랄 것이라고 말했다 (10). 정확한 값으로 전송 속도를 설정하지 않습니다. (일반적으로 종이의 값을 계산하고 직접 정확한 값을 입력합니다.) 이것은 쓰레기가 인쇄되어 있는지 확인하는 다음 단계입니다. 수신기의 클록과 동기). 이 외에도, 보드 속도, 클록 주파수 및 비트 당 샘플 (이미 올바르게 기억하는 경우 기본적으로 8로 설정되어 있음)은 자주 변경되지 않으며 프로세서 또는 UART의 클록킹 (아래) 소프트웨어를 구현하기 어렵습니다. 그것은 모두 필요합니다. 데이터 시트에는 시계를 기반으로 LINBRR을 계산하는 수식이 있어야합니다.

마지막으로 몇 개인 비고. 57600 보오는 상당히 높은 주파수입니다. 수신기가 수신기에 대처할 수 있다고 확신합니까? 매우 빠르다는 것은 모든 것을 매우 빠르게 움직이게하지만, 도중에 몇몇 캐릭터를 잃을 수도 있습니다.

DDRA= (1<< DDA1) | (1<< DDA0); 

그것은 당신이 설정하는 비트를 정확하게 알고 코드를 훨씬 더 읽기 쉽고 유지 보수합니다 :

DRA=0x02; 

일반적으로, 이것은 더 나은 대안이다 : 또한이 방법으로 값을 할당 피하려고 (#def DDA1 & DDA0) 할 수 있습니다.

PS 19200까지 확장하고자하는 경우, 당신은 할 수 :

LINBRRL = 0x000C; 

그것은, 내가 또한 8MHz의