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


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

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

2021年02月03日

word oscadc10(byte mux)


word
oscadc10(byte mux)
{
   word    val, tmp;
   int     i, j;

   // reset and initialize timer1
   TCCR1B = 0x00;
   TCCR1A = 0x00;
   TIMSK1 = 0x00; // no irq
   ICR1   = 0x0000;
   TCNT1  = 0x0000;
   TIFR1  = 0x27; // clear flags;

   ACSR   = 0x90; // disable analog comparator
   ADCSRB = 0x00;
   ADCSRA = 0x97; // adc enable  pre=1/128.  i.e. adc clock = 12.5khz
   ADMUX  = 0x40 | (mux & 0xf);

   // when bandgap reference is selected as a source,
   // a certain interval is needed for the stabilization
   // of the bandgap voltage.
   tmp = 0;
   i = 0;
   for(j = 5000; j > 0; j--) {
       ADCSRA = 0xd7; // adc start
       while((ADCSRA & 0x10) == 0x00)
           uartjob();
       val = (word)ADCL;
       val |= ((word)ADCH << 8);
       if (tmp != val) {
           tmp = val;
           i = 0;
           continue;
       }
       // if the same value continued 5 times, regard it as
       // the stabilized result
       if (++i >= 5)
           return  val;
   }
   return  0xffff;  // didn't stabilize
}

/*
  // reset and initialize timer1
  TCCR1B = 0x00; リセット時の値
  TCCR1A = 0x00; リセット時の値
  TIMSK1 = 0x00; // no irq カウンタ1関係の割り込み禁止 リセット時の値
  ICR1 = 0x0000; カウンタ1の捕獲レジスタ? 16ビットレジスタ リセット時の値
  TCNT1 = 0x0000; カウンタ1値 16ビットレジスタ リセット時の値
  TIFR1 = 0x27; // clear flags; リセット時の値は0x00だが、0x27を書くとカウンタ1の全フラグクリア

  ACSR = 0x90; // disable analog comparator リセット時の値は0x00だが、0x90。0x80でもよさそうだ
 が。アナログ比較器動作停止、ACIに1を書くことでアナログ比較器割り込み要求フラグを解除する。
  ADCSRB = 0x00; リセット時の値
  ADCSRA = 0x97; // adc enable pre=1/128. i.e. adc clock = 12.5khz A/D変換器動作許可、クロック128分
 周
  ADMUX = 0x40 | (mux & 0xf); (mux & 0xf) は上位4ビットをマスクし、A/D変換機の入力選択。
  0x40はA/D変換機の基準電圧をAVCCとする設定
  以上ここまでは、カウンタ1とA/D変換機を設定している。

  コメント文に、A/D変換機の入力にbandgap(AREFのこと?)が選択されたら、それが安定するまである
 程度のインターバルが必要とある。
  



*/

void oscinit(void)


void
oscinit()
{
   word    val0, val1;

   if ((oscvbg = oscadc10(0xe)) == 0xffff) // bandgap voltage
       oscvbg = 0;

   cupgain_init(osccupgain);
   if (cfg_cupgain == 2)
       oscconfig |= 4;

   initt0();  // start trigger level generator

   // test if the trigger level generator circuit is equipped.
   sett0(192);
   wait0(4500, false);  // wai 72ms
   val1 = oscadc10(0);
   sett0( 64);
   wait0(4500, false);  // wai 72ms
   val0 = oscadc10(0);
   if ((val1 | val0) != 0xffff) {
       if (abs(val0 - 0x100) < 0x10 && abs(val1 - 0x300) < 0x10)
           oscconfig |= 1;  // yes, it worked properly.
   }
   osctduty = 0x80;
   sett0(osctduty);

   sett2(oscofreq, oscoduty);

}


/*
  word は符号なし16ビットの数
  oscadc10(0xe)) はまだ調べていません。



  
*/

void rminit(boolean on)


void
rminit(boolean on)
{
   rmw = rmr = 0;
   rmon = (on) ? 1 : 0;
}

/*
  rmw, rmr, rmon って何の略なのでしょうか?
  on が true なら 1 を、false なら 0 を rmon に代入する。 
*/

rxinit(void)


void rxinit(void)
{
   rxn = 0;
}


/*
  グローバル宣言している変数 rxn に 0 を代入
*/

sysdown(int dly)


void
sysdown(int dly)  // dly .. in msec
{
   int    i;
   byte   s;

   SPCR   = 0x00; // disable SPI
   TCCR0B = 0x00; // stop timer0
   TCCR0A = 0x02; // ctc mode
   TIMSK0 = 0x00; // Disable all timer0 irqs
   TIFR0  = 0x07; // clear flags
   TCNT0  = 0x00;
   OCR0A  = 250 - 1;
   TCCR0B = 0x03; // start timer0  pre = 1/64  i.e 250kHz

   s = 0;
   while(true) {
       if (++s & 1)
           PORTB |= 0x20;  // D13 == HIGH  (LED on)
       else
           PORTB &= 0xdf;  // D13 == LOW   (LED off)
       for(i = 0; i < dly; i++) {
           while((TIFR0 & 2) == 0)
               ;
           TIFR0  = 0x07; // clear flags
       }
   }
}

