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


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

広告

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

2016年09月13日

CPUパワーアップ基板 2

支払い手続きを済ませました。あとは基板が来るのを待つだけです。郵便で届くらしいです。書留ならいいのですが、普通郵便だと、ちと心配ですね。

2016年09月10日

CPUパワーアップ基板

CPUパワーアップ基板は在庫が1点あり、購入可能ということでしたので予約しました。数か月待てば何個でも買えるとのことでした。

組み立てる時間がなかなか取れないかも知れないのですが、先回SRAMの容量オーバーでコンパイルできなかったソフトウエアのデバッグ(動作解析)をやってみたいですね。

2016年09月07日

UncompatinoのCPUを換装

SRAMの大きなものはないのかと調べたら、ATMEGA1284Pというものがありました。SRAM 16KBあります。そこで、ドーター基板を作って、ATMEGA328P-PU --> ATMEGA1284P-AU のように、UncompatinoのMCUを置き換えようと技術的に検討していたら、下記の記事を見つけました。

Arduino 用 CPU パワーアップ基板

まだ売っていたら購入して組み立ててみたいと思います。販売終了なら自分で作ろうと考えています。


2016年07月26日

鉛筆削り

普段は鉛筆を使っております。シャープペンシルは肝心な時に芯詰まりで使えない、という事が往々にしてあったので、鉛筆派であります。

今まで使ってきた鉛筆削りは、水色の方です。ダイソーで108円でした。これ実用にはなっていますが、uni鉛筆でも芯の近くの木はささくれ気味に削れます。そこがちょっと残念なところなのです。それで今回トンボの鉛筆削りを買い足しました。ヨドバシドットコムで消費税、送料込みで172円でした。下のオレンジのものです。
DSC07882.JPG

ダイソーの方で削ったものは、削りかすが長くなりません。
DSC07885.JPG

トンボの方は、普通の鉛筆と色鉛筆の2種類の削り方に対応しています。
DSC07883.JPG

少し削っただけなのですが、トンボの方は、削りかすの表面が心なしか滑らかっぽいです。
DSC07884.JPG

しばらく使ってみます。

2016年07月02日

修正したものの実行結果です

master_writer2とslave_receiver2の実行例です。

ターゲット基板上のタクトSWを押すとvoid breakPoint(void) を抜け、次に進みます。この辺りはmaster_writer2のコードを見てもらえばわかると思っています。

関数追加.jpg

ご参考まで。

受信側のソフトウエアも修正しました

int型の変数の値を読みたいということと、2バイトのレジスターの値を読みたいということで受信側のソフトウエアも修正しました。

slave_receiver2


// Wire Slave Receiver
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Receives data as an I2C/TWI slave device
// Refer to the "Wire Master Writer" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#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;
int x, y;

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
   x = Wire.read();
   y = Wire.read();   // receive byte as an integer
   x = 256 * y + x;
   Serial.print("0x");
   Serial.println(x, HEX);// print the integer

 } else {
   //debugPrint
   x = Wire.read();
   y = Wire.read();   // receive byte as an integer
   x = 256 * y + x;
   Serial.println(x);// print the integer
 }
}



void receiveEvent(int howMany)を修正しました。

文字列の最後が「*」で終わると、HEXとして処理します。それ以外はint型として処理します。

デバッグ関数を改良しました

実際にデバッグ関数を使ってみて、やはりint型の変数の値を知りたくなったので、デバッグ関数を改良しました。
また受信側の割り込み処理関数もそれに合わせて変更となりました。

まず、送信側(こちらがデバッグするターゲットのソフトだと思ってください。)のソースコードです。

master_writer2


// Wire Master Writer
// by Nicholas Zambetti <http://www.zambetti.com>

// Demonstrates use of the Wire library
// Writes data to an I2C/TWI slave device
// Refer to the "Wire Slave Receiver" example for use with this

// Created 29 March 2006

// This example code is in the public domain.


#include <Wire.h>

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

void setup() {
 Wire.begin(); // join i2c bus (address optional for master)
 pinMode(startButton, INPUT);
 Serial.print("startButton = ");
 Serial.println(startButton);
 Serial.print("buttonState = ");
 Serial.println(digitalRead(startButton));
 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 debugIntPrint(char thisStr[], int variable) {
 Wire.beginTransmission(8);  // transmit to device #8
 Wire.write(thisStr);        // sends charcters
 Wire.write((byte)variable); // sends low byte
 Wire.write((byte)(variable >> 8));// sends high byte
 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.
 debugIntPrint("2byteReg*", 3841);//ex. 0xF01
 debugIntPrint("Integer", 11000);//ex. 1100
 breakPoint();
}



今回、void debugIntPrint(char thisStr[], int variable)を追加しました。int型の変数の値を読みたかったからです。これで、2バイトのregisterの値も読めないかなあと思っています。実際にその場面になったら確認してみます。

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

×

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