楽天市場
[無料でホームページを作成] [通報・削除依頼]

番外 Arduinoからタイニーブートローダーを使用する

最近AE-ATMEGA基板を入手してArduinoをはじめました。

手持ちのATmega328Pにブートローダーを焼き、苦労しましたが何とかDuemilanoveのクローンを動作させることができました。


私は少ピンマイコンが好きなので、ATtinyでもArduinoが出来ないかと思い検索したところ、
ATtinyでは独立したブートROM領域を持たないため、もしATmegaのようにBootloaderをあらかじめ書き込んでから、
Arduinoのスケッチをアップロード出来たとしても、Arduinoのスケッチがリセットベクターを書き換えてしまうため、
二回目以降はBootloaderが起動できない問題があり、ArduinoからISP経由でATtinyに書き込む方法が主流のようです。
この方法は結線の手間が増えたり、リセットボタンを押し直す必要が増えたりとやや面倒な印象を受けました。


そこで思いつきました。「Arduino IDEからTiny Avr/Pic Bootloader+を起動させればいいんじゃね」
Tiny Avr/Pic Bootloader+のホストプログラムからスケッチを書き込めば、リセットベクターの問題は解決します。
それが可能ならATtinyでもブートローダーを使用することができるので、ATtinyでもATmegaのように操作できるはず。

ネットで調べてみると、そのものズバリではありませんが、かなり近いことをされているページを見つけました。
http://make.kosakalab.com/arduino/bootloader/bitbang_w_ide.html

このページの解説によりますと
1.Arduinoはavrdudeを起動してプログラムの書き込みを行う。
2.avrdude_wrapper を作成すれば、Arduinoから任意の書き込みプログラムが起動できるとのことでした。

いや、コマンドを丸投げするArduinoもそれをフックするwrapper_wrapper も実にいい仕事をしているではありませんか。非常にすばらしいアイデアなので、使用させていただくことにしました。ありがとうございます。



[準備]
1.http://make.kosakalab.com/arduino/use/arduino_dev.htmlからATmega/ATtiny記述ファイルアーカイブ hardware.zipをダウンロード。

2.解凍してできるhardwareフォルダーをC:\Documents and Settings\Administrator\My Documents\Arduinoフォルダーにコピー。

3.Arduino-IDE付属のavrdude.exeを移動
C:\Program Files\arduino\hardwear\tools\avr\bin\avrdude.exeを
C:\Program Files\arduino\hardwear\tools\avr\etcフォルダに移動。

4.下に記載のソース(avrdude.c)をコンパイル(ボーランドc++,v5.5を使用)してavrdude.exeを作成し、
C:\Program Files\arduino\hardwear\tools\avr\bin\フォルダにコピー。

5.Arduino IDEを起動してツール-マイコンボードでATtinyが増えていることを確認。

6.attinyboards.txtの変更(下記はattiny13-8の場合)

C:\Documents and Settings\Administrator\My Documents\Arduino\hardware\attiny\boards.txtの変更点

attiny13-8.name=ATtiny13 (internal 9.6 MHz clock)
attiny13-8.upload.protocol=arduino
attiny13-8.upload.speed=9600
attiny13-8.bootloader.low_fuses=0x7a
attiny13-8.bootloader.high_fuses=0xef
attiny13-8.upload.maximum_size=856 ←flash最後部84ワードをブートローダーで使用、1024-84*2=856バイト
attiny13-8.build.mcu=attiny13
attiny13-8.build.f_cpu=9600000L
attiny13-8.build.core=arduino
attiny13-8.build.variant=tiny8



[使用方法](attiny13Aの場合、他のATTINYも同様の操作)
①ATtiny13AにTiny Avr/Pic Bootloader+ブートローダーファームウエアを書き込む、
  ヒューズの設定はHigh=0xEF,Low=0x7A (CKDIV8=OFF,SELFPRGEN=ON,PORTB5=Reset Pin)
  OSCCALの値は事前に調べておき、ファームウエアソースを変更、再コンパイル。
 (前ページ「番外 ATTINY13A OSCCALの簡易校正」参照)

②ATtiny13Aの結線(VDD,VSS,TX,RX,RESET)
  Tiny_Avr-Pic_Bootloader+ (v0.8.3.1)に添付する bootloader_13A_84w_r4をそのまま使用する場合
     シリアルRXD(信号レベル/論理変換後) == ATtiny13A_softserial_TX=PORTB,4
     シリアルTXD(信号レベル/論理変換後) == ATtiny13A_softserial_RX=PORTB,3
     シリアルDTR(信号レベル/論理変換後) == ATtiny13A_RESET=PORTB,5 (0.1μFのコンデンサを介して接続)

③Arduino IDEを起動

④ツール-マイコンボードでATtiny13(internal 9.6MHz clock)を選択
img_20140420-144616.jpg

⑤ツール-シリアルポートで通信に使用するCOMポートを選択
img_20140420-144521.jpg

⑥ATtiny13用のスケッチをダウンロード (PORTB0を使用したLEDブリンキング)
img_20140420-144703.jpg

⑦ファイル-マイコンボードに書き込む
 ATtiny13AにリセットがかかりATtiny13Aに書き込んだブートローダーが起動する。
 HEXファイル転送時にTiny Avr/Pic Bootloader+ホストプログラムが自動的に起動する。
img_20140420-144840.jpg

⑧スケッチアップロード完了後、約1秒後にアプリケーションが自動起動する。




[avrdude.c ソースコード] (kosakalab.comさんオリジナルのソースを改変して使用しています。)

/* avrdude wrapper for windows
 Programed by Kimio Kosaka 2009.05.01

  License: GPL

*/

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

#define DEBUG (0)

//replace strings
int strrep(char *buf, char *mae, char *ato)
{
    char *mituke;
    size_t maelen, atolen;
        maelen = strlen(mae);
    atolen = strlen(ato);
    if (maelen == 0 || (mituke = strstr(buf, mae)) == NULL) return 0;
    memmove(mituke + atolen, mituke + maelen, strlen(buf) - (mituke + maelen - buf ) + 1);
    memcpy(mituke, ato, atolen);
    return 1;
}

void main(int argc, char *argv[]){
int i;
char cmd[512]="";
char buff[256]="";

#if DEBUG == 1
    printf("argc = %d\n", argc);
    for (i = 0; i < argc; i++) {
        printf("%d %s\n",i,argv[i]);
    }
#endif

    if(strstr(argv[4],"-pattiny")!=NULL){
        strcpy(cmd,"C:\\\"Program Files\"\\\"Tiny_Avr-Pic_Bootloader+ (v0.8.3.1)\"\\Tiny_Avr-Pic_Bootloader+.exe");
        strcat(cmd," \"");
        //"-Uflash:w:C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\build3004350469059206266.tmp\Blink.cpp.hex:i"
        strncpy(buff, argv[9]+10, strlen(argv[9])-12);
        strcat(cmd,buff);
        strcat(cmd,"\" ");
        //"-P\\.\COM1" 
        strncpy(buff, argv[6]+6, strlen(argv[6]));
        strcat(cmd,buff);
        strcat(cmd," ");
        //"-b9600" 
        strncpy(buff, argv[7]+2, strlen(argv[7]));
        strcat(cmd,buff);
    }
    else{
        strcpy(buff,argv[0]);
        strrep(buff,"bin","etc");
        strrep(buff,"Program Files","\"Program Files\"");
        strcpy(cmd,buff);
        for (i = 1; i < argc; i++) {
            strcat(cmd," \"");
            strcat(cmd,argv[i]);
            strcat(cmd,"\"");
        }
    }
        
#if DEBUG == 1
    printf("\n-- command --\n%s\n",cmd);
#endif

    system(cmd);
}

******************************************************************************


参考にさせていただいたページ (すばらいアイディアをどうもありがとうございました。重ねて御礼申し上げます。)

http://make.kosakalab.com/arduino/bootloader/bitbang_w_ide.html
http://make.kosakalab.com/arduino/use/arduino_dev.html




追記. Tiny Avr-Pic Bootloader+ のコマンドライン起動記述例
 
Tiny_Avr-Pic_Bootloader+.exe "c:\test file.hex" COM8 9600
Tiny_Avr-Pic_Bootloader+.exe "c:\test file.hex" com8
Tiny_Avr-Pic_Bootloader+.exe "c:\test file.hex"
Tiny_Avr-Pic_Bootloader+.exe "c:\test file.hex" auto































.