/*
  関数名からすると、システムダウンした場合の後始末をする関数らしい。
  例として、txinit(void)内にて送信バッファが最大サイズTXBSZ以上になるとsysdown(200)が実行される。
  ここでのカウンタ0の目的は何だろう?

  SPCR = 0x00; // disable SPI リセット直後と同じ値
  TCCR0B = 0x00; // stop timer0 リセット直後と同じ値
  TCCR0A = 0x02; // ctc mode  ctc (clear timer on compare match) リセット直後は0x00
  ctc動作とは、カウンタ値=比較器に設定した値 で、割込みフラグ立てカウンタ値を0にセット
  PWM動作させるためには 0x42 or 0x82 or 0xc2 だと思うが、0x02だとOC0A出力ではなくて標準ポート。

  TIMSK0 = 0x00; // Disable all timer0 irqs 割り込み許可のリセット リセット直後と同じ値
  TIFR0 = 0x07; // clear flags 各ビットに対応する割り込み要求フラグの解除 リセット直後は0x00
  TCNT0 = 0x00; カウンタの初期値 リセット直後と同じ値
  OCR0A = 250 - 1;  比較器0Aに値をセット
  TCCR0B = 0x03; // start timer0 pre = 1/64 64分周を設定 i.e 250kHz 16MHz÷64=250kHz
  ということはカウンタ0は250kHzのクロックを249個まで数える?
  とすると1msec間隔でctc動作している。

  最初のwhileですが、while(true) で無限ループになっています。どうやって抜けるのでしょう?
  でも、システムダウンしているなら抜ける必要もないのかもしれません。
  sが奇数の時はLED on、偶数の時LED off、それから2番目のwhile文ですが、dlyで設定した時間だけLED
 の状態を維持させています。つまり、LEDの点滅間隔でどの関数が呼んだsysdown(dly)かを区別させてる?
  ここでのカウンタ0の使い方がよくわからないですね。もしわかったら追記修正します。
*/

2021年02月01日

txinit()

162行〜169行です。

void
txinit(void)
{
   if (txn >= TXBSZ)
       sysdown(200);      // tx buffer overflow has been detected.
   txn = 0;
   txr = TXBSZ;
}

/*
  関数名から、送信初期化ということらしい。
  TXBSZ は 1100 と定義済み。TXBSZ は送信バッファサイズかな。
  txn が TXBSZ 以上だと sysdown(200) を実行する。
  txn に 0、txr に TXBSZ を代入。これが初期化ということらしい。
*/
タグ:kit-scope Arduino

setup()

1231行目〜1234行目です。

void
setup()
{
   cli();

/* cli() について調べたのですが、Arduino IDEのリファレンスにはありませんでした。
  ATmega328のデータシート https://wiki.onakasuita.org/pukiwiki/?Arduino/%E3%83%94%E3%83%B3%E9%85%8D%E7%BD%AE
  によると、アセンブラでCLI命令があり、割り込み禁止ということがわかりました。おそらくArduino IDE
  のライブラリのどこかに定義してあるのでしょう。
*/
1236行目〜1245行目です。

   DDRB  |= 0x20;   // output  D13
   PORTB &= 0xdf;   // D13 = LOW
   DDRD  |= 0x2c;   // output  D2, D3, D5
   PORTD |= 0x04;   // D2 == HIGH  disconnect the funcgen

   UCSR0A = 0x02;   // uart async 230400bps 8bit non-parity 1 stopbit
   UBRR0H = 0x00;
   UBRR0L = 0x08;   
   UCSR0C = 0x06;
   UCSR0B = 0x18;

/*  DDRB、PORTB、DDRD、PORTD、UCSR0A、UBRR0H、UBRR0L、UCSR0C、UCSR0Bは、
  ATmega328のレジスタです。大文字の変数はレジスタということでしょうか。これもおそらくArduino
  IDEのライブラリのどこかに定義してあるのでしょう。
  UCSR0A、UBRR0H、UBRR0L、UCSR0C、UCSR0Bは、USB通信の初期設定をします。
  UCSR0A=0x02は、日本語データシートP138より、U2X=1のこと。日本語データシートP125 図24-2
 によると2分周期を通らない設定。
  UBRR0H = 0x00は、UBRR0の上位4ビット。
  UBRR0L = 0x08は、UBRR0の下位4ビットで、ボーレート分周器の分周値を8に設定
  以上のことから、ボーレイト=fOSC/(UBRR0+1)/2/4=16000000/(8+1)/2/4=222.2(kbps)になる。
  誤差3.5%で230.4kbpsのことだよね?。日本語データシートP136にfOSC=16MHzのときの設定値があり
 ました。 
  
  UCSR0C = 0x06は、非同期、パリティ無し、停止ビット1、UCSR0BのUCSZ2とでデータ長8ビット
  UCSR0B = 0x18は、受信許可、送信許可を設定
*/
1247行〜1251行です。

   txinit();
   rxinit();
   rminit(false);

   oscinit();

/*
  txinit()、rxinit()、rminit(false)、oscinit()を順次実行
*/

   // when the function generator seems not to be attached,
   // check again up to 2 more times.
   if (gen_cmd(0, 0) || gen_cmd(0, 0) || gen_cmd(0, 0))
       oscconfig |= 2;  // fgen is connected
   oscinfo(true, 0);
}

1253行〜1258行です。
/*
  gen_cmd(0,0)の戻りがtrueの時、oscconfig |= 2; // fgen is connected
  oscinfo(true, 0)を実行
*/
×

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