PIC18F4550を使ってLEDを光らせる
2017/03/04


まずは新しいパソコンにマイクロチップ社の開発環境を構築する。

下記のマイクロチップ社のHPに行き、「製品情報」−>「開発ツール」−>「MPLAB X IDE」と進む。

http://www.microchip.co.jp/

英語のHPが表示され、ページの下の方に「Download」があり、Windows用とかLinax用とかMac用があるので、自分の環境に会ったものをダウンロードして実行する。

続いて同じようにして「製品情報」−>「開発ツール」−>「コンパイラー」と進む。
これまた同じように英語のHPの下のDownloadにXC8、XC16、XC32があるので、みんなダウンロードして実行してしまう。
今回必要なのはXC8だけなのだが、他のものも何時か使うかもしれないし、そもそもどうせタダなので遠慮なく頂く。



さて、インストールが出来たら、早速テストをやってみる。

回路としてはこんなもので、ごく簡単なものである。
ブレッドボードという実験用の基板の上に、秋月電子で出している「PIC18F4550 USBマイコンボード 完成品」というのを乗せて開発する。
このボードは、20MHzの水晶発振器もついており、すぐにパソコンのUSBと繋げられるので、なかなか便利なのである。

※当面はUSBを使用しなさそうなので、「PIC18F4550 USBマイコンボード 完成品」を使うのは止め、PIC18F4550そのものに水晶発振器(20MHz)を付けて使用することにした。

test_pgm001
ほんとうはもっと高度なことをやっている回路とプログラムをいきなり作ったのだが、全くもってうまく動かなかったのである。

そこで、アヤシイところをだんだん削っていってバグを発見しようとしたら、いつの間にやらこんな初歩的なものにまで縮小してしまったのである。

我ながらお粗末というか、おバカと言うか、散々な結果だったのである。
トホホ!!


そして、プログラムはこんなもので、ごく簡単に二つのLEDが交互に点滅するだけのテストである。


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

// コンフィギュレーション pic18f4550  c18
#pragma config PLLDIV = 5, CPUDIV = OSC1_PLL2, USBDIV = 2
#pragma config FOSC = HSPLL_HS, FCMEN = OFF, IESO = OFF
#pragma config PWRT = ON, BOR = OFF, BORV = 0
#pragma config VREGEN = ON, WDT = OFF, WDTPS = 1
#pragma config CCP2MX = OFF, PBADEN = OFF, LPT1OSC = OFF
#pragma config MCLRE = OFF, STVREN = OFF, LVP = OFF
#pragma config ICPRT = OFF, XINST = OFF, DEBUG = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTC = OFF, WRTB = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF, EBTRB = OFF

/*
 * 
 */
int main(int argc, char** argv) {

    TRISA = 0b00000000;			// PORTA output

    int i = 0;
    int j = 0;

    while(1){

        PORTAbits.RA0 = 1;
        PORTAbits.RA1 = 0;
        for(i=0;i<1000;i++) {       // 1ms分のディレイになっている
            for(j=0;j<500;j++);     // 0.5s
        }
        PORTAbits.RA0 = 0;
        PORTAbits.RA1 = 1;
        for(i=0;i<1000;i++) {       // 1ms分のディレイになっている
            for(j=0;j<500;j++);     // 0.5s
        }
    }

    return (EXIT_SUCCESS);
}

ところがこんな簡単な回路とプログラムなのに、なんだか変な動きをするのである。

PORTAbits.RA1のLEDしか点滅をしないのである。
・・・・そんなバカな!!と、オシロスコープで見てみると、なんとも以下のような波形が出ているのである。

test_pgm002
ポートのRA0からは、ナント!!、100ナノ秒のパルスが出ているだけなのである。

しかも、RA1の立下りのときに出ているのである。
いったいどうしたものであろうか?

どう見てもプログラムがおかしいわけではないので、とうとうポートではなくラッチの方にデータを送ってみることにした。
PORTAbits.RAXというコードをLATAbits.LAXに変更しただけである。


    while(1){

        LATAbits.LA0 = 1;
        LATAbits.LA1 = 0;
        for(i=0;i<1000;i++) {       // 1ms分のディレイになっている
            for(j=0;j<500;j++);     // 0.5s
        }
        LATAbits.LA0 = 0;
        LATAbits.LA1 = 1;
        for(i=0;i<1000;i++) {       // 1ms分のディレイになっている
            for(j=0;j<500;j++);     // 0.5s
        }

test_pgm003
こんどはちゃんとRA0とRA1が交互に反転した信号が出てくる。
時間軸は200ミリ秒で、0.5秒ずつとなり、意図した結果になっている。


こういう状態になったときには、やはりオシロスコープがあるのと無いのとでは天と地くらいの違いが出るのである。

私は何年か前に、とある測定器屋さんが大安売りのキャンペーンをやっていたのを見て購入したのである。
ネットで評判を見ると、やはり専門家からすると「オモチャ」というレベルらしいのだが、まぁ私がやっていること事態がオモチャにもならないレベルなので十分という感じである。


それにしても、たかがLEDを点滅される程度のことで悩んでしまい、出だしからちょっと訳のわからない状態で、なんだか前途多難といった雰囲気である。


HOME