2012年4月1日日曜日

AVRのメモリ(SRAM)とプログラムエリア(FLASH)

AVRではメモリ(SRAM)とプログラムエリア(FLASH)が区別される。
SRAMの容量は限られている(ATMega64Aでは4KBしかない)。その上、スタックなどにも使われる。

そこでプログラム中の文字列定数などはFLASHに置きたいが、
普通にCで書くとSRAMに置かれてしまうらしい。

1.PSTR
プログラム中ではPSTRマクロを使って文字列定数を書くことでFLASHにおいてくれる

char* flash_addr = PSTR("constant string on FLASH.");

こんな感じ


2.PROGMEM

avr/pgmspace.hをインクルードし、PROGMEMを頭につけることでFLASHに置いてくれる

PROGMEM char str[] = "some string";


3.PRG_RDB

上記で読み出すときはpgm_read_byteを使用

char c = pgm_read_byte(&str[i]);

2012年1月12日木曜日

ATMega64aのワナ

最近、ATMega64AというATMEL社のマイコンを使っています。
そこで早々にハマってしまった点をご紹介します

といってもデータシートにはちゃんと書いてあるわけで、読まずに悩んでたのがバカだったりするのですが

ハマったのは、ATMEL社のISPである、AVRISP mk2を使ったときのことです。

以前使っていた、Arduinoでも使われているATMega328pなんかだと、MISOもMOSIも素直につなげばよかったので、特に問題はありませんでした。

そのときの感覚のままでISPのMISO、MOSIをATMega64AのMISO、MOSI(PB2、PB3)につないだところ、まったく通信ができません。
おっかしーなーと散々悩んだ挙句、ついに発見しましたデータシート
310ページあたりの、「27.8 SPI Serial Programming Pin Mapping」という章です。

詳しくはデータシートを読んでください。
簡単に言うと、「SPIのIOモジュールはプログラミングインターフェースには使わないよ、SPIプログラミングモードのときはMOSIはPE0、MISOはPE1につなげよ!」ってことだったのです!
ちなみにSCKはPB1でよいです。

なんとまあ・・これで半日潰れてしまいました・・・