3

私は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で)。少し変更を加えた後、私はそれを機能させることができました。ただし、キャリブレーション機能がなくても機能します。

私の質問を以下のように分類します。

  1. 発振器の校正として実際に何をしますか?
  2. それは必須ですか?
  3. PICマイクロコントローラーにも同様の機能がありますか?(私はPICプログラミングの経験が少しありますが、そのようなことは知りませんでした)

また、少し疑問がありました。

USARTinit()ボーレートを設定する前に、クロックプリスカラーを機能に設定するのはなぜですか?プリスカラーなしでボーレートを設定することはできません(つまり、プリスカラー= 1)

電力を節約するためですか?しかし、pre-scalar = 1で試しましたが、機能していないようです(まだ試しています)。ええ、私はボーレートを適切に計算しました(データシートの与えられた方程式を使用して)。

4

3 に答える 3

3

この特定のハードウェアについては何も知りませんが、簡単なGoogleがこのデータシートを表示しました

引用するには:

現在のAVRマイクロコントローラーの大部分は、内部RC発振器から実行する可能性を提供します。ほとんどのAVRの内部RC発振器周波数は、デバイスのデータシートで指定されている周波数の+/- 1%以内に校正できます。この機能は、外部発振器を使用する場合と比較して、優れた柔軟性と大幅なコスト削減を提供します。Atmelファクトリーで実行されるキャリブレーションは、固定の動作電圧と温度(25°C、通常は5V)で行われます。内部RC発振器の周波数は動作電圧と温度の両方の影響を受けるため、特定のアプリケーション環境に一致する2次校正を実行することが望ましい場合があります。この二次キャリブレーションは、標準キャリブレーションが提供するよりも高い精度を得るために実行できます。

于 2012-11-24T04:06:28.880 に答える
1

マイクロコントローラーの外部でタイミング関連の通信(シリアル、spiを制限までプッシュするなど)を行っている場合、または時間を維持している場合などは、より正確なクロックが必要です。

それは実際には電力についてではありません。わずかに、時計が少し遅い場合はより多くの電力を使用し、少し速い場合は少し電力を節約します。

すべてではありませんが、多くのマイクロコントローラーが内部R / C発振器を備えているため、外部発振器を用意する必要はありません(追加コンポーネント、追加コスト)。これは1つのファミリと別のファミリ(avr、msp430、picなど)ではありません。ファミリ内の一部のチップには内部発振器があり、一部にはありません。私が当時使用したPICは外部が必要でしたが、今日はその詳細について家族を知りません。キャリブレーションがどのように行われるかも、家族によって異なります。

于 2012-11-24T15:39:23.030 に答える
1

キャリブレーションの必要性は、実際のハードウェアによって異なります。

  1. マイクロコントローラーがXtalを使用してクロックを生成する場合は、何も調整する必要はありません。Xtalの発振周波数に応じて、適切な分周器のみを選択してください。

  2. RC発振器のみを使用する場合は、より重要な値の許容誤差を持つ可能性があるため、特に高いボーレート(19200以上など)を使用する場合は、周波数を校正することをお勧めします。

発振器周波数に応じて設定する必要のあるプリスケーラがあります。詳細については、データシートを参照してください。

于 2012-12-11T22:04:11.233 に答える