本文へ移動
サポートシェアリングソリューション
OKWAVE Plus

このQ&Aは役に立ちましたか?

ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:AVRマイコン UART動作異常)

AVRマイコン UART動作異常

2023/09/06 13:50

このQ&Aのポイント
  • AVRマイコンのATmega168にてPCとRS-232Cにてシリアル通信(UART)を行うと最初のスタートビットが正常に出ない現象が発生しています。
  • 最初のスタートビットが正常に出ない原因がわかりません。解決方法を教えてください。
  • システムクロックは1MHz(内部発振器のみ)、ボーレートは4800bps、データビット数は8bit、ストップビット数は1bit、パリティビット数はなしです。
※ 以下は、質問の原文です

AVRマイコン UART動作異常

2012/02/18 22:14

AVRマイコンのATmega168にてPCとRS-232Cにてシリアル通信(UART)を行うと最初のスタートビット'L'が正常に出ず、スタートビット'L'の後すぐに'H'に戻ってその後データビットを送っています。2回目以降のスタートビットは正常に'L'が指定したボーレートの時間幅で出ており、問題はありません。最初のスタートビットが正常に出ない原因がわかりませんので教えてください。

システムクロック:1MHz(内部発振器のみ)
ボーレート:4800bps
データビット数:8bit
ストップビット数:1bit
パリティビット数:なし
--------------------------------------------
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#define sbi(addr,bit) addr |= (1<<bit)
#define cbi(addr,bit) addr &= ~(1<<bit)

void port_init(void){
PORTB = 0xFE;
DDRB = 0xFF;

asm("NOP");
}

void uart_init(void){
sbi(DDRD,1);
cbi(DDRD,0);

asm("NOP");
}

void uart_putchar(unsigned char c){
loop_until_bit_is_set(UCSR0A,UDRE0);
// asm("NOP");
UDR0 = c;
}

void _delay_1s(void){
int i;
for(i=0;i<100;i++){
_delay_ms(10);
}
}

int main(void)
{
port_init();
uart_init();

UCSR0B = _BV(TXEN0);
UCSR0C = 0b00000110;
UBRR0H = (uint8_t)0;
UBRR0L = (uint8_t)12;

while(1)
{

uart_putchar(0b01011010);
_delay_1s();

}
return 0;
}
-----------------------------------------------

質問者が選んだベストアンサー

ベストアンサー
2012/02/19 01:55
回答No.1

多分 UBRRnH と UBRRnL へのセッティング時期が問題だと思うよ。

お礼

2012/02/19 15:56

早速の回答大変ありがたいです。
セッティングの順番を変えるとうまくいきました。

質問者

このQ&Aは役に立ちましたか?

この質問は投稿から一年以上経過しています。
解決しない場合、新しい質問の投稿をおすすめします。

質問する

お礼をおくりました

さらに、この回答をベストアンサーに選びますか?

ベストアンサーを選ぶと質問が締切られます。
なおベストアンサーを選びなおすことはできません。