フォト
無料ブログはココログ

AVR

2016年9月19日 (月)

Digispark(3)

 DigisparkはATtiny85を使っていて、bootloaderが2k使っているので、スケッチは6k使える。はずだが、3k以上書けなかった。(Digispark(2) 2016/9/5)

 GitHubにDigispark用のArduinoIDEがある。(https://github.com/digistump/DigistumpArduino/releases/)
これは Digispark用ライブラリインストール済のArduinoIDE ver1.6.7だ。

 このIDEを使っていたのだが、ArduinoIDEの最新版(1.6.11)に変えて、Digispark用ライブラリを手動でインストールしてみた。

 コンパイル終了時のメッセージを見ていて気が付いた。ArduinoIDE 1.6.11はRAMの使用量をレポートしてくれる。

最大6,012バイトのフラッシュメモリのうち、スケッチが4,360バイト(72%)を使っています。
グローバル変数は980バイトのRAMを使用しています。

 ATtiny85のRAMは512byteしかないはず。

 DigisparkはArduinoIDEを使っているので最後にavr-gccでコンパイルされる。

DigiKeyboard.println("hello, world");

と書くと文字列 "hello, world" は、CODE領域つまりフラッシュメモリに配置されると思うが、初期化済データとしてRAMに配置される。って「avr-gcc constをプログラム・メモリに配置(2013/02/08)」で書いてる。(^^ゞ

 文字定数をフラッシュメモリに配置するにはF()マクロを使うとよい。

DigiKeyboard.println(F("hello, world"));

文字定数をフラッシュ・メモリに配置するように書き換えてコンパイルすると、

最大6,012バイトのフラッシュメモリのうち、スケッチが4,330バイト(72%)を使っています。
グローバル変数は96バイトのRAMを使用しています。

RAMの使用量は512byte以下に収まった。

 ATtiny85はRAMが512byteしかないので、RAMの使用量を増やさないようなプログラミングが必要だ。簡単にUSBデバイスがつくれるのだけれど、初心者向きではないのかも。


 F()マクロは  include/avr/pgmspace.hではなく、hardware/arduino/avr/cores/arduino/WString.hで定義されている。


最近の投稿】【最近のAVR

2016年9月 5日 (月)

Digispark(2)

 Digisparkは簡単に言うと、V-USB+ArduinoをATtiny85で作ったもの。BootloaderにV-USBを仕込んであるのでUSB経由で書き込める。おまけに、V-USBデバイスなので、HIDやSerialデバイスなどのサンプルが用意されている。

 開発環境は、arduino IDEが使える。
Arduinoのサイト(https://www.arduino.cc/en/Main/Software)からArduino IDEをDLしてインストールし、ボードパッケージ(http://digistump.com/package_digistump_index.json)をインストールすればよい。Digisparkでググるとたくさん情報が見つかる。

 基本動作は、
 DigisparkをPCに接続すると、libusb-win32 Usb Deive/Digispark Bootloaderとして5秒くらい認識されるので、この間にスケッチを書き込む。 Digispark Bootloaderとして認識している間に書き込まなければ、既に書き込まれたスケッチが動き出すという仕掛けだ。

 リセットスイッチはないので、arduino IDEの書き込みボタンをクリックして、

Plug in device now...(will timeout in 60 seconds)

が表示されているときに、Digisparkを挿すとスケッチが書き込まれる。

 この手順を覚えておかないと、デバイスの認識、取り外しが繰り返されるという、一見挙動不審な動作になる。ハマってしまった。

 ATTiny85は8kのフラッシュを持っていてBootloaderに約2k使っているので、ユーザは約6k使用できる。

 ところが、約3k以上書こうとすると正常に書けない。フラッシュを消しているときにUSB接続が切れているように見える。

 bootloaderのソースを見てみようか。


最近の投稿】【最近のAVR

2016年9月 3日 (土)

Digispark (1)

AmazonでUSB-Srialアダプタが安かったので買ってみた。
(https://www.amazon.co.jp/gp/product/B011DT2U9A/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)
なんと150円、送料無料!

Ch3401

Ch3402

 150円の商品を送料無料で運んでもらうのはエコではないのでDigispark Kickstarter ATTINY85、340円を一緒に買った。(その後200円になってる)
(https://www.amazon.co.jp/gp/product/B00VM5M4W4/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)

 同じものをaitendoで売っていて前から気になっていたのだけれど、aitendoは「Digispark」ではなく「ATtiny85モジュール」で売っている。価格は500円だ。(http://www.aitendo.com/product/13064)

 本家は、米Digispamp LLCのようだ。こちらは$7.95だ。(http://digistump.com/category/1)

 HiLetgoとaitendoは同じ製品のようだが本家とは、シルクパターンが微妙に違う。本家はヘッダーソケットが付いているが、HiLetGoとaitendoはピンヘッダーが付いている。 3ピンには5V,GND,VINが出ているのでソケットの方が良いと思う。

Digistamp(本家)

↑(https://s3.amazonaws.com/digistump-resources/images/l/2520dcf84a0a3bf2257c2559d7a187db.jpg)

HiLetGo

↑(https://images-na.ssl-images-amazon.com/images/I/61rED3R3c9L._SL1010_.jpg)

aitendo

↑(http://www.aitendo.com/data/aitendo/product/20160208_364282.png)

かんたんな回路↓なので誰でも作れる。
Digistamp
↑(https://s3.amazonaws.com/digistump-resources/files/97a1bb28_DigisparkSchematic.pdf)

 Digisparkは KickStartで資金調達したようで、ライセンスは CC-BY-SA 3.0だそうだ。CC-BY-SAってなに?って調べてみたら、ここに説明があった。 つまり、パクってもいいけどクレジットを表示してねということらしい。 堂々とパチモンを売ることができるということだ。


最近の投稿】【最近のAVR

2016年3月 1日 (火)

Atmel買収

 AVR(Arduinoに載っているMCU)を作っているAtmelがPICを作っているMicrochipに買収されたそうだ。

Microchip、Atmelを35.6億ドルで買収 (2016/1/21) EE Times

 現在、8bitの組み込み用MCUはPIC vs AVRだからMicrochipがAtmelを買収したら、AVRの扱いがどうなるか気になる。σ^^)はAVR派なのでAVRが無くなるのが心配だ。

MicrochipのAtmel買収に興奮したこと(2016.01.28) Make によると、しばらくは変わらないだろうとのことで安心した。とはいえ、Cortex-Mシリーズが8bitMCUの領域を侵食しているから、この先PICもAVRも安泰ではいられないだろう。

 マイコン工作の敷居を下げたArduinoの功績は大きい。ユーザーにとってはIDEと言語仕様が変わらなければ使ってるMCUは関係ない。(Arduin DueはARMが載っている。)

 また、今時、ゴリゴリアセンブラで書くこともなく、8bitMCUでもCで書く時代だから、ユーザにとってアーキテクチャの違いはそれほど気にならない。

 とすると、この先、Arduinoは残るのだろうが、ArduinoにAVRが載り続ける保証はないのでは?

 最近世界規模の半導体メーカの買収が多いので目が離せない。


最近の投稿】【最近のAVR


 

2013年4月 6日 (土)

プレゼンテーション・タイマー(2)

行き当たりばったりではなくて、ブレッド・ボードで作ってみることにした。
Presentimer_breadbord

 ソースをコンパイルしてavrdudeで m88 を指定して書き込もうとしたら、シグネチャが違うと怒られる。
ATMEGA88のシグネチャは 1E 93 0A だけど 検出したデバイスのシグネチャは1E 93 0F だぜ
と言ってる。

調べてみると、1E 93 0FはATMEGA88Pのシグネチャだそうだ。ATMEGA88とはシグネチャが違っていて、未だavurdude.confにATMEAG88Pのエントリがないらしい。 FAQみたいだ。
親切な人がこのサイトでavrdude.confに追加するコンフィグ(m88p)を公開してくれている。

コンフィグをDLして avrdude.confに追加して、m88pを指定するとちゃんと書けた。
が、動いてないようだ。

InfraHIDのソースはATMEGA8用だったのだがATMEGA8が無かったのでピンコンパチでフラッシュが同じ容量のATMEGA88を使うことにした。
ATMEGA8とATMEGA88は同じ機能が割り当てられているレジスタが変わっていたり機能が追加されていたりと結構変わっているようだ。

AVR094: Replacing ATmega8 by ATmega88

AVR512: Migration from ATmega48/88/168 to ATmega48P/88P/168P
を参考にしてソースを変更した。
(Atmelはリンク先がコロコロ変わるので、"AVR094"や"AVR512"で検索した方がよいかも)
完全に変更できていないのだろう。

不具合を見つけてちゃんと動くようにするのが楽しいんだよね。 ^^;)

2013年3月31日 (日)

プレゼンテーション・タイマー

人前でしゃべることが多くなってきたのでプレゼンテーション・タイマを作ろうと思いついた。
カウントダウン・タイマーと赤外線キーボード組み合わせるとよさそうだ。

カウントダウン・タイマ

  • 表示は7セグLED2桁
  • 1分毎にカウント
    7セグLEDを2個使うと99分までしかカウントできないのでちょっと短い。
    10位を0-Fまで使うと159分までカウントできるので十分であろう。
  • 5分前くらいにアラームが鳴るとうれしい
  • 電源はUSBから貰う

赤外線キーボード

  • パワーポイントを使うことが多いので[Enter]、[ESC]か[↑]、[↓]が使えればよい。
  • V-USBにあるInfraHIDが使えそう

ケース

  • FRISK
    これは譲れない!

回路図は↓こんな感じ
Presentimermega8

AVR、LED、SWは小さくならないので、X'talやCRをSMDを使わないとFRISKケースに入らないかも。

2013年3月10日 (日)

8x8LEDでLifeGame

「8つのI/Oポートで市販の8x8マトリクスLEDを駆動(2013/2/15)」で数字を表示してみたが面白くないので、Life Gameを表示させてみた。

Life Game
Lifegame ←リンク先にAVI(3.4Mb)

 

2013年3月 3日 (日)

8x8LEDで8queen

「8つのI/Oポートで市販の8x8マトリクスLEDを駆動(2013/2/15)」で数字を表示してみたが面白くないので、8Queenを表示させてみた。

8Queen
8queen0186 ←リンク先にAVI(2.4Mb)

もっと早く解けるのだが、バックトラックの過程が見えないので遅くしてある。
解けるとちょっと止まる。

2013年2月25日 (月)

8つのI/Oポートで市販の8×8マトリクスLEDを駆動

 SCRを使って市販の8x8マトリクスLEDを9つのI/Oポートで駆動する方法を「9つのI/Oポートで市販8x8マトリクスLEDを駆動」に書いた。
 よく考えたら8つのI/Oポートで駆動できそうである。

↓のように配線されているマトリクスLEDの駆動について
8x8matrixled

  1. SCRのカソード    ←'L'
  2. SCRのゲート     ←'H', 他SCRのゲート←'Z'
  3. SCRのカソード    ←データ(Active'L')

で駆動することを考えていた。

 SCRのカソードとゲートは↓のように接続されているので
8x8led3

  • P1←'H' → SCR1 ON
  • LED(1,2) → SCR2ゲート → SCR2 ON

となり、SCR2がONしてしまう。

 SCR2がONしないようにするには、SCR2のゲート(P1)を'L'にしておく必要があるのだが、SCR2のゲートとSCR1のカソードは繋がっているので、P1を'L'にするとLED(1,2)が点灯してしまう。
つまり、SCR1だけONしようとするとLED(1,2)~LED(1,7)までのLEDが全て点灯することになる。

 このとき、SCR1はゲートを'L'にしても、SCR1→LED(1,2)→P1 で電流が流れているので、SCR1のカソードに接続されたR9やポートP9は必要ない。

任意の列(x)にデータD(0-7)を出力する方法は

  1. P(0-7) ← 'ZZZZZZZZ'       (ALL_OFF)
  2. P(x) ← 'H',  
    P(x以外) ← 'L'         (SCR(x) ON)
  3. if D(n)='1' then P(n) ← 'L'
    else        P(n) ← 'Z'  (データ出力負論理)

でよいのではないか。

 SCRをONにする期間(2)に関係のないLEDが点灯するが、SCRをONにする期間(2)がデータを出力している期間(3)と比較して短時間であれば人間には見えないだろう。

 ソースは↓こんな感じ

void disp_col(uint8_t col, uint8_t data) {
	ALL_OFF();
	_delay_us(50);
	COL_ON(col);	/* colmun on */
	_delay_us(10);  /* 用調整 */
	PORTB = 0x00;
	DDRB  = data;
}

SCRのゲートをONした後の時間待ちは電源電圧によって異なるので用調整。

9つのI/Oポートで市販8x8マトリクスLEDを駆動」と同じH/Wを使って、常時P9を'Z'とする方法で試してみた。

8x8led1

↓06:55と23:55
8x8led_8io ←リンク先にAVI
(ちょっと見にくい)

 

2013年2月18日 (月)

9つのI/Oポートで市販の8×8マトリクスLEDを駆動

Charlieplexing (2)で 市販の8x8のマトリクスLEDを9つのI/Oポートで駆動する方法について考えたので作ってみた。

 回路図は↓こんな感じ
8x8led1

 AVR AT90S2313を使ったが特に意味は無い。SCRは秋月で売っているMCR22-8を使った。

8x8led_avr

 Charlieplexing (2)に書いた方法では全てのLEDが点灯してしまうので↓の方法に変更して制御できた。

 ALL_OFF、カソードOFFにするときには時間待ちが必要で50usはCut&Tryで決めた。

  1. P(0-7)←’ZZZZZZZZ’, P8←Z  ; ALL_OFF
  2. P8←L                                  ; カソードON
  3. P(X)←H、P(X以外)←L            ;カラム(x)ON
  4. P8←Z                                  ;カソードOFF
  5. P(0-7)←表示データ(ActiveL) ;データ出力

 ↓任意の列の制御ソースコード

#define	SCR_C	6
#define	SCR_C_ON()	do {	PORTD &= ~_BV(SCR_C);	\
				DDRD  |= _BV(SCR_C);	\
			} while(0)			//PD6<-0, output
#define	SCR_C_OFF()	do {	DDRD  &= ~_BV(SCR_C);	\
				PORTD &= ~_BV(SCR_C);	\
			} while(0) 		//PD6 input, pullup off
#define	ALL_OFF()	do {	SCR_C_OFF();		\
				PORTB = 0x00;		\
				DDRB = 0x00;		\
			} while(0)
#define	COL_ON(c)	do {	PORTB = _BV(c);		\
				DDRB  = 0xFF;		\
			} while(0)

void disp_col(uint8_t col, uint8_t data) {
	ALL_OFF();
	_delay_us(50);
	SCR_C_ON();	/* cathord on */
	COL_ON(col);	/* colmun on */
	SCR_C_OFF();
	_delay_us(50);
	PORTB = ~data;	/* out column data (acctive Low) */
}

↓動いているところ
8x8led_v0000 ←リンク先にAVI


よく考えたら、8つのI/Oポートで駆動可能だった。
( 8つのI/Oポートで市販の8×8マトリクスLEDを駆動)

より以前の記事一覧