私はAVRプログラミングに不慣れです。Webでサンプルコードを見つけました。PCとの単純なUSART通信用。少し疑問があります。
メインループはこのように始まります。
void main(){
OSCCAL_calibration();
USARTinit();
//start communicating with PC
}
関数を使って発振器を校正する理由がわかりませんOSCCAL_calibration();
。
関数
OSCCAL_calibration()
働き
void OSCCAL_calibration(void){
unsigned char calibrate = 0;
int temp;
unsigned char tempL;
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1) | (1<<CLKPS0);
TIMSK2 = 0;
ASSR = (1<<AS2);
OCR2A = 200;
TIMSK0 = 0;
TCCR1B = (1<<CS10);
TCCR2A = (1<<CS20);
while((ASSR & 0x01) | (ASSR & 0x04));
for(int i = 0; i < 10; i++)
_delay_loop_2(30000);
while(!calibrate){
cli();
TIFR1 = 0xFF;
TIFR2 = 0xFF;
TCNT1H = 0;
TCNT1L = 0;
TCNT2 = 0;
while ( ! (TIFR2 && (1<<OCF2A)) );
TCCR1B = 0; // stop timer1
sei();
if ( (TIFR1 && (1<<TOV1)) ){
temp = 0xFFFF;
}else{
tempL = TCNT1L;
temp = TCNT1H;
temp = (temp << 8);
temp += tempL;
}
if (temp > 6250){
OSCCAL--;
} else if (temp < 6120){
OSCCAL++;
}else
calibrate = 1;
TCCR1B = (1<<CS10);
}
}
USARTinit()
働き
void USARTinit(){
CLKPR = (1<<CLKPCE);
CLKPR = (1<<CLKPS1);
UBRR0H = 0;
UBRR0L = 12;
UCSR0A = (1<<U2X0);
UCSR0B = (1<<RXEN0)|(1<<TXEN0)|(0<<RXCIE0)|(0<<UDRIE0);
UCSR0C = (0<<UMSEL00)|(0<<UPM00)|(0<<USBS0)|(3<<UCSZ00)|(0<<UCPOL0);
}
私はこれを使用Atmel Studio 6
してテストしましたatmega2560
(実際には、私のArduino Megaで)。少し変更を加えた後、私はそれを機能させることができました。ただし、キャリブレーション機能がなくても機能します。
私の質問を以下のように分類します。
- 発振器の校正として実際に何をしますか?
- それは必須ですか?
- PICマイクロコントローラーにも同様の機能がありますか?(私はPICプログラミングの経験が少しありますが、そのようなことは知りませんでした)
また、少し疑問がありました。
USARTinit()
ボーレートを設定する前に、クロックプリスカラーを機能に設定するのはなぜですか?プリスカラーなしでボーレートを設定することはできません(つまり、プリスカラー= 1)
電力を節約するためですか?しかし、pre-scalar = 1で試しましたが、機能していないようです(まだ試しています)。ええ、私はボーレートを適切に計算しました(データシートの与えられた方程式を使用して)。