石原 博の覚書

電子工作に関する日々の覚書を記載します

AVR(attiny202)でのLチカ

2021-05-05 11:56:58 | 日記
トラ技 2021/4 のAVR記事で attiny202 が使用されていた。
これまで atmega328ばかり使っていたが、8pinのAVRも面白そうだっだので、ちょっと工作。

前に用事で東京に行ったついでに
秋月でattiny202を購入(パッケージがsop8なのでピッチ変換基板も購入)していた。

これまでAVRには USPASP と avrdude で対応していたが、pickitでないと書けない。
そこまでは知っていたが、持っているpickit3ではUPDIで書き込む必要があるattiny202には
書けないことが帰ってから判明。(pickit3も高かったのになあ)
やむなく、後から通信販売でpickit4を購入。

連休中時間があるので、使い慣れないMPLAB X IDE と pickit4 を使って、まずLチカでもと
思ったが結構落とし穴があった。

注意点1
 pickit4はpicに対してはProject Properties-Powerで電力供給が可能だが
avrに対しては、電力供給出来ない(外部から電源供給が必要)

注意点2
 Fuseの設定は avrdude でも面倒だったが、MPLAB X IDEは独特
 Window-TargetMemoryViews-Configuration Bits で 画面を開き、左上部のアイコン
(Read Configuration Bits)をクリックすると、接続している avr から現在の configが読み取れる
 ここで適当に変更(変更しなくても良いけど)して、下部の Generate Source Code to Outputをクリック
 すると、Config Bits Sourceというタブが出来て内部にFuse設定が書き込まれているという段取り。
 これをソースに貼ることになる。

注意点3
 ポートに対する入出力が変わっている。
従来 DDRA = 4 とか PORTA = 4 とかだったが、これだとエラーになる。
 インストール時に出来たファイル
 /opt/microchip/mplabx/v5.45/packs/Microchip/ATtiny_DFP/2.5.116/include/avr/iotn202.h
 を確認すると、どうも違うらしい

 PORTA.DIR = 4 とか PORTA.OUT = 4 とか。(実は IDEが候補を出してくれてたのだが気づかなかった)

注意点4
 1秒の間隔の積りだったが、やけに遅い。(クロックは20MHzのはず)
 https://avr.jp/user/DS/PDF/tiny402.pdf で確認したところ、
デフォールトでは、MCLKCTRLBで、PDIV3=1 PEN=1 結局4分周している。

===最終結果===
/*
* File: main.c
* Author: ishi
*
* Created on 2021/05/04, 22:00
*/
#define F_CPU 20000000UL / 4

#include
#include
#include
#include

FUSES = {
.WDTCFG = 0x00, // WDTCFG {PERIOD=OFF, WINDOW=OFF}
.BODCFG = 0x00, // BODCFG {SLEEP=DIS, ACTIVE=DIS, SAMPFREQ=1KHz, LVL=BODLEVEL0}
.OSCCFG = 0x02, // OSCCFG {FREQSEL=20MHZ, OSCLOCK=CLEAR}
.TCD0CFG = 0x00, // TCD0CFG {CMPA=CLEAR, CMPB=CLEAR, CMPC=CLEAR, CMPD=CLEAR, CMPAEN=CLEAR, CMPBEN=CLEAR, CMPCEN=CLEAR, CMPDEN=CLEAR}
.SYSCFG0 = 0xF6, // SYSCFG0 {EESAVE=CLEAR, RSTPINCFG=UPDI, CRCSRC=NOCRC}
.SYSCFG1 = 0x07, // SYSCFG1 {SUT=64MS}
.APPEND = 0x00, // APPEND {APPEND=User range: 0x0 - 0xFF}
.BOOTEND = 0x00, // BOOTEND {BOOTEND=User range: 0x0 - 0xFF}
};

LOCKBITS = 0xC5; // {LB=NOLOCK}

int main(int argc, char** argv) {
PORTA.DIR = 4; //PA2を出力に設定
while (1) {
PORTA.OUT = 4; //PA2をON
_delay_ms(1000); //1s待つ
PORTA.OUT = 0; //PA2をOFF
_delay_ms(1000); //1s待つ
}
}


最新の画像もっと見る

コメントを投稿