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年4月1日日曜日
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でよいです。
なんとまあ・・これで半日潰れてしまいました・・・
そこで早々にハマってしまった点をご紹介します
といってもデータシートにはちゃんと書いてあるわけで、読まずに悩んでたのがバカだったりするのですが
ハマったのは、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でよいです。
なんとまあ・・これで半日潰れてしまいました・・・
登録:
投稿 (Atom)