Home New Help Edit

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
-qfuse読み出し
-I 100000ISP周波数を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)
-pfFLASH書き込み
-vfFLASHベリファイ
-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


自分の勉強の為にまとめ。

概要

レジスタ

Data Memory空間に配置

レジスタ処理は、こんな感じ。ま、普通に8bit。

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で置いてある

Home New Help Edit
2023-03-24 09:22:16 32400