アフィリエイト広告を利用しています
Ad×Ad


Ad×Adは表示されるだけで報酬がもらえます。
以下から登録すると100ptもらえます。
 → アドアド -あなたの街の無料広告サイト-
検索
最新記事

広告

posted by fanblog

2017年12月17日

uartjob() について調べたこと(備忘録)

ソースコードは下記になります。

rollmodeだとrmbuf[]にADCH(ADCの上位8bit)を書き込む。
そうじゃないと、UDR0にtxbuf[]を書き込む。


void
uartjob()
{
   byte    sts;//sts は、status のことらしい

   sts = UCSR0A;//UCSRnA - USARTn制御/状態レジスタA (USART Control and Status Register n A)
   if ((char)sts < 0)  //UCSR0Aの第7bitが1、つまり受信バッファに未読データありということ
       rxbuf[rxn++] = UDR0;//UDRn - USARTnデータ レジスタ (USART I/O Data Register n)
                       //受信バッファにデータがあるのでrxbuf[]に取り込んだ
   // in case rxbuf[] overflow, no fatal situation happens.
   // because rxn is an 8 bit variable and rxbuf[] size is 256.

   if (rmon) {//rmonって何? rmってroll memoryのことらしい
              //rmonは、onがtrueの時に1としているみたい、falseなら0
              //ここは殆ど通らないところ?
       if (TIFR1 & 0x20)//TIFR1 - タイマ/カウンタ1割り込み要求フラグ レジスタ (Timer/Counter 1 Interrupt Flag Register)
                        //カウンタ1がTOP値になった
           TIFR1  = 0x27;  // clear timer1 flags; タイマ/カウンタ1割り込み要求フラグを全部クリアしている
       if (ADCSRA & 0x10) {//ADCSRA - A/D制御/状態レジスタA (ADC Control and Status Register A)
           if (rmon == 1) {
               ICR1  = 100 - 1;      // 50us
                   //ICR1は16bitレジスタ カウンタに設定する値
                   //0.5usを100倍すると50us
               ADMUX = 0x62;//ADMUX - A/D多重器選択レジスタ (ADC Multiplexer Select Register)
                   //0x62 基準電圧はAVCCでアナログ入力はADC2 PC2 下記のコメントと矛盾
               rmon = 2;
               rmbuf[rmw++] = ADCH;  // CH1(A1pin) value
                   //ADCの値は、8bit精度ならADCHを読むだけで事足りる(ADCLは読まない)
           }
           else if (rmon == 2) {
               ICR1  = 400 - 1;      // 200us
                   //0.5usを400倍すると200us
               ADMUX = 0x60;//0x60 基準電圧はAVCCでアナログ入力はADC0 PC0 下記のコメントと矛盾
               rmbuf[rmw++] = ADCH;  // CH2(A2pin) value
               rmon = 3;
           }
           else {
               ICR1  = 500 - 1;      // 250us
                    //0.5usを500倍すると250us
               ADMUX = 0x61;//0x61 基準電圧はAVCCでアナログ入力はADC1 PC1 下記のコメントと矛盾
               rmon = 1;
               osctvolt = ADCH;       // trigger level
           }
           ADCSRA = 0xb4;  // clear flags, 1MHz, adate on
               //ADCSRA - A/D制御/状態レジスタA (ADC Control and Status Register A)
               //システムクロック16分周
           return; //in order to release cpu quickly
       }
   }

   if (txr < txn && (sts & 0x20)) {
       UCSR0A = (sts & 0xe3) | 0x40;
       UDR0 = txbuf[txr++];//UDRn - USARTnデータ レジスタ (USART I/O Data Register n)
           //UDR0は送受信バッファ、バッファに送信データを書き込む
   }
}

この記事へのコメント
コメントを書く

お名前: 必須項目

メールアドレス: 必須項目


ホームページアドレス: 必須項目

コメント: 必須項目

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7098623
※ブログオーナーが承認したトラックバックのみ表示されます。

※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
×

この広告は30日以上新しい記事の更新がないブログに表示されております。