avr
*AVRを使ってみる [[index]] #contents **AVR Stuidio6 ***PROGMEMでエラー 古いソースでエラーが発生して、ビルドが通らなかった。 エラーはこんなの >Error 1 variable 'pwm_table' must be const in order to be put into read-only section by means of '__attribute__((progmem))' ソースはこれ >unsigned short pwm_table[NUM_PWM_TABLE] PROGMEM = 修正はconst追加でOK >const unsigned short pwm_table[NUM_PWM_TABLE] PROGMEM = **開発環境のインストール 2014-09-06 AVR Studio 6.2 インストールして起動すると、アップデートあるよと言われるので、言われるがままにアップデート 統合環境(VisualStudioベース),USBのデバイスドライバ,GCCがインストーラ1個で入るみたい。 スペルミスの表示を消す>メニュー→VAssistX→Visual Assist Options...→Underlines→Underline spelling errors... &img(vassistx_off.png); 2009-07-31 [[AVR Studio4>http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725]] AVR Studio 4.17 (build 666) [[WinAVR>http://sourceforge.net/projects/winavr/]] WinAVR20090313 **Debug WIREで AVRの工場出荷時はDW無効なので、「Debugging」→「Start Debugging」は失敗する。 その際DW有効に切り替え出来る。 **AVR Dragonでfuseビットアクセス ATmega48の初期状態の場合は、ISP Frequencyを250KHzに設定する。 250KHz = 内蔵発信器8MHz / 8 / 4 DW有効だとアクセス出来ないので、「Debugging」→「AVRDragon Options」で、 **AVR Dragonコマンドライン AVR Dragonをコマンドラインで使ってみる。 |-mi|インターフェースをSPI |-d ATmega48|デバイスをATmega48 |-q|fuse読み出し |-I 100000|ISP周波数を100KHzに > C:\Program Files\Atmel\AVR Tools\AvrDragon>AVRDragon.exe -mi -d ATmega48 -q -I 100000 > avrdragon.exe v1.0.2 Copyright (C) Atmel Corporation 2006-2008 > ISP frequency set to closest available value: 96386 Hz. > Read fuse bytes (extended, high, low): 0xff 0xdf 0x62. **AVR ISP Mk2コマンドライン >"C:\Program Files\Atmel\AVR Tools\STK500\stk500.exe" -cUSB -dATtiny48 -ifdefault\nanozonea.hex -pf -vf -fDE6E -FDE6E -EFF -GFF |-if|書き込みファイル(.hex) |-pf|FLASH書き込み |-vf|FLASHベリファイ |-f|ヒューズ(fuse1,fuse0)書き込み |-F|ヒューズ(fuse1,fuse0)ベリファイ |-E|ヒューズ(fuse2)書き込み |-G|ヒューズ(fuse2)ベリファイ **ソフトディレイ >#define F_CPU 8000000 >#include
>_delay_us(y); >_delay_us(x); F_CPUは、Project -> Configuration OptionsのFrequencyでも設定可能。 &img(F_CPU.png); **ポートぱたぱた速度 ATtiny88 1MHz(内蔵RC8MHz/8) >OUT 0x08,R24 >OUT 0x08,R1 >OUT 0x08,R24 >OUT 0x08,R1 このくり返しで、1usecのパルス出力 OUT命令の実行サイクル数は1。 1MHz → 1usecなので、理論値通り。 **ビットセット、クリア >#include
//実際は
で定義している。 > >//待ち >loop_until_bit_is_set(UCSR0A,UDRE0); //1になるのを待つ >loop_until_bit_is_clear(PINB,PINB3); //0になるのを待つ > >//判断 >if(bit_is_set(UCSR0A,UDRE0))){ > 1ならば処理 >} > >if(bit_is_clear(UCSR0A,UDRE0))){ > 0ならば処理 >} **文字列でSRAMをけちる AVRで普通に >lcdputs("xyz"); とかすると、貴重なとっても貴重なSRAMを消費してしまいます。 そこで下記のように実装すると、ROM空間に文字列を配置可能。 > #include
> void lcdputs_pgmp(PGM_P s) > { > char ch; > ch = pgm_read_byte(s++); > while(ch){ > lcd_putc(ch); > ch = pgm_read_byte(s++); > } > } > > #define lcdputs_p(s) lcdputs_pgmp(PSTR(s)) > >void test(void){ > lcdputs_p("xyz"); >} ちなみに、下記はSRAM消費しない。みたい。 >lcdputs("x"); でもって、printfにはprintf_Pというのがあって、それを使うのが王道。らしい。 使用すると、こんな感じ。 RAM消費がとても多い > #if 1//Program:6412 Data:67 > printf("%s %s\n",__DATE__,__TIME__); > #endif > > #if 0//Program:6370 Data:61 RAM消費が多い > printf_P(PSTR("%s %s\n"),__DATE__,__TIME__); > #endif > > #if 0//Program:6370 Data:39 良い感じと思わせて、実際は動かない(--;) > printf_P(PSTR("%s %s\n"),PSTR(__DATE__),PSTR(__TIME__)); > #endif > > #if 0 //Program:6372 Data:39 一番メモリ消費が少ない > printf_P(PSTR(__DATE__)); > printf_P(PSTR(" ")); > printf_P(PSTR(__TIME__)); > printf_P(PSTR("\n")); > #endif 参考:[[avr-libc: Data in Program Space>http://www.nongnu.org/avr-libc/user-manual/pgmspace.html]] 参考:[[WinAVR雑記帳>http://www11.ocn.ne.jp/~akibow/AVR/winavr_misc.html]] **配列をROMに置く まずここを読む。 [[avr-libc: Data in Program Space>http://www.nongnu.org/avr-libc/user-manual/pgmspace.html]] 上記から抜粋して引用 > #include
> unsigned char mydata[11][10] PROGMEM = > { > {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09}, > {0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x6B,0x6C,0x6D} > }; > > byte = pgm_read_byte(&(mydata[i][j])); **RESET ***RESETピンの機能 1.全端子を3ステート状態にし、IOレジスタ初期化、プログラムカウンターを0にする 2.プログラミングモードに入る ***RESETピンに、何も接続しない AVRのRESETピンは内蔵プルアップ抵抗があるので、 何も繋がなくても、動作はする。 ただし、環境ノイズによっては予期しないリセットがかかる場合がある。 内蔵プルアップ抵抗の値は、データシートを参照。 ***RESETピンに、CとRとD 対ノイズ(ESD)を考慮するならば C(10K),R(4.7nF),Diodeを付けることを推奨する。 ただし、RESETピンを使ったデバッグ(debugWIRE)の時は、 Cを付けない。(ICEを使う場合は、Cを外す) Diodeは高ESD保護や、外部リセットを使用するなら、省略される(かも)。 ***RESETピンに、VCC直結 ・外部RESETを使わない ・ISPしない という事ならば、VCC直結でも構わない ***出典 AVR040:EMC Design Considerrations 4.9.2 Reset Pin Protection AVR042:AVR Hardware Design Considerations **Fuse &simg(attiny85_fuse.png); **AVR CPU Core 自分の勉強の為にまとめ。 ***概要 -8bit CPU -8bit x 32本のレジスタ -Program Counter(多分16bit) -Stack Pointer -ハーバードアーキテクチャ -パイプライン二段。フェッチと実行。Instruction Set Summaryの#Clocksはフェッチ抜いた実行時間と思われる。 -Single Cycle ALU:1クロックでレジスタの読み出し→演算→書き戻しを行う。これのおかげで1Clockで命令実行が可能。 -プログラムメモリは、16bit幅。 -データメモリは、8bit幅。 -メモリマップドIO(当然データメモリ)。 ***レジスタ Data Memory空間に配置 レジスタ処理は、こんな感じ。ま、普通に8bit。 -8bit x1 -> 8bit x1 -8bit x2 -> 8bit x1 -8bit x2 -> 16bit x1 -16bit x1 -> 16bit x1 ****X,Y,Zレジスタ R26..R31は、16bitのアドレスポインタとして使用する事が出来る。 [R27,R26] -> X [R29,R28] -> Y [R31,R30] -> Z ***Stack Pointer IO空間(て書いてあるけど、Data Memory空間だよね)に配置された8bit x2で16bitのレジスタ。 **開発環境のインストール(旧) AVR Studio4(4.15.623)をインストール。 ただ入れるだけ。 WinAVR(20081205)をインストール。 ただ入れるだけ。 **Windows7(64)にインストール AVR Studio 5.1をインストール AVR Command Line Toolsをインストール(ドライバ入りなので、これだけでも動くと思う) >C:\Program Files (x86)\Atmel\AVR Tools\Stk500 ここのskt500.exe起動しようとするが、動かない。 隣のstk600から、下記3個をコピーすると、起動可能。 >libdwarf.dll >libelf.dll >libelfdwarfparser.dll WindowsXPとパス違うのでシンボリックリンクを張っておく。 >C:\Program Files\Atmel\AVR Tools>mklink /d Stk500 "C:\Program Files (x86)\Atmel\AVR Tools\Stk500" >Stk500 <<===>> C:\Program Files (x86)\Atmel\AVR Tools\Stk500 のシンボリック リンクが作成されました **部品 [[共立エレショップ FC-6P>http://eleshop.jp/shop/g/g79J413/]] 珍しい6ピン圧接コネクタ。普通は10ピンまでしかない。 [[共立エレショップ BOXプラグ6P(直型)>http://eleshop.jp/shop/g/g79J411/]] 珍しい6ピンボックスプラグ [[マルツ ボックスヘッダ6P>http://www.marutsu.co.jp/user/shohin.php?p=40243]] Linkman.データシート有り [[マルツ 圧接メスコネクター>http://www.marutsu.co.jp/user/shohin.php?p=40245]] Linkman.データシート有り [[マルツ 【LFCBL06-01】6ピンフラットケーブル>https://www.marutsu.co.jp/user/shohin.php?p=62248]] [[omron XG8W>http://www.omron.co.jp/ecb/products/cn/3/xg8w.html]]MILピンプラグの切断タイプ [[マイクロファン AVR-DEV-AM328RA>http://www.microfan.jp/shop/39_248.html]] **参考 [[AVRWiki>http://avrwiki.jpn.ph/wiki.cgi?page=FrontPage]]Getting Started Notes 必読 [[AVR試用記-C言語(WINAVR)メモ>http://www.geocities.jp/kuman2600/c_memo.html]] [[MCMジャパン AVR基礎技術講座>http://mcmja245.tempdomainname.com/avr/tech_info.html]] WinAVRの具体的な使い方がPDFで置いてある
2025-04-19 22:13:15 32400