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


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

広告

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

2017年12月17日

sysdown(int dly) について調べたこと(備忘録)

ソースコードは下記の通り。

レジスターに値を代入し、D13のLEDを点滅させる内容。


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
       }
   }
}



2017年12月15日

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

ソースコードは下記の通り。


void
txinit(void)
{
   if (txn >= TXBSZ)      // TXBSZは1100のこと、ソースコードの冒頭に定義してありました!
       sysdown(200);      // tx buffer overflow has been detected.
   txn = 0;
   txr = TXBSZ;
}

header(byte typ, byte reqid)について調べた(備忘録)

ソースコードは下記の通り。ヘッダーのデータを作成しているらしい。

詳細は現時点では不明。
@Arduino_UNOに送るためのオシロスコープの設定を作っているらしい。
Atxbuf[]に書き込む回数と読みだす回数が一致していない理由が不明。


void
header(byte typ, byte reqid)
{
   static byte seq;//staticだから前の値を保持している

   txinit();
   uartjob();

   // prologue
   //序章?
   txput0(0xaa);//txbuf[]に書き込み
   txput0(0x55);//txbuf[]に書き込み
   txput0(0xa5);//txbuf[]に書き込み
   txput0(0x5a);//txbuf[]に書き込み

   uartjob();//ここまでtxbuf[]に4回書き込んだが、txbuf[]から読みだしたのはこの1回、

   txput1(typ);
   if (typ == 3)//3だとrollmodeなの?
       txput1(seq++);  // rollmode
   else
       txput1(reqid);
   txput1(oscspeed);
   txput1(oscinput);
   uartjob();//txbuf[]に書き込む回数と読みだす回数が一致しないのは?

   txput1(osctrig);
   txput1(osccupgain);
   txput1(osctdly >> 8);
   txput1(osctdly);
   uartjob();

   txput1(oscofreq >> 16);
   txput1(oscofreq >> 8);
   txput1(oscofreq);
   txput1(oscoduty);
   uartjob();
}

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

moderoll()は、kit_scope.ino 中の loop() の中にある関数です。

詳細はまだ不明。

@rmon==0の時(プログラム開始直後の時か?)
 各種レジスターに値を代入

Aheader(3, 0)を実行
 txput1(0)
 txput1(osctvolt)
 txputcrc(false)
 上記は何かしらデータを送信している

Btxgo()を実行 パケットを送信開始

Cfor文を実行 この中でおそらく初めにヘッダーデータを、次に波形データを送信しているらしい

Dtxputcrc(false)
 txfinish(true, true) を実行し、一連のデータ送信が完了ということらしい

ソースコードは下記の通り。


void
moderoll()
{
   byte    i;

   if (rmon == 0) {                         // start rollmode
       // reset and initialize timer1
       TCCR1B = 0x00;   // stop
       TCCR1A = 0x00;
       TIMSK1 = 0x00;   // no irq
       TCNT1  = 0x0000;
       ICR1   = 200;    // 100 usec
       TIFR1  = 0x27;   // clear flags;

       ACSR   = 0x94; // disable analog comparator
       ADCSRB = 0x00;
       ADCSRA = 0x84; // adc enable
       ADMUX  = 0x60; // adc target is A0 pin to get trigger value;
       ADCSRB = 0x07; // timer1 capture event;
       ADCSRA = 0xf4; // adc auto trigger, force start 1st conversion

       TCCR1B = 0x1a; // timer1 CTC-ICR1 mode pre1/8
       TCCR1A = 0x00; //             CTC mode;

       // wait until the 1st conversion finishes.
       while((ADCSRA & 0x10) == 0x00)
           uartjob();
       osctvolt = ADCH;  // trigger level

       ADMUX  = 0x61;
       ADCSRA = 0xb4;   // clear flag, 1MHz, adate on

       rminit(true);
   }

   header(3, 0);

   txput1(0);
   txput1(osctvolt);
   txputcrc(false);

   txgo(); // start to trasmit a packet

   for(i = 0; i < 200; i++) {
       while(rmw == rmr)
           uartjob();
       txput1(rmbuf[rmr++]);
   }
   txputcrc(false);

   txfinish(true, true);
}




kit_scope.ino について調べたこと(備忘録)

kit_scope.inoは、Arduino開発環境のソースコードです。v0.72 Mar 20, 2016版を使用しています。

ATmega328Pのデータシートは支障がない限り、下記(日本語)を参照します。
https://avr.jp/user/DS/PDF/mega328P.pdf

Arduino開発環境については支障がない限り、下記(日本語)を参照します。
http://www.musashinodenpa.com/arduino/ref/

この部分で行っているのは、入力信号のAD変換とUARTでPCへの送信、UARTでPCからのコマンドの受信となります。

Arduino のソースコードの形式はC言語に従いますが、setup()に初期設定を書き、loop()に通常処理を書きます。setup()は文字通り1回だけ実行されます。loop()も文字通りで、これは無限ループになります。setup()とloop()を置く順番は、特に無いようです。大文字で記載されている変数は、CPU(AtMega)のレジスターとなります。レジスターはAtMegaの仕様書に記載されている名称そのままで、変数宣言しないで使用します。cli()の関数もArdino環境固有のもので、全ての割り込みを禁止にする関数です。

オシロスコーププログラムについて調べたこと(備忘録)

九州工業大学情報工学部においてあるオシロスコーププログラムについて調べたことを書いていきます。
Kyutech Arduino Scope
http://www.iizuka.kyutech.ac.jp/faculty/physicalcomputing/pc_kitscope/

オシロスコープ(Kyutech Arduino Scope)のハードウエアはArduino UNOで、ソースコードはArduino環境で作成されているプログラムです。オシロスコープの表示部は、PC側となります。こちらはProcessingで作成されています。

Arduino UNOに、ブレッドボードで簡単な回路を追加するだけで、オシロスコープになるところがとても素晴らしい作品です。

×

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