2012年9月7日金曜日

[AVR]AVRを始める(2) - USART通信

少し間が開いて、AVRについて。

I/Oボードという事で、AVRとPC間で通信をさせたいです。
STK600にはUSBポートとRS-232Cが載っていますので、どちらかを使えばPCとの通信のテストが出来ると思っていました。
以下のコードでひたすらデータを吐き出し続けさせ、PCで観測させようと考えましたが全くできないので、諦めました...
STK600での方法をご存知の方が居られたら、是非ご教示下さい。


#define F_CPU 1000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR ((F_CPU/16/BAUD)-1) //Asynchronous Normal mode

#include <avr/io.h>
#include <util/delay.h>

int main(void){
  unsigned char data = 0x01;
 
  UBRR0H = (unsigned char)(MYUBRR >> 8);
  UBRR0L = (unsigned char)MYUBRR;
  
  UCSR0B = (1 << RXEN0)|(1 << TXEN0);
  /* Stop bit:1, Parity: None, Data bits:8*/
  UCSR0C = (1 << UCSZ01)|(1 << UCSZ00);
 
  while(1){
    while(!(UCSR0A & (1 << UDRE0))){}
    //put data into buffer, send the data
    UDR0 = data;
    delay_ms(50);
    data = data + 0x01;
  }
}

仕方が無いので、一緒に買ったATMEGA328Pを使ってテストを行います。
STK600からISPのピンを引っ張ってフレッドボード上に組んだチップにプログラムします。
Atmel Studio上からプログラムする方法が判らなかった為、Avrdudeを用いて書き込みました。

AVRからRS-232Cを用いて通信する為のトランシーバにSP3232ECPを使います。
回路図は以下の通り。ISPを用いる事で、チップが基盤に実装されていてもプログラムする事が出来ます。(今回はピンの重複がないので、実際どうなるか分かりませんが...)
今回は電源は、ISPのピンから頂いています。
トランシーバIC周りのキャパシタや接地は省略しています。

上記のコードをプログラムし、PCのシリアルポートと通信させ受信を確認しました。

今日はここまで。
次は、送信とUSB変換について...

久しぶりにスパゲティコード

#回路図の作成にはBSch3を利用させて頂きました。

2012年8月30日木曜日

[AVR]AVRを始める(1)

センサーのデータを取得する為に、I/OボードをAVRで作る事にしました。
PICよりAVRの方が、研究室の中で人気らしいです。

まず、AVRを始めるにあたって評価ボードのAtmel社 STK600を使用することにしました。

チップはひとまず、STK600に付いてきたATMEGA2560を用いることにし、開発環境はAtmel Studio 6を使用します。
Atmel StudioはVisual Studioなんですね。

プロジェクトのプロパティでProgrammer(Tool)はSTK600を、DeviceはATmega2560に設定します。

STK600には、USBポートが載っているので簡単にライトできます。シリアルポート無くても良いんですね!

また、LED・タクトスイッチが8個載ってるので、入門用のプログラムを書いてみます。

まず、Hello World的に、LEDの点滅をさせます。PortBピンにLEDを接続しています。

#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
  unsigned char a = 0b00000001;

  DDRB = 0xFF;
  PORTB = 0xFF;

  while(1){
    PORTB = ~a;
    _delay_ms(500);
    PORTB = 0xFF;
    _delay_ms(500);

    if(a != 0b10000000){
      a = a << 1;
    }else{
      a = 0x00000001;
    }
  }
}

次に、タクトスイッチを押下した時対応したLEDを点灯させます。
PortAピンにタクトスイッチを、PortBにLEDを接続します。

#include <avr/io.h>
int main(void)
{
  unsigned char a;
  unsigned char x;
  
  
  DDRB = 0xFF;
  PORTA = 0xFF;
  PORTB = 0xFF;
  
  while(1){
    x = PINA;
    a = 0xFF & x;
    PORTB = a;
  }  
}


無事、LEDの点滅・点灯ができました。
今日はここまで。

Syntax Highlighterが使えない...

2012年6月26日火曜日

[Linux]環境作り

macにOpenSUSEをVirtualBoxでインストール。インストール構成はいつも通りで、テキストベースの最小構成

入れたもの
・Java JDK x64
・Apache commons Tomcat
└Autoconf
└gcc
└make

2012年6月14日木曜日

[Vim]複数行のカット, コピー

2ヶ月のインターンシップが終わってから放置してました
留学生と別れて、卒研出して卒業式に院の入学式...早いですね!


ところで、ちなみに僕は実はemacsより、viが好きです

1. ms カット又はコピー(ヤンク)する開始行をマーク
2. d's でカット. d'y でコピー(ヤンク)
3. p でペースト

知らなかったです。
好き嫌いと言うより、emacsは保存の仕方すら、わかりません。

2012年2月23日木曜日

[Java]月毎の日を得る

何月は何日まであるのかを得たい
絶対スマートな方法があるのに・・・
Calendarとかは使わずに


private int getDay(int year, int month){
  switch(month){
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
      return 31;
    case 4:
    case 6:
    case 9:
    case 11:
      return 30;
    case 2:
      if(checkLeapYear(year))
        return 29;
      else
        return 28;
    default:
      return -1;
  }
}

private boolean checkLeapYear(int year){
  if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
    return true;
  else
    return false;
}


二四むく侍。。

2012年2月20日月曜日

[VBA]新しくXLSファイルを作成/出力を行う


新しくファイルを作成し、内容をコピーする必要があったので。


Sub outDataFile(ByVal fileName As String, ByVal range As Integer)
  Dim row As Integer
  Dim inWks, outWks As Object
  
  Set inWks = ActiveWorkbook
  Set outWks = CreateObject("Excel.Sheet")
  
  For shIdx = 1 To inWks.Worksheets.count
    If shIdx <> 1 Then outWks.Worksheets.Add after:=outWks.Worksheets(shIdx - 1)
    outWks.Worksheets(shIdx).Name = inWks.Worksheets(shIdx).Name
    
    row = 1
    Do
      For col = 1 To range
        outWks.Worksheets(shIdx).Cells(row, col) = inWks.Worksheets(shIdx).Cells(row, col)
      Next col
      
      row = row + 1
    Loop While inWks.Worksheets(shIdx).Cells(row, 1) <> ""
  Next shIdx
  
  outWks.SaveAs fileName
End Sub


ちょっとベンチマークとります

2012年2月14日火曜日

[VBA]文字列<-->数値

Cstr(Integer) : String

Cint(String) : Integer

はい。
バレンタインデー