アフィリエイト広告を利用しています
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日以上新しい記事の更新がないブログに表示されております。

Build a Mobile Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: