HOME >> LED電子工作集 > PICマイコンとC言語の勉強 P-1 Lチカ 点滅
■ はじめに
今、PICマイコンとC言語の勉強に挑戦している。 そのいきさつは、鉄道模型工作実験室 の別室ブログ 「レイアウトに速度計を設置しよう」 ( 2019/2/22 )にて紹介しているので参照ください。
その第一歩として、Lチカから勉強を始めたので忘備録として記録しておこう。
.
.
■ PICマイコンとC言語の勉強環境
まず、小生の勉強環境を紹介しておく。
PICマイコンについては、分散式ATSシステムの制御マイコンとしてアッセンブラを使ってきている。 このアッセンブラ用の使用環境はノートパソコンを使ったが、今回は最新ソフトのMPLAB x のために画面の大きなデスクトップパソコンを使用した。 OSがメンテ対象外となっているのでスタンドアロンで使用しているパソコンだ。 ここで幾らバグっても他のソフトには影響が少ないので安心して勉強できるのである。
/*************************************************** * PIC-Lesson その1 * 2019/2/20 **************************************************/ #include<htc.h> #pragma config FOSC = INTOSCIO // Oscillator Selection bits #pragma config WDTE = OFF // Watchdog Timer Enable bit #pragma config PWRTE = ON // Power-up Timer Enable bit #pragma config MCLRE = OFF // MCLR Pin Function Select bit #pragma config CP = OFF // Code Protection bit #pragma config CPD = OFF // Data Code Protection bit #pragma config BOREN = OFF // Brown Out Detect #pragma config IESO = OFF // Internal External Switchover bit #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit #include <xc.h> #define _XTAL_FREQ 8000000 #define __delay(x) _delay((unsigned long)((x))) #define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL))) #define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL))) void main() { OSCCON = 0x70; ANSEL = 0x00; CMCON0 = 0x07; TRISIO = 0x28; while (1) { GP2 = 1; GP4 = 1; __delay_ms(300); GP2 = 0; GP4 = 0; __delay_ms(300); } }
■ P-1 Lチカ 点滅の回路
参考にした回路とプログラムは、マツルのWEBサイトの資料・技術情報 サイトの中の、「初めてのPICマイコン」である。 これは、使用する石が手持ちのPIC12F683 を使用していたからである。 Lチカを勉強するにはもってこいの教則本と考えたからである。
回路図を下に示す。
ブレッドボード上の配線した状態を下に示す。
■ つまずき その1
最初につまずいたのは、MPLAB X をインストールして、ファイルの新設などの操作の段階で発生した。
それは、指定されたパスがみつkりませんとのメッセージに現れているように、フォルダやファイルの取り扱い方であった。 その顛末は、「MPLABの恐ろしい底なし沼にはまり込んでいる」 にて紹介済みなのでこちらを参照下さい。 そして同じく「MPLAB 不具合の原因が分かったぞ」にて解決した。
■ つまずき その2
パスの問題が解決して、ファイル等が付けるようになり、サイトに示されたプログラム内容を打ち込んでコンパイルを実施したが、なかなかOK が出なかった。 エラーは、__delay_ms の部分で発生していた。
原因となるヒントを探してWEB 上で見つける事が出来た。 ソフトのバージョンによっては発生する問題とのことで、上記のプログラム中に記載した
#define __delay(x) _delay((unsigned long)((x)))
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000000UL)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000UL)))
なるおまじないを追加すると良いとのことであった。 「そこに部品があるから」さんのサイトを参考にさせて頂いた。 XC8 と delay のキーワードで検索をかけるとその苦労話しとヒントが出てきます。
■ 結果
どうにかコンパイルが通るようになったので、ブレッドボードにセットしてプログラムを走らせてみた。
今回のトラブルにおいてWEBのあちこちを探し回った結果、使用環境の違いによって参考になる事も参考にならず、ちょっとした違いでうまく行かないことが多々ある事を痛感した。 OSの違い(win? mac? linux?)、MPLAB、MPLAB X ? HI-TECH 、XC8? バージョンは?・・等々。 やはり Cは難しい!