AVRを使ってみる
Suns & Moon Laboratory
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...
2009-07-31
AVR Studio4
AVR Studio 4.17 (build 666)
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 <util/delay.h>
_delay_us(y);
_delay_us(x);
F_CPUは、Project -> Configuration OptionsのFrequencyでも設定可能。
ポートぱたぱた速度
ATtiny88 1MHz(内蔵RC8MHz/8)
OUT 0x08,R24
OUT 0x08,R1
OUT 0x08,R24
OUT 0x08,R1
このくり返しで、1usecのパルス出力
OUT命令の実行サイクル数は1。
1MHz → 1usecなので、理論値通り。
ビットセット、クリア
#include <avr/io.h> //実際は<avr/sfr_defs.h>で定義している。
//待ち
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 <avr/pgmspace.h>
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
参考:WinAVR雑記帳
配列をROMに置く
まずここを読む。
avr-libc: Data in Program Space
上記から抜粋して引用
#include <avr/pgmspace.h>
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
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 珍しい6ピン圧接コネクタ。普通は10ピンまでしかない。
共立エレショップ BOXプラグ6P(直型) 珍しい6ピンボックスプラグ
マルツ ボックスヘッダ6P Linkman.データシート有り
マルツ 圧接メスコネクター Linkman.データシート有り
マルツ 【LFCBL06-01】6ピンフラットケーブル
omron XG8WMILピンプラグの切断タイプ
マイクロファン AVR-DEV-AM328RA
参考
AVRWikiGetting Started Notes 必読
AVR試用記-C言語(WINAVR)メモ
MCMジャパン AVR基礎技術講座 WinAVRの具体的な使い方がPDFで置いてある
2024-08-14 11:00:23 32400