AVR 마이크로컴퓨터 각종 조작 ②-2 직렬 통신 2
5924 단어 ATmega328PAVR직렬 통신
1. 신호 확인
느려서 받아들일 수 없는 의혹이 있는지 알아보기 위해서.
일단 TXD가 보낸 신호부터 봐.
직렬 삽입의 저항치를 바꾸어 보아라.
1kΩ
330Ω
0Ω
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에서 데이터를 보내고 그 응답을 되돌려주는 것이다.
Reference
이 문제에 관하여(AVR 마이크로컴퓨터 각종 조작 ②-2 직렬 통신 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/smnhooi/items/f267b30aeec45c8e451d
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
그곳에서 보내는 시간 간격을 다시 비우다.
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에서 데이터를 보내고 그 응답을 되돌려주는 것이다.
Reference
이 문제에 관하여(AVR 마이크로컴퓨터 각종 조작 ②-2 직렬 통신 2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/smnhooi/items/f267b30aeec45c8e451d텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)