トップ «前の日記(2004年03月20日) 最新 次の日記(2004年03月25日)» 編集
2003|01|02|03|04|05|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|10|12|
2009|02|03|06|07|10|11|12|
2010|01|02|03|04|07|09|10|11|12|
2011|01|03|04|05|06|07|08|10|
2012|01|06|08|09|10|12|
2013|01|02|03|04|07|09|11|12|
2014|01|03|04|05|06|09|
2015|04|
2016|01|08|
ここは旧えびめもです。えびめも2に移行します(2016/12/1)

2004年03月22日

AVR

金曜日にdigi-keyに発注したAVRマイコンチップが今日(月曜日)にはもう届いた。アメリカからの輸入とは思えない、すげ〜早いんですけど。結局ATTiny12を試すことにした。

ハーフピッチのユニバーサル基板にラッピングワイヤで半田付けをしてさっそく定番のLED点滅プログラムを試す。両面スルホルな基板は楽だな。
秋月のAVRライターではATTiny12に対応していなかったので、
1.秋月のAVRライターで 最新ファームをAT90S1200 に焼き、
2.秋月のAVRライターに対してCMOS4066のアナログスイッチ部分を無効にする改造を施し
3.ATMEL純正AVR studio 3.6の AVRISPを立ち上げてATTinyにISPモードで書き込みを行う。
というなんとも面倒くさい方法で書き込んだ。
http://ww2.tiki.ne.jp/~maro/AVR/start/AVRstart.htmlこちらを参考にさせてもらいました。

それでもアーキテクチャ的にはPICより10倍は分かりやすいし、やっぱりISPはすばらしい。楽だ。

avr-gccもなかなかすごい。何がすごいってマイコン組込みなのにスタートアップもリンカースクリプトも意識しなくて済むのだ。チップが単純だから決まりきってるのだね。例えば

int main(void){
  unsigned char i;
  for(i=255;i>0;i--)
    ;
}
イキナリmain()から書き出してコンパイルすると
00000000 <.__start_of_init__>:
   0:   0c c0           rjmp    .+24            ; 0x1a
   2:   27 c0           rjmp    .+78            ; 0x52
   4:   26 c0           rjmp    .+76            ; 0x52
   6:   25 c0           rjmp    .+74            ; 0x52
   8:   24 c0           rjmp    .+72            ; 0x52
   a:   23 c0           rjmp    .+70            ; 0x52
   c:   22 c0           rjmp    .+68            ; 0x52
   e:   21 c0           rjmp    .+66            ; 0x52
  10:   20 c0           rjmp    .+64            ; 0x52
  12:   1f c0           rjmp    .+62            ; 0x52
  14:   1e c0           rjmp    .+60            ; 0x52
  16:   1d c0           rjmp    .+58            ; 0x52
  18:   1c c0           rjmp    .+56            ; 0x52
0000001a <_real_init_>:
  1a:   11 24           eor     r1, r1
  1c:   1f be           out     0x3f, r1        ; 63
  1e:   20 e0           ldi     r18, 0x00       ; 0
  20:   a8 95           wdr
  22:   21 bd           out     0x21, r18       ; 33
  24:   20 e0           ldi     r18, 0x00       ; 0
  26:   25 bf           out     0x35, r18       ; 53
  28:   e6 e6           ldi     r30, 0x66       ; 102
  2a:   f0 e0           ldi     r31, 0x00       ; 0
  2c:   a0 e6           ldi     r26, 0x60       ; 96
  2e:   b0 e0           ldi     r27, 0x00       ; 0
  30:   20 e0           ldi     r18, 0x00       ; 0
  32:   03 c0           rjmp    .+6             ; 0x3a
00000034 <.copy_data_loop>:
  34:   c8 95           lpm
  36:   31 96           adiw    r30, 0x01       ; 1
  38:   0d 92           st      X+, r0
0000003a <.copy_data_start>:
  3a:   a0 36           cpi     r26, 0x60       ; 96
  3c:   b2 07           cpc     r27, r18
  3e:   d1 f7           brne    .-12            ; 0x34
  40:   a0 e6           ldi     r26, 0x60       ; 96
  42:   b0 e0           ldi     r27, 0x00       ; 0
  44:   20 e0           ldi     r18, 0x00       ; 0
  46:   01 c0           rjmp    .+2             ; 0x4a
00000048 <.zero_bss_loop>:
  48:   1d 92           st      X+, r1
0000004a <.zero_bss_start>:
  4a:   a0 36           cpi     r26, 0x60       ; 96
  4c:   b2 07           cpc     r27, r18
  4e:   e1 f7           brne    .-8             ; 0x48
  50:   02 c0           rjmp    .+4             ; 0x56
00000052 <_vector_1>:
  52:   00 c0           rjmp    .+0             ; 0x54
00000054 <_unexpected_>:
  54:   18 95           reti
00000056 <main>:
  56:   cf e5           ldi     r28, 0x5F       ; 95
  58:   d2 e0           ldi     r29, 0x02       ; 2
  5a:   de bf           out     0x3e, r29       ; 62
  5c:   cd bf           out     0x3d, r28       ; 61
  5e:   8f ef           ldi     r24, 0xFF       ; 255
  60:   81 50           subi    r24, 0x01       ; 1
  62:   f1 f7           brne    .-4             ; 0x60
00000064 <__stop_progIi__>:
  64:   ff cf           rjmp    .-2             ; 0x64
スタートアップも自動的にリンクされてちゃんとmain()を実行できる形になりやがった。すげー感動。avrfreak.netがここまでしてくれたんなら
中学生でも開発できる
じゃんか。

gccはATTiny12をサポートしていないけど、if文などの条件分岐命令はgccにアセンブラを吐かせながら書いていけば覚えやすいし間違えないだろう。