アフィリエイト広告を利用しています
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)を実行
*/

2021年01月30日

48行目〜98行目です。

kit-scope.ino 48行目〜98行目です。グローバル変数の定義をしています。


const byte cfg_cupgain = 0 ; // the usage definition of the pins D7..D12
// 0: input  1:input(pulled-up)  2:output

word oscversion = 0x0001 ;
word oscvbg ; // band gap voltage in 10bits  0 means a failure.
word oscconfig ; // bit0 -> if trigger voltage is 0:uncontrollable
//                               1:controllable
// bit1 -> optional-fgen is      0:not attached
//                               1:attached
// bit2 -> cupgain is            0:input
//                               1:output
byte oscspeed = 0 ; // 0..3:real 4..7:equiv 8:roll
byte oscinput = 0 ; // input signal selection  0:CH1 1:CH2 2:DUAL

byte osctrig = 0 ; // trigger bit012-> 000:CH1 001:CH2 010:EXT
//                  011:built-in-pulse
//                  100:optional-fgen
//         bit4  -> 0:rising 1:falling
//         bit5  -> 0:auto   1:normal
word osctdly = 100 ; // time of delayed trigger  100..30000 usec
byte osctvolt ; // trigger level voltage (measured by adc) 0..255
byte osctduty ; // trigger level duty  0..255

byte osccupgain = 0 ; // bit0  -> CH1 coupling        0:dc  1:ac
// bit1  -> CH2 coupling        0:dc  1:ac
// bit23 -> CH1 gain-selection  0,1,2,3
// bit45 -> CH2 gain-selection  0,1,2,3

long oscofreq = 1000 ; // 31 .. 2000000Hz
byte oscoduty = 50 ; // 0..100%

byte fgen ; // 0..3: fgen-dipsw  255:no-fgen


#define TXBSZ 1100
#define RXBSZ 256 //  this must be 256.
#define RMBSZ 256 //  this must be 256.  for rollmode

int txn , txr ;
byte txcrc , rxn ;
byte rmw , rmr , rmon ;

byte txbuf [ TXBSZ ] ;
byte rxbuf [ RXBSZ ] ;

2021年01月29日

冒頭のコメント文

下記は kit_scope.ino の1〜44行目です。


// Kyutech Arduino Scope Prototype  v0.73                     Apr 10, 2019
//
//    (C) 2012-2019 M.Kurata Kyushu Institute of Technology
//
//    for Arduinos with a 5V-16MHz ATmega328.
//
//    use with "kit_scope.pde", a Proce55ing GUI sketch.
//
//    You don't need to worry about this warning message produced by the IDE.
//    "Low memory available, stability problems may occur."
//    コンパイル時、下記メッセージが表示されますが、問題ありません。
//    "スケッチが使用できるメモリが少なくなっています。動作が不安定になる可能性があります。"
//
//
//    Pin usage
//    
//    A0  trigger level voltage input    (connected to D6)
//    A1  oscilloscope probe ch1
//    A2  oscilloscope probe ch2
//    A3  oscilloscope probe ext  trigger
//    A4  reserved
//    A5  reserved
//    A6  reserved
//    A7  reserved
//    
//    D0  uart-rx
//    D1  uart-tx
//    D2  reserved
//    D3  calibration pulse wave output
//    D4  reserved
//    D5  pwm output for generating trigger level voltage
//    D6  analog comparator input (trigger level)
//    D7  reserved
//    D8  reserved
//    D9  reserved
//    D10 reserved
//    D11 reserved
//    D12 reserved
//    D13 LED output
//
//    different usage for dks2014 board.
//    A4  fgen-sync
//    D8  CH1 mode input  0..[0-10V]  1..[-5..5V]  (pull-up needed)
//    D9  CH2 mode input  0..[0-10V]  1..[-5..5V]  (pull-up needed)



15行目以降の pin usage は当然ながら、UNO のピン名称となります。UNO のピン名称と MCU の ATmage328 のピン名称の対応関係は、
https://wiki.onakasuita.org/pukiwiki/?Arduino/%E3%83%94%E3%83%B3%E9%85%8D%E7%BD%AE
上記URLにあります。


タグ: kit-scope Arduino

2021年01月28日

Arduino UNO と ATmega328Pのピン配の対応関係、及びUNOピンの説明

kit-scopeのスケッチ内のソースコードを読むためには、Arduino UNO のピン配とATmega328(又は168)のピン配の対応関係を知る必要があります。

https://wiki.onakasuita.org/pukiwiki/?Arduino/%E3%83%94%E3%83%B3%E9%85%8D%E7%BD%AE

上記の説明がわかりやすのではないかと。ご参考までに。
また、UNOピンの説明もあらかじめ見ておくと参考になります。下記がわかりやすいと思いました。

https://dryossy.com/arduino/arduino-pin/

こちらもご参考までに。次はいよいよスケッチの解析か?
タグ: kit-scope Arduino
×

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

Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: