自力でというのはサンプルそのままでなく、データシートだけを頼りにやってみようということだ。
当然やるのはLEDチカチカ、通称「Lチカ」だ。
その前に以前やったサンプルをもう一度動作確認のために動かしておくことにする。
さらにその前にXC32が1.33になっていたのでIDEもその他のコンパイラーも含めてバージョン・アップしておく。
で、あらためて、
C:¥Program Files (x86)\Microchip¥xc32¥v1.31¥examples¥plib_examples¥timer
にある timer1_int というサンプルを実行してみようとして Build すると、何だかえらいたくさんのエラーだか警告だかが表示されてから完了する。
以前は無かったことだ。
で、
The PLIB functions and macros in this file will be removed from the MPLAB XC32 C/C++ Compiler in future releases
と書いてある。
「このファイル内のPLIB関数やマクロは、将来のリリースでは MPLAB XC32のC/C++ コンパイラから除かれます。」
確かに
#include <plib.h>
という一行があって、plib.h というヘッダファイルはPIC32を使う前は見たことが無かったものだ。
そもそも、このサンプル自体が plib_example の中に含まれているものだ。
PLIB function というものが絡んでいることは分かる。
で、#include <plib.h>をコメント・アウトしてみると、一気に赤線を引かれる部分が増えるので、この今まで見かけたことの無い記述がPLIB function やら マクロなんだろうなとわかる。
前回、これ覚えなおさなきゃいかんのかいなと思って放置していたものだが、将来は無くなるとのことだ。
無くなってどうなるのかは分からないが、無理に解読する必要も無いような感じがするので、分かる範囲で従来どおりの記述方法でLチカをやってみることにした。
RD0につないだLEDが点滅するだけのものだが、Configuration Word が大部分を占めるという上位チップでのLチカではありがちな状況にはなる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
#include <xc.h> // DEVCFG3 // USERID = No Setting #pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority Select (SRS Priority 7) #pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration) #pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration) #pragma config FUSBIDIO = ON // USB USID Selection (Controlled by the USB Module) #pragma config FVBUSONIO = ON // USB VBUS ON Selection (Controlled by USB Module) // DEVCFG2 #pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) #pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) #pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider (12x Divider) #pragma config UPLLEN = OFF // USB PLL Enable (Disabled and Bypassed) #pragma config FPLLODIV = DIV_1 // System PLL Output Clock Divider (PLL Divide by 1) // DEVCFG1 #pragma config FNOSC = PRIPLL // Oscillator Selection Bits (Primary Osc w/PLL (XT+,HS+,EC+PLL)) #pragma config FSOSCEN = ON // Secondary Oscillator Enable (Enabled) #pragma config IESO = ON // Internal/External Switch Over (Enabled) #pragma config POSCMOD = HS // Primary Oscillator Configuration (HS osc mode) #pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled) #pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8) #pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) #pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) #pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) #pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) #pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window Size is 25%) // DEVCFG0 #pragma config DEBUG = OFF // Background Debugger Enable (Debugger is Disabled) #pragma config JTAGEN = ON // JTAG Enable (JTAG Port Enabled) #pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) #pragma config PWP = OFF // Program Flash Write Protect (Disable) #pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) #pragma config CP = OFF // Code Protect (Protection Disabled) int main(void){ unsigned char i, j; TRISDbits.TRISD0 = 0;//PORTD RD0 for output while(1){ PORTDbits.RD0 = 0; for(i=0; i<255; i++){ for(j=0; j<255; j++){ } } PORTDbits.RD0 = 1; for(i=0; i<255; i++){ for(j=0; j<255; j++){ } } } } |
待ち時間もfor文のループなので、全くの適当だ。
次は、前回せっかく8つLEDが載ってる基板を作ったので全部光らそうというわけで、一方からもう一方へLEDが流れるように点灯する例だ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#include <xc.h> // DEVCFG3 // USERID = No Setting #pragma config FSRSSEL = PRIORITY_7 // Shadow Register Set Priority Select (SRS Priority 7) #pragma config PMDL1WAY = ON // Peripheral Module Disable Configuration (Allow only one reconfiguration) #pragma config IOL1WAY = ON // Peripheral Pin Select Configuration (Allow only one reconfiguration) #pragma config FUSBIDIO = ON // USB USID Selection (Controlled by the USB Module) #pragma config FVBUSONIO = ON // USB VBUS ON Selection (Controlled by USB Module) // DEVCFG2 #pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider) #pragma config FPLLMUL = MUL_20 // PLL Multiplier (20x Multiplier) #pragma config UPLLIDIV = DIV_12 // USB PLL Input Divider (12x Divider) #pragma config UPLLEN = OFF // USB PLL Enable (Disabled and Bypassed) #pragma config FPLLODIV = DIV_1 // System PLL Output Clock Divider (PLL Divide by 1) // DEVCFG1 #pragma config FNOSC = PRIPLL // Oscillator Selection Bits (Primary Osc w/PLL (XT+,HS+,EC+PLL)) #pragma config FSOSCEN = ON // Secondary Oscillator Enable (Enabled) #pragma config IESO = ON // Internal/External Switch Over (Enabled) #pragma config POSCMOD = HS // Primary Oscillator Configuration (HS osc mode) #pragma config OSCIOFNC = OFF // CLKO Output Signal Active on the OSCO Pin (Disabled) #pragma config FPBDIV = DIV_8 // Peripheral Clock Divisor (Pb_Clk is Sys_Clk/8) #pragma config FCKSM = CSDCMD // Clock Switching and Monitor Selection (Clock Switch Disable, FSCM Disabled) #pragma config WDTPS = PS1048576 // Watchdog Timer Postscaler (1:1048576) #pragma config WINDIS = OFF // Watchdog Timer Window Enable (Watchdog Timer is in Non-Window Mode) #pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls)) #pragma config FWDTWINSZ = WINSZ_25 // Watchdog Timer Window Size (Window Size is 25%) // DEVCFG0 #pragma config DEBUG = OFF // Background Debugger Enable (Debugger is Disabled) #pragma config JTAGEN = ON // JTAG Enable (JTAG Port Enabled) #pragma config ICESEL = ICS_PGx1 // ICE/ICD Comm Channel Select (Communicate on PGEC1/PGED1) #pragma config PWP = OFF // Program Flash Write Protect (Disable) #pragma config BWP = OFF // Boot Flash Write Protect bit (Protection Disabled) #pragma config CP = OFF // Code Protect (Protection Disabled) int main(void){ unsigned char i, j, k; ANSELD = 0;//PORTD for Digital I/O TRISD = 0;//PORTD for Output while(1){ k++; if(k>8) k = 0; PORTD = 1<<k; for(i=0; i<255; i++){ for(j=0; j<20; j++){ } } } } |
アナログ用途にも使えるピンが入るので、お決まりのANSELD、そしてもちろんTRISDも設定する。
時間稼ぎは相変わらず適当なfor文ループ。