AVR 마이크로컴퓨터 각종 조작 ②-2 직렬 통신 2

마침내 해결되었다.

1. 신호 확인


느려서 받아들일 수 없는 의혹이 있는지 알아보기 위해서.
일단 TXD가 보낸 신호부터 봐.
직렬 삽입의 저항치를 바꾸어 보아라.

1kΩ

330Ω


1kΩ와 330Ω는 거의 변화가 없다.
0Ω면 예뻐져요.
저항력이 있어서 그렇게 망쳤다고 해도 그렇지 않아요
다른 원인을 추측해 낼 수 있다.
발송 간격이 꽉 닫혀 있음을 분명히 알 수 있다
아마도 이 때문일 거예요.

2. 간격 변경 보내기


그곳에서 보내는 시간 간격을 다시 비우다.
ADC 데이터의 발송도 고려해야 한다.
최대 샘플링 비율이 15kSample/s이므로 시작 및 정지 비트가 포함될 경우
실제로는 300kbit/s가 필요합니다.
따라서 포터율을 500k로 설정한다.(이렇게 하면 패리티를 추가할 수도 있습니다.)
그런 다음 8Bit 타이머 중단으로 전송 간격을 관리합니다.
값을 15kHz로 설정하고 2Byte를 동시에 보내는 것을 고려합니다.
꼴찌로 66.67을 뽑다μs로 설정하면 타이머가 끊깁니다.
20Hz/전면 주파수 분할 = 0.4μs/1 계수
가장 좋은 곳은 8분 주파수, 166계수로 측정하는 것이다.
제가 먼저 디버깅을 해볼게요.

1차 중단 73.35μs

2차 중단 140.2μs
140.2μs - 73.35μs = 66.85μs(14.959kHz)
이제 이 정도면 충분해.
이후 측정 시간의 편차가 문제가 될 수 있다.
이렇게 되면 크리스탈은 16MHz가 필요합니다.
따라서 다음 코드를 재생해 보세요.
main.c
#include <avr/io.h>
#include <avr/interrupt.h>


int main(void)
{

    /* Replace with your application code */

    //int mode =0;
    InitC();
    PORTC = 1;  //PORTCはデバッグ用
    UCSR0A = UCSR0A |0b00000010; //倍速設定
    UCSR0B = 0b00001000;
    UCSR0C = 0b00000110;
    UBRR0 = 4;
    PORTC = 2;

    TCCR0A=0b00000010;//比較一致動作に設定
    TCCR0B=0b00000010;//8分周設定
    OCR0A=166;//一致発生カウント
    TIMSK0=0b00000010;//タイマ一致割込み有効

    sei();//割込み有効

    while(1)
    {

    }
}
//タイマ一致割込み
ISR(TIMER0_COMPA_vect){
    while ( !(UCSR0A & (1<<5)) );
    UDR0 = 0x77;
    while ( !(UCSR0A & (1<<5)) );
    UDR0 = 0x33;
    PORTC++;
}
void InitC(){
    DDRC = 0b00111111;
}


신호의 파형은 예상대로 되었다.
2비트를 넣을 여지도 있는 것 같다.
그리고 마지막으로 컴퓨터가 받을 수 있는지 없는지를 시험해 보세요.

문제 없을 것 같습니다.
이후 저항 1kΩ를 넣었지만 현재는 부호가 흐트러지지 않았다.
따라서 다음은 PC에서 데이터를 보내고 그 응답을 되돌려주는 것이다.

좋은 웹페이지 즐겨찾기