· 

MPLAB X IDEでAVRマイコン開発(1)

AVR派だとふつうはAtmelStudioを使う(ゆるい系だとArduinoを使う)。AtmelStudioでは現物を使わなくてもSimulatorで動作を確認できる。が、ロジックをvs時間で波形で出すことがどうやらできないらしい。レジスタの変化とかをガン見するのもしんどい。でMPLABだとできるらしいって情報をどこかから得たのでやってみる。MPLABでAVRを開発できるようになったのはAtmelがMicrochipに買収されたからだろううなー。

MPLABはMicrochipのページからダウンロードできる。

インストール方法はもうあっちこっちで紹介されているので勝手にググられたい。

今回はWindowsではなくWSLにインストールした。

起動はコマンドラインで

mplab_ide

って入れる。

(ちなみにWindowsにインストールして起動すると後ろに黒い画面が現れる。ってことは、、、)

起動した。

File-->New Project

こういうのが出るので、今回は、Microchip EmbeddedのStandalone ProjectでNext。

今回はTimer1高速PWMについてChatGPTに聞いてみるで生成したコードをベースに動かしてみるので、ATmega328Pを選ぶ。

AVR-GCCを展開してAVR-GCC [v1.00]を選ぶ。

プロジェクトの名前やフォルダを入力。

こうなるので、Source Filesを右クリックして、New--> C Man File ...

こんなのが出るので、File NameをnewmainからmainにしてFinish。

Timer1高速PWMについてChatGPTに聞いてみるで生成したコードがArduino用だったので、setup, loopを使わない書き方にする。で、外部クロックをカウントするように作っていたので、一旦、clkIO/256をカウントするように変更する。でTOP値と比較値を変更する。

/* 
 * File:   main.c
 * Author: hoge
 *
 * Created on June 3, 2023, 11:10 AM
 */

#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
#include <avr/io.h>

int main(int argc, char** argv) {
    // Clear Timer/Counter1 registers
    TCCR1A = 0;
    TCCR1B = 0;

    // Set timer mode and clock source
    TCCR1A |= (1 << COM1A1) | (1 << COM1A0) | (1 << WGM11); // Fast PWM mode, non-inverted output
    TCCR1B |= (1 << WGM13) | (1 << WGM12); // Fast PWM mode, non-inverted output
    //TCCR1B |= (1 << CS12) | (1 << CS11) | (0 << CS10); // External clock source (T1 pin, falling edge)
    TCCR1B |= (1 << CS12) | (0 << CS11) | (0 << CS10); // clkIO/256

    // Set TOP value to 104
    ICR1 = 14;

    // Set compare value to 100 for L output
    OCR1A = 10;

    // Set up OC1A pin as output
    DDRB |= (1 << PB1);
    
    while(1){
        //
    }
    return (EXIT_SUCCESS);
}

まぁ、こうなる。

プロジェクトを右リックしてBuild。

成功したらしい。

テキストエディタの行番号をクリックして(こんな感じになる)、ブレークポイントを設定する。

Debug-->Debug Main Project

こんな感じで、ブレークポイントで止まった状態になる。

Window-->Simulator-->Logic Analyzer

Outputとかがある子ウィンドウの中のタブとして現れる。(Outputとかの子ウィンドウを大きくしている人はあまりいないと思うので、すなわち小さく現れる、ので、大きくする)

とんかちボタンを押して現れるダイアログでPB1を選択してOK。

キーボードでF8を押すかStep Overアイコンを押してプログラムを進める。

34行目まできたら、Step Overだともうどうにも止まらないな状態になる(機械語に変換した際にwhileは別の命令に置き換わっているのかも、、、確認はしない)ので、そこからはStep into(F7)にする。

じゃんじゃん押していると、10500cycくらいでPB1がHになる。

さらにじゃんじゃん押すと、こんな感じでDutyが50%じゃない矩形波が出力されることがわかる。

、、、いいじゃん。ちょー簡単。では、外部入力をカウントするには?Stimulusってやつを使うんだろうけど、続きはまた今度。

 

(最近、こういうツールの使い方を動画でってのが多いけど、そう、作るほうは動画のほうが圧倒的にラク。↑のように、画面キャプチャしてテキストを書いてってするのはマジしんどい。が、動画は見るほうにとっては苦痛。やりながら止めながらやったり、わかっているところはとばしたいけど、どこまでとばしていいかわからんし。)

さて、AVR派としてはPICとかMPLABとか未知の世界だったので、未知との遭遇。思いのほか悪くない。AtmelStudioもMPLABもマニュアルを一切見なくてもある程度は雰囲気で使えちゃう洗練されたインタフェースだけど、ロジックを見れるって点ではMPLABのほうが良い。

ホビーユーザーがマイコンを扱い始めたころはPICのほうが圧倒的に人気だったらしい。そして私もPICでマイコンライフを始めようと思っていた。が、フリーのC言語コンパイラに制限があった(当時)ので、ちょっと不快感あった。そのころ「いますぐPICをやめてAVRに移行すべき10の理由」って記事を見て、おぉーって思って、無制限にフリーな統合開発環境とコンパイラが準備されていて、ライターも個人で手の届かない値段じゃないってことでAVR使いだして、Arduinoでとどめがさされた感じ。今でもどっちがいいかの論争(ARMに席巻された今は荒唐無稽な論争)があるんやろうなー。AtmelがMicrochipに買収されたときは衝撃だったわー。