avr-libc  2.0.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

Example Projects

マクロ
<util/setbaud.h>: 通信レート計算補助マクロ

マクロ

#define BAUD_TOL   2
 
#define UBRR_VALUE
 
#define UBRRL_VALUE
 
#define UBRRH_VALUE
 
#define USE_2X   0
 

説明詳細

#define F_CPU 11059200
#define BAUD 38400
#include <util/setbaud.h>

このヘッダファイルは、F_CPUとBAUDが定義済みで値が入っていることを必要とします。その上、BOAD_TOLマクロは、計算において許容できるボーレートの許容誤差を(パーセントで)定めます。BAUD_TOLの値は、標準で2%です。

このヘッダファイルは、AVRのUARTボーレートのプリスケーラレジスタ用のマクロを定義します。全ての計算は、Cプリプロセッサを使用しています。このヘッダファイルを読み込むことは、他のいかなる副作用も引き起こさないため、(たぶん、BOADパラメータの値が異なっていても)複数回このファイルを読み込むことができ、同じ関数内においても使用可能です。

要求されたBAUDが与えられたF_CPUで有効と仮定すると、UBRR_VALUEマクロは必要なプリスケーラの値をセットします。さらに2つのマクロは、プリスケーラの下位と上位バイトに対してそれぞれ用意されており、UBRRL_VALUEはUBRR_VALUEの下位バイトに設定され、UBRRH_VALUEは上位バイトに設定されます。さらに、USE_2Xマクロを設定できます。もし、指定された許容誤差内において、希望するBAUDレートが、UART設定においてU2Xビットを設定することで提供できるならば、この値が1に設定されます。U2Xが必要ないならば、その値は0と定義されます。

使用例:

#include <avr/io.h>
#define F_CPU 4000000
static void
uart_9600(void)
{
#define BAUD 9600
#include <util/setbaud.h>
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
}
static void
uart_38400(void)
{
#undef BAUD // avoid compiler warning
#define BAUD 38400
#include <util/setbaud.h>
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif
}

この例では、それぞれ9600ボーと38400ボーで動くUARTを設定した2つの関数を定義しています。4MHzのCPUクロックを使うと、9600ボーは、U2Xの設定を使わずに許容誤差を満足に達成(プリスケーラ25)でき、一方で38400ボーはU2Xを設定することを必要(プリスケーラ12)とします。

マクロ定義説明

#define BAUD_TOL   2

<util/setbaud.h>のための入出力マクロ

ボーレート許容誤差をパーセントで定義。設定されてなければ、標準値の2に設定されます。

#define UBRR_VALUE

<util/setbaud.h>からの出力マクロ

UBRRレジスタ用の計算されたボーレートのプリスケーラー値の値になります。

#define UBRRH_VALUE

<util/setbaud.h>からの出力マクロ

計算されたプリスケーラ値(UBRR_VALUE)の上位バイトの値になります。

#define UBRRL_VALUE

<util/setbaud.h>からの出力マクロ

計算されたプリスケーラ値(UBRR_VALUE)の下位バイトの値になります。

#define USE_2X   0

<util/setbaud.h>からの出力マクロ

UART設定においてU2Xビットを設定することで希望するボーレート許容誤差を実現できるなら、値が1になります。そうでなければ0になります。