Wire.hコードからTinyWire.hコードへの最適化
タイトルにもある様にTinyWireMライブラリ(ATtiny用のI2Cライブラリ)を使用したLCD操作なのですが、主目的はWireライブラリを使用して開発したコードをTinyWireMライブラリを使用したコードに最適化することです。
なぜそんな回りくどいことをするかというと、ATtinyシリーズを使って組み込み開発を行う時ってArduinoである程度開発してからATtiny用にコードを最適化して実装することが多いんですよね(私だけかもしれませんが、、、)。
その際にWireライブラリをそのまま使用できないのでTinyWireMライブラリを使用する必要が出てくるので、その際のコードの最適化方法をまとめました。
最適化手順
方法はそこまで複雑でないです。今回最適化元のWireライブラリを使用したコードです。
*LCDに4桁のランダム数字を表示するコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include <Wire.h> #define ADDRESS 0b0111110 //書き込みのためにLSB=0 #define Command 0b00000000 //Co:0/Rs:0 #define Address 0b01000000 //Co:0/Rs:1 void commWrite(byte cData){ Wire.beginTransmission(ADDRESS); Wire.write(Command); Wire.write(cData); Wire.endTransmission(); delay(10); } void dataWrite(byte dData){ Wire.beginTransmission(ADDRESS); Wire.write(Address); Wire.write(dData); Wire.endTransmission(); delay(10); } void dispInit(){ delay(50); commWrite(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commWrite(0x39);//external table use delayMicroseconds(30); commWrite(0x14);//VDD3V:183Hz/VDD5V:192Hz delayMicroseconds(30); commWrite(0x73);//コントラストC3,C2,C1,C0 delayMicroseconds(30); commWrite(0x52);//ICON-off/内部昇圧回路-off/コントラストC5,C4 //commWrite(0x56); delayMicroseconds(30); commWrite(0x6C);//内部フォロワ回路off,V0の増幅比 delay(250); commWrite(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commWrite(0x0C);//display-on/cursor-off/画面反転-off delayMicroseconds(30); commWrite(0x01); } void setup() { Wire.begin();//マスター設定 dispInit(); } void loop() { int i=random(9999); //データを送ることにAdress Counterはインクリメントする commWrite(0b10000010);//開始DDRAMアドレス dataWrite(0b00110000|(i/1000)); dataWrite(0b00110000|((i%1000)/100)); dataWrite(0b00110000|(((i%1000)%100)/10)); dataWrite(0b00110000|(((i%1000)%100)%10)/1); delay(500); } |
このコードからどのようにTinyWireライブラリ様に変えるかというと。
- #include <Wire.h>を削除
- Wireを検索⇒TinyWireMに置換
- writeを検索⇒sendに置換
- #include <TinyWireM.h>を追加
のみです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
#include <TinyWireM.h> #define ADDRESS 0b0111110 //書き込みのためにLSB=0 #define Command 0b00000000 //Co:0/Rs:0 #define Address 0b01000000 //Co:0/Rs:1 void commsend(byte cData){ TinyWireM.beginTransmission(ADDRESS); TinyWireM.send(Command); TinyWireM.send(cData); TinyWireM.endTransmission(); delay(10); } void datasend(byte dData){ TinyWireM.beginTransmission(ADDRESS); TinyWireM.send(Address); TinyWireM.send(dData); TinyWireM.endTransmission(); delay(10); } void dispInit(){ delay(50); commsend(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commsend(0x39);//external table use delayMicroseconds(30); commsend(0x14);//VDD3V:183Hz/VDD5V:192Hz delayMicroseconds(30); commsend(0x73);//コントラストC3,C2,C1,C0 delayMicroseconds(30); commsend(0x52);//ICON-off/内部昇圧回路-off/コントラストC5,C4 //commsend(0x56); delayMicroseconds(30); commsend(0x6C);//内部フォロワ回路off,V0の増幅比 delay(250); commsend(0x38);//Function set:8bit-bus,2line-display delayMicroseconds(30); commsend(0x0C);//display-on/cursor-off/画面反転-off delayMicroseconds(30); commsend(0x01); } void setup() { TinyWireM.begin();//マスター設定 dispInit(); } void loop() { int i=random(9999); //データを送ることにAdress Counterはインクリメントする commsend(0b10000010);//開始DDRAMアドレス datasend(0b00110000|(i/1000)); datasend(0b00110000|((i%1000)/100)); datasend(0b00110000|(((i%1000)%100)/10)); datasend(0b00110000|(((i%1000)%100)%10)/1); delay(500); } |
いかがだったでしょうか?ちょっとした事ですがこれで最適化完了です。
ここでは触れませんが、Wire.hを使用したライブラリに関してもこの要領でTinyWire.h用のライブラリに最適化できると思います。必要が出てきたら紹介したいと思います。
今回はこの辺で失礼します。
ではでは~
【本記事で使用したマイコン】
コメント