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


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

広告

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

2016年06月19日

次からは実践レポートの予定です

今日は秋月に行ってきました。デバッグ作業に備えたいと思い小物部品を少し買いました。本業が忙しいので、2週間くらいは休載します。

実践! ターゲットのソースにデバッグ関数を埋め込んでみたがRAM不足でコンパイルエラーとなった

実際にターゲットのソースファイルにデバッグ関数を埋め込んでみました。残念ながらRAM不足になりコンパイルできませんでした。デバッグ関数の呼び出し箇所をうんと減らす必要がありますね。残念。

コンパイル.jpg

Arduino:1.6.10 Hourly Build 2016/05/31 11:33 (Windows 10), ボード:"Arduino/Genuino Uno"

最大32,256バイトのフラッシュメモリのうち、スケッチが8,390バイト(26%)を使っています。
最大2,048バイトのRAMのうち、グローバル変数が2,473バイト(120%)を使っていて、ローカル変数で-425バイト使うことができます。
processing.app.debug.RunnerException: スケッチが使用するメモリが足りません。メモリを節約する方法については、以下のURLのページを参照してください。http://www.arduino.cc/en/Guide/Troubleshooting#size
at cc.arduino.Compiler.size(Compiler.java:319)
at cc.arduino.Compiler.build(Compiler.java:156)
at processing.app.Sketch.build(Sketch.java:1111)
at processing.app.Sketch.build(Sketch.java:1081)
at processing.app.Editor$BuildHandler.run(Editor.java:1988)
at java.lang.Thread.run(Thread.java:745)
スケッチが使用するメモリが足りません。メモリを節約する方法については、以下のURLのページを参照してください。http://www.arduino.cc/en/Guide/Troubleshooting#size

「ファイル」メニューの「環境設定」から
「より詳細な情報を表示する:コンパイル」を有効にすると
より詳しい情報が表示されます。

自動埋め込みツール公開

EXCEL 2007 VBAで、デバッグ用の関数をソースファイル(inoファイル)に埋め込むツールを作りましたので公開します。(EXCELでVBAを開き、UserFormに他のコントロールを配置して各イベントにコピペしてください。)

但し欠点が2つあります。
1.改行コードがLF→CRLFになる。→TeraPadで改行コードをCRLF→LF変更できます。
2.日本語が化けます。日本語の処理は、Arduino IDE上でやりましょう。
上記欠点を分かった上でお試しください。

ツールの本体は、UserFormに書きました。<選択>を押すとファイル選択のダイアログが開くのでinoファイルを選んでください。ファイルを開いたら、<挿入する>を押してください。そうすると保存するファイル名を聞かれるので適当な名前をつけてください。

debugPrint, debugRegPrint, breakPointの3つの関数呼び出しを、ターゲットのソースコードの関数定義の先頭行にコメント文として追加します。コメント文とした理由はターゲットのRAMに余裕がないかもしれないので、適宜コメントを外す方が実践的かなあと思ったからです。またdebugPrintは関数名を表示させるものなので引数の文字列に関数名を自動的に入れるようにしました。

デザイン
userForm

以下、ソースコードです。
debugPrintに渡す関数名は以下のように探すことにしました。
C言語の関数名は、'{' の前か前行にあります。ですがここでは'}'のある行かその前行だと決め打ちして作っています。ですのでうまくヒットしない場合もあります。また配列やif文、while文、for文、switch文は関数名ではないので除外します。まだ除外し忘れているものがあるかもしれません。


Option Explicit

Private Sub btnDeleteBreakPoint_Click()

End Sub

Private Sub btnGetFilePath_Click()
'参照ボタンがクリックされた

   Dim fType, prompt As String
   Dim fPath As Variant
   Dim ws As Worksheet
   Set ws = Worksheets("Sheet1")

   'ダイアログのタイトルを指定
   prompt = "inoファイルを選択して下さい"
   'ファイル参照ダイアログの表示
   fPath = Application.GetOpenFilename(fType, , prompt)

   If fPath = False Then
   'ダイアログでキャンセルボタンが押された場合は処理を終了します
       End
   End If

   'TextBox1にファイル名をセット
   TextBox1.Text = fPath

End Sub

Private Sub btnAddDebugPoint_Click()
'debugPrint(), debugRegPrint(),breakPoint()を追加する
   'ファイルを開く
   Dim strBuf As String
   Dim strArray() As String
   Dim pos As Integer
   Dim i As Long
   
   
   Open TextBox1.Text For Input As #1
   Line Input #1, strBuf
   
   'strBuf末尾にCRが含まれているかどうか判定
   pos = 1
   pos = InStr(pos, strBuf, vbLf)
   
   If pos = 0 Then
   '改行コードがCRLFの場合(切り出したstringには改行コードは含まれない為)
       ReDim Preserve strArray(0)      '既に1行読み込んでいる為
       strArray(0) = strBuf
       i = 1
       Do Until EOF(1)
           Line Input #1, strBuf       ' ファイルから一行読み込み
           ReDim Preserve strArray(i)  ' 配列長を変更
           strArray(i) = strBuf        ' 配列の最終要素に読み込んだ値を代入
           i = i + 1                   ' 配列の要素数を加算
       Loop
   Else
   '改行コードがLFの場合(VBAはLFを改行と見做さないのでinoファイル全体が1つの文字列になる)
       Dim tmp As Variant              'LFコードでsplitして格納
       tmp = Split(strBuf, vbLf)       'strBufをLFコードで区切りtmpに格納

       ReDim Preserve strArray(UBound(tmp))
       i = 0
       For i = 0 To UBound(tmp)
           strArray(i) = tmp(i)
       Next i
   End If
   
   Close #1
   
   
   Dim j As Long
   Dim funcName As String
  
   'strArray()の解析(関数名を取り出してdebugPrint文を追加)
   For i = 0 To 20000
       ''{'を含む行を見つける
       pos = InStr(1, strArray(i), "{")
       If pos = 0 Then
           '何もしない
       ElseIf pos >= 1 Then
           funcName = ""
           If checkString(strArray, i, funcName) = True Then
               '関数名の個所なのでdebugXXX()を挿入する
               '次の行からdebugXXX文を3行追加し、新strArray配列を作る
               ReDim Preserve strArray(UBound(strArray) + 3)    '配列要素を+3する
               For j = UBound(strArray) To i + 3 Step -1
                   strArray(j) = strArray(j - 3)
               Next j
               strArray(i + 1) = "/***********/    //debugPrint(""" & funcName & """);"
               strArray(i + 2) = "/*  DEBUG  */    //debugRegPrint(""*"",);"
               strArray(i + 3) = "/***********/    //breakPoint();"
               i = i + 4
           Else
               '関数名の個所ではなかったので何もしない
           End If
       End If
       If i = UBound(strArray) Then
           Exit For
       End If
   Next i
   
   '新しくファイルを作成する
   Open Application.GetSaveAsFilename(TextBox1.Text) For Output As #1
   For i = 0 To UBound(strArray)
       Print #1, strArray(i)
   Next i
   Close #1

End Sub

Private Function checkString(strArray() As String, strPointer As Long, funcName As String) As Boolean
   '関数名の個所かどうか判定する 関数名ならTrueを返す
   Dim pos As Integer
   Dim nameFlag As Boolean
   nameFlag = True
   
   pos = InStr(1, LTrim(strArray(strPointer)), "{")
   If pos = 1 Then
       Call getName(Trim(strArray(strPointer - 1)), funcName, nameFlag)
   ElseIf pos > 1 Then
       Call getName(Trim(strArray(strPointer)), funcName, nameFlag)
   End If
   
   checkString = nameFlag
  
End Function

Private Sub getName(funcString As String, funcName As String, nameFlag As Boolean)

   If InStr(1, funcString, "=") = 0 And InStr(1, funcString, "(") > 2 And InStr(1, funcString, "if") = 0 _
       And InStr(1, funcString, "switch") = 0 And InStr(1, funcString, "while") = 0 _
       And InStr(1, funcString, "for ") = 0 And InStr(1, funcString, "for(") = 0 Then

       '関数名である
       Dim tmp As Variant
       If InStr(1, funcString, "//") > 0 Then
           tmp = Split(funcString, "//")
           funcString = Trim(tmp(0))
       End If
       
       If InStr(1, funcString, "{") = 0 Then
           funcName = funcString
       Else
           tmp = Split(funcString, "{")
           funcName = Trim(tmp(0))
       End If
       
       nameFlag = True
   Else
       '配列名である(または関数の引数だけの行もかな?)
       nameFlag = False
   End If
   
End Sub

Private Sub btnDeleteDebugPoint_Click()
'debugPrint(), debugRegPrint(),breakPoint()を削除する


End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub UserForm_Click()
'    UserForm1.Show (vbModeless)
End Sub




VBAから上記を直接実行させてもよいのですが、シートを開いたときにすぐに実行できるように、ボタンにUserFormをオープンするプロシージャを書いただけです。下記はお好みで決めてください。

デザイン
ボタン


Sub Macro1()
'
' Macro1 Macro
' Arduino IDEのソースコードにデバッグ用のコードを挿入するマクロ。
'
'

   UserForm1.Show (vbModeless)


End Sub

2016年06月15日

I2C経由でデバッグするための自動コード埋め込みツール

デバッグするための自動コード埋め込みツールを、EXCELのVBAで作りました。

でも欠点が2つあります。

1.Arduino IDEで作成したinoファイルの改行コードはLFなのに、VBAで読み込み書き込みをすると改行コードはCR+LFになってしまうことです。対応策はTeraPadというエディターで改行コードの変換ができます。

2.日本語が文字化けしてしまう。VBAでは日本語が読めていても、Arduino IDEでスケッチを開くと文字化けしてしまいます。改善策はあると思うのですが、調べるのにちょっと時間がかかりそうです。

2016年06月11日

Arduino IDE 環境にて、UncompatinoへI2C接続してデバッグする

UncompatinoにはUSB端子がありますが、これをデバッグ用にしてしまうと、USBを使うアプリはデバッグできません。そこで、デバッグの情報はI2Cでやり取りし、USBはアプリ側で使用できるようにしました。でも、無いよりはマシですが、物凄く便利というわけのものでもありません。その辺りをよく理解した上でもしご興味があればどうぞ試してみてください。

接続図の説明

Arduino IDE を使用しますので、Uncompatinoともう一つのUNO互換機はPCとUSBで接続されます。Uncompatino側のUSBは、アプリが動き始めるとアプリが使用することになります。UNO互換機側のUSBは、I2C経由でUncompatinoから受け取ったデバッグ情報をPCに出力します。

接続図.jpg

実物写真

デバッガー用にUNO互換機を買うつもりなら、Uncompatinoをお勧めします。Uncompatinoは、ISPライターの機能もあるので、これ1台でUncompatino上のATmega328Pにヒューズバイトとブートローダー、EEPROMを書くことができます。USB-シリアル変換ICのFTDI製FT232RLの機能です。写真の四角で囲ったISPのところがそうです。
I2Cの配線もA4、A5ピンをそれぞれ接続するだけです。ブレッドボードの一番右にはブレークポイントを抜けるためのstartButtonを配置しました。

DSC07580.JPG

デバッガー側のシリアルポートの表示例

You can write keywords is 234
TWBR is 0x48
TWSR is 0xF8
You can write keywords is 235
TWBR is 0x48
TWSR is 0xF8
You can write keywords is 236
TWBR is 0x48
TWSR is 0xF8
You can write keywords is 237
TWBR is 0x48
TWSR is 0xF8


Arduino IDEの起動の仕方

私の環境では、ターゲット側のMaster-Writer2はCOM7をシリアルポートに指定しました。デバッガー側は、Arduino IDEをもう一つ起動して、COM8をシリアルポートに指定しました。くどいようですが、Arduino IDEを2つ起動するということは、Arduino IDEのスケッチを2つ開くということとは違います。お間違えのないようにご注意ください。Arduino IDEを2つ起動して初めて、別々のCOMをそれぞれ選べるようになります。Arduino IDEでソースコードを表示したら、COMポートを選択して、シリアルモニターを開いてください。ターゲット側とデバッガー側でそれぞれ別のCOMポートを選択できたかは、ウィンドウの下部にCOM番号が表示されますのでそれでも確認できます。

I2C_test.jpg

デバッグ仕様

1.関数名などの文字列と、何番目のブレークポイントなのかを示す通し番号の2つを表示させる。
 実装したものが下記となります。シリアル番号の表現としてint型で宣言して上位バイトと下位バイトに分離してバイト表現するやり方もあると思います。ここではbyte型のものを受信側(デバッガー側)でint型に合成することにしました。
 Wire.beginTransmissionから始まってWire.write、Wire.endTransmissionで終わる一連の動作が一つのI2Cシーケンスとなります。
 void debugPrint(char thisStr[]) { ← thisStr[]が任意の文字列となります。
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(thisStr); // sends charcters ← 文字列を送ります。
  Wire.write(x[0]); // sends one byte ← シリアル番号の下位バイトを送ります。
  Wire.write(x[1]); // sends one byte ← シリアル番号の上位バイトを送ります。
  Wire.endTransmission(); // stop transmitting
  if (x[0] == 255){
  x[1]++; ← シリアル番号の更新です。
  }
  x[0]++; ← シリアル番号の更新です。
 }

2.レジスター名とその内容(HEX形式)を表示させる。
 実装したものが下記となります。
 (レジスターによっては2バイト返すものがあるらしいのですが勉強不足で未対応です。そのうちに改良します。)
 void debugRegPrint(char thisStr[], byte regValue) { ← レジスター名、その内容(1バイト)の順です。
  Wire.beginTransmission(8); // transmit to device #8
  Wire.write(thisStr); // sends charcters ← レジスター名の送信
  Wire.write(regValue); // sends one byte ← レジスターの内容の送信 Arduino IDE では変数としてレジスタ名を書くだけでレジスタの内容が表示される仕様となっています。便利と言えばかなりお手軽な使い勝手です。これは、wire.hをインクルードしたので、幾重にもネストされたどこかのヘッダーファイルにマクロ定義がされているものと思います。そこまで調べて突き止める気力がありませんでした。

  Wire.write(0); // dummy byte(debugPrintと揃える為) ← ダミーバイトの送信
  Wire.endTransmission(); // stop transmitting
 }

3.スタートボタンを押したらブレークポイントから抜けることができる。
 実装したものが下記となります。
 void breakPoint(void) { ← 引数も戻り値もありません。
  while (1) { ← 無限ループです。
  if (digitalRead(startButton) == LOW) { ← スタートボタンを押すとLOWになります。
  delay(500);//wait a finger to take off ← 500ms待つのは、ボタンを押してから離すまでの時間です。ボタンを押してから離すまでは500ms以内に行わないと次のブレークポイントもすり抜けることになりますので注意してください。逆に長押しするということは、ブレークポイントを複数個所スルーできるので、適宜使い分けると便利かも。
  break;//when the startButton got pushed ← 無限ループを抜けます。
  }
  }
 }

4.上記1と2で送られたデータを解析して表示する。
 実装したものが下記となります。
 I2Cシーケンスが始まると割り込みが発生します。割り込みを処理する関数を割り込みハンドラーと呼びます。
 void receiveEvent(int howMany) { ← 割り込みハンドラーです
  while (2 < Wire.available()) { // loop through all but the last ← 受信したデータが最後の2バイトになるまでループします。
  c = Wire.read(); // receive byte as a character ← 1バイトずつ文字として読みます。
  if (c == '*'){ ← 読んだ文字が*なら、ここで打ち切りします。
  break;
  }
  Serial.print(c); // print the character ← USB経由で1文字ずつPCに表示させます。
  }
  Serial.print(" is "); ← USB経由で文字列「 is 」をPCに表示させます。
 
  if (c == '*'){ ← レジスターとしての処理を行います
  //debugRegPrint
  z = Wire.read(); // receive byte as a byte ← 1バイトをbyte型として読みます。
  Serial.print("0x"); ← PCに「0x」を送ります。
  Serial.println(z, HEX);// print the regValue as a hex ← 読んだデータをHEX形式でPCに送ります。
  z = Wire.read(); // throw out a dummy byte ← ダミーバイトを読み捨てします。
  } else { ← 任意の文字列の処理となります。
  //debugPrint
  x = Wire.read(); ← シリアル番号の下位バイトをint型として読みます。
  y = Wire.read(); // receive byte as an integer ← シリアル番号の上位バイトをint型として読みます。
  x = 256 * y + x; ← シリアル番号に戻しています。x += 256*y とも表現できますが分かり難いですよね。
  Serial.println(x);// print the integer ← シリアル番号PCに送ります。
  }
 }

全体のサンプルコードは下記の通りです。Arduino IDE に付属していたコードを参考にさせていただきました。
(元ファイルは、Arduino IDEを立ち上げたら、メニューバーの「ファイル」−「スケッチの例」−「Wire」と開いて行くとあります)

ターゲット側のソースコード(Master-Writer2)

 loop()の中の、debugPrint、debugRegPrint、breakPointの3点で一組と考えていますが、debugPrint、breakPointの2点だけもありかなと思います。ここでは、レジスターTWBRとTWSRの値を読んでいますが、この2つのレジスターの値を読むとI2CのSCLの速度が計算できるからです。
 最大の注意点なのですが、レジスタ名としてデバッガーに認識させるためには文字列の最後はアスタリスク(*)で終わってください。これが任意の文字列とレジスター名の文字列との識別子となります。


#include <Wire.h>

byte x[2];  //as a serial number
const int startButton = 7;

void setup() {
 Wire.begin(); // join i2c bus (address optional for master)
 pinMode(startButton, INPUT);
 x[0] = 0;
 x[1] = 0;
}

void debugPrint(char thisStr[]) {
 Wire.beginTransmission(8); // transmit to device #8
 Wire.write(thisStr);        // sends charcters
 Wire.write(x[0]);           // sends one byte
 Wire.write(x[1]);           // sends one byte
 Wire.endTransmission();     // stop transmitting
 if (x[0] == 255){
   x[1]++;
 }
 x[0]++;
}

void debugRegPrint(char thisStr[], byte regValue) {
 Wire.beginTransmission(8);  // transmit to device #8
 Wire.write(thisStr);        // sends charcters
 Wire.write(regValue);       // sends one byte
 Wire.write(0);              // dummy byte(debugPrintと揃える為)
 Wire.endTransmission();     // stop transmitting
}

void breakPoint(void) {
 while (1) {
   if (digitalRead(startButton) == LOW) {
     delay(500);//wait a finger to take off
     break;//when the startButton got pushed
   }
 }
}

void loop() {
 debugPrint("You can write keywords");//ここは適当な文字列
 debugRegPrint("TWBR*", TWBR); //read TWBR reg.  レジスター名には*をつける
 debugRegPrint("TWSR*", TWSR); //read TWSR reg.
 breakPoint();
}



デバッガー側のソースコード(Slave-Receiver2)

 負の数字は扱わないのでx,yは、intではなくunsigned intとしました。そんな大きなプログラムは扱わないと思うのですが、気になったのでそうしておきました。


#include <Wire.h>

void setup() {
 Wire.begin(8);                // join i2c bus with address #8
 Wire.onReceive(receiveEvent); // register event
 Serial.begin(230400);        // start serial for output
}

void loop() {
 delay(100);
}

// function that executes whenever data is received from master
// this function is registered as an event, see setup()
char c;
unsigned int x, y;
byte z;
void receiveEvent(int howMany) {
 while (2 < Wire.available()) { // loop through all but the last
   c = Wire.read();             // receive byte as a character
   if (c == '*'){
     break;
   }
   Serial.print(c);       // print the character
 }
 Serial.print(" is ");

 if (c == '*'){
   //debugRegPrint
   z = Wire.read();        // receive byte as a byte
   Serial.print("0x");
   Serial.println(z, HEX);// print the regValue as a hex
   z = Wire.read();        // throw out a dummy byte
 } else {
   //debugPrint
   x = Wire.read();
   y = Wire.read();   // receive byte as an integer
   x = 256 * y + x;
   Serial.println(x);// print the integer
 }
}



I2CのSCLの周波数計算

ATmega328Pの日本語データシートだとP136の「22.5.2.ビット速度発生器」のところに計算式があります。
  SCL周波数=CPUクロック周波数/(16+2×(TWBR)×前置分周値)
  前置分周値:P153の表22-7参照。→そのページに行くと、TWSRレジスターのbit1、bit0が、TWPS1、TWPS0とあり、表22-7から前置分周値が読み取れる。
  今回の場合、TWBRが0x48で、TWSRが0xF8でした。0x48は10進で72、0xF8の下位2ビットは00なので分周値は1である。これを式に代入すると、SCL=16MHz/(16+2×72×1)=100kHz となりました。

一休み

後の問題は、ここで考えたブレークポイントを<どうやってターゲットのソースコードに埋め込むか>ですね。
まさか、関数ごとに手打ちで入れ込むなんて気が遠くなりそうだし間違えそう。なんとかしなくては。

2016年06月08日

Arduino IDE デバッグやり辛いですよね?

前提条件:Arduino UNO 互換機をターゲットとします。UNO互換機からUSBで大量のデータをPCに送るアプリのデバッグをしようとしています。

Arduino IDE って、デバッグのことは深く考えてないですよね。Visual Studioみたいにブレークポイントの設定ができるとよいのですが、そういうものは一切無いですよねえ。これって贅沢な意見なのでしょうか。残念ですね。

Arduino IDE for Visual Studio extention というものがあるらしいのですが、PCとターゲットボード間はシリアルポート(USB)で接続するみたいです。そうなると、ターゲットの機能でシリアルポート(USB)を使う仕様だった場合はどうなるのでしょうか? 複数のシリアルポート(USB)をターゲットボードが持っていないといけないですよね。う〜む。

Arduino IDE for Visual Studio extentionが、I2CかSPIでターゲットボードと通信する仕様なら実用性があると思うのですが、実際のところどうなのでしょう? シリアル接続じゃあ、シリアルポート使うアプリだとデバッグできないということでしょ? これは絶対に不便だと思うなあ。これって実際にデバッグ記事の投稿ありませんよね。

やはり現実的な方法としては、ターゲットボードのパラメーターを、別のArduino(互換機)とI2C通信で取得して、それを別のArduino(互換機)のシリアルポートからPCへ出力するのがベストですよね。

みなさんはどうされていますか。もしご存じでしたら教えていただけないでしょうか。

2016年06月07日

arduino IDEを使う

前提条件:ボードは、Uncompatino または、ちびでぃ〜の2とする。

どういう設定で使うのかというところが知りたいところですよね。

ポート選択.jpg

aruduino IDE のボード指定は、Arduino/Genuino UNO を選択します。(本当は互換機なんだけど)

どのシリアルポートを使うのかはとても重要です。自分のターゲットボードはCOMの何番になるのかは、デバイスマネージャーを起動して、ボードを抜き差しして確認しておいてください。

COMの速度ですが、私は、115200bpsでやっています。シリアルモニタのところをクリックするとCOM windowが出ますので、そこで速度を変えて試してみてください。

書き込み装置はデフォルトのままいじりません。"AVRISP mkII" のままです。

以上でスケッチを書き込めるようになった筈です。

2016年06月06日

ちびでぃ〜の2にヒューズバイトとブートローダーを書く

Uncompatinoはヒューズバイトとブートローダーを自己書き込みできますが、ちびでぃ〜の2は自己書き込みに対応していません。

そこで、私はUncompatinoとちびでぃ〜の2をISP接続して書き込みました。まだUSB-シリアル変換ICをマウントする前に書きました。

PC--(USB接続)-->Uncompatino--(自作ジャンパーコード接続)-->ちびでぃ〜の2
自作ジャンパーコード接続
Uncompatino--ちびでぃ〜の2
    CTS--MISO
    DCD--MOSI
    DSR--SCK
     RI--RESET

+5VとGNDも、Uncompatinoから、ちびでぃ〜の2へ接続すること。

開発環境はavrdudeを使いました。やり方は、「avrdudeを使ってATmega328Pにヒューズバイトとブートローダを書き込む」と全く同じです。参照してください。

DSC07575.JPG

ちびでぃ〜の2の修理(USB-シリアル変換ICの交換)

ちびでぃ〜の2のUSB-シリアル変換ICは、 prolific製のPL2303を使っています。私が購入したちびでぃ〜の2はしかもICのバージョンがかなり古くて、メーカーprolificがデバイスドライバーの対応をやめてしまい、Windows8.1には対応していないものでした。

PL2303.jpg

ちびでぃ〜の2の販売者に質問状を出して解決策を教えてほしいと連絡したのですが、回答はありませんでした。Uncompatinoに比較すると、ちびでぃ〜の2はちょっと安いので、色気を出して購入したのですが、裏目に出ました。安いだけじゃダメなのです。PL2303は評判の良くないICでした。数年前からこの手の問題が表面化していたのでした。私はとんでもないものを掴んでしまいました。今回の件は反面教師としたいと思います。

結局、自分なりに考えて、USB-シリアル変換ICをメーカーFTDIのFT232RLに置き換えるしか手立てはないという結論に至り、秋月電子にてFT232RLを420円で購入しました。IC交換の大変な作業と余分な部品代でずいぶん高い買い物になりました。最初からUncompatinoを買っておけば良かった。失敗した〜。

IC交換したら何事もなくすんなりとCOMポートの識別が出来ました。もうこれからはこのボードは単に互換ボードと呼ぶべきですね。

DSC07577.JPG

avrdudeを使ってATmega328Pにヒューズバイトとブートローダを書き込む

avrdudeのダウンロードとインストールは、「USB−シリアル変換IC FT232RLを使ったブートローダの書き込み」を参考にしてください。
URL・・・https://fanblogs.jp/papas56/archive/6/0

avrdude_5.jpg

ターゲットはUncompatinoとします。PCとUncompatinoをUSB接続します。UncompatinoのISPはジャンパー線で下記のようにショートしておきます。
CTS--MISO
DCD--MOSI
DSR--SCK
RI--RESET

最後にavrdudeを起動します。

@avrdude.exeの場所を指定する。
APrgrammerに、FT232R Synchronous BitBang(diecimila)を指定する。
BUncompatinoのPort番号を指定する。デバイスマネージャーを起動しておき、UncompatinoをPCに接続すると新たにCOMが表示されるので、その番号を指定する。
CDeviceに、ATmage328P(m328p)を指定する。
DCommand line Optionに、-P ft0 B 115200 と指定する。
EReadボタンをクリックしてまず値を読んでみる。書き込む値は下記を指定する。
 hFuse・・・DA
 lFuse・・・DF
 eFuse・・・05
 Writeボタンをクリックして書き込む。もう一度Readボタンをクリックして値を確認する。
Fブートローダーを指定する。下記の値を使用する。
 インストールしたフォルダ\arduino-nightly\hardware\arduino\avr\bootloaders\optiboot\optiboot_atmega328.hex

エラーが無ければ何事も表示されないので、あっけなく書き込みは完了する。エラーがあるとダイアログが開きエラー内容が表示される。
×

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