PIC18F46J50 でLチカを試す。
今回は、変換基板にL字型のピンヘッダを取り付けてみた。
ICの周りを取り囲んで立ちふさがる感じのピンソケットと違って、ピンヘッダは風通しがいい感じだし見通しはいい。
しかし、何をするにも指がピンに触れてしまうという、あまり好ましくない状態になった。
見た目はこっちの方が好みだけどな。
次からはやはりピンソケットにしよう。
裏はこんな感じに配線してある。
使ったのは太さ0.26mmのポリウレタン線だ。
長さ数ミリでは作業が細かくて、これだけ配線するのもなかなか骨が折れる。
出来合いの変換基板を使わずに、自分でプリント基板を作った方が結局は楽かもしれないと思った。
とりあえず、接続チェックもかねてLEDを1つ点灯させてみる。
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 56 57 58 59 |
// PIC18LF46J50 Configuration Bit Settings // 'C' source line config statements #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1L #pragma config WDTEN = OFF // Watchdog Timer (Disabled - Controlled by SWDTEN bit) #pragma config PLLDIV = 12 // PLL Prescaler Selection bits (Divide by 12 (48 MHz oscillator input)) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset (Disabled) #pragma config XINST = ON // Extended Instruction Set (Enabled) // CONFIG1H #pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide) #pragma config CP0 = OFF // Code Protect (Program memory is not code-protected) // CONFIG2L #pragma config OSC = INTOSCPLL // Oscillator (INTOSCPLL) #pragma config T1DIG = OFF // T1OSCEN Enforcement (Secondary Oscillator clock source may not be selected) #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator (High-power operation) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled) #pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled) // CONFIG2H #pragma config WDTPS = 32768 // Watchdog Postscaler (1:32768) // CONFIG3L #pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC) #pragma config RTCOSC = INTOSCREF// RTCC Clock Select (RTCC uses INTRC) #pragma config DSBOREN = ON // Deep Sleep BOR (Enabled) #pragma config DSWDTEN = ON // Deep Sleep Watchdog Timer (Enabled) #pragma config DSWDTPS = G2 // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days)) // CONFIG3H #pragma config IOL1WAY = ON // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once) #pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode) // CONFIG4L #pragma config WPFP = PAGE_63 // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 63) #pragma config WPEND = PAGE_WPFP// Write/Erase Protect Region Select (valid when WPDIS = 0) (Page WPFP<5:0> through Configuration Words erase/write protected) #pragma config WPCFG = OFF // Write/Erase Protect Configuration Region (Configuration Words page not erase/write-protected) // CONFIG4H #pragma config WPDIS = OFF // Write Protect Disable bit (WPFP<5:0>/WPEND region ignored) #define _XTAL_FREQ 48000000 void main(void){ OSCCONbits.IRCF = 0x110;//4MHz TRISAbits.TRISA0 = 0;//RA0 is Output ANCON0bits.PCFG0 = 1;//RA0 is Digital Port while(1){ PORTAbits.RA0 = ~PORTAbits.RA0; __delay_ms(10); } } |
例によって、プログラム本体よりConfiguration Bitsの分量の方が多いということになる。
予定では点灯しっぱなし(肉眼では点滅しているのがわからない)のはずが、細かく点滅している様子が分かる。
つまり、数10Hz程度以下の点滅周期ということだ。
案の定、測定してみたら25Hzだった。
プログラム内では__delay_ms(10);と指定しているので、100Hzで点滅を繰り返し、周期としては50Hzのはずだ。
#define _XTAL_FREQ 48000000
と書いてあるのに半分の周期になったということは、実際には24MHzで動いてるってことになる。
適当に設定したどこかに問題があるのだろう。
以下、悩んだ挙句に2・3日放置後の追記
問題は設定ではなく、MCLRピンのプルアップを忘れていたことだった。
少ピンのPICは貴重なPINをMCLR専用にしないでせめてInputにも使おうということで、Configuration Bitsの設定でMCLRをDisabledにする(Inputとして使う)ことが出来るようになっている。
この場合、MCLRのPINは何も接続しなくても特に問題は起きない(ホントはいけないんだろうけど)。
多ピンのPICはピン数に余裕があるので、MCLRはそれ専用のピンとなっている。
専用なのでInputとして使うことは無く、当然Configuration Bitsの設定にMCLRをDisabledにする項目は無い。
無いのに今までの癖で設定した気になっていて、当然プルアップもしてない。
というよりMCLRのICSP時の役割以外をそもそもほとんど意識していない。
で、思ったように動かない。
気を取り直して、PORTBにつないだLEDを約1秒間隔で点滅させるプログラム
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
// PIC18LF46J50 Configuration Bit Settings // 'C' source line config statements #include <xc.h> // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. // CONFIG1L #pragma config WDTEN = OFF // Watchdog Timer (Disabled - Controlled by SWDTEN bit) #pragma config PLLDIV = 1 // PLL Prescaler Selection bits (No prescale (4 MHz oscillator input drives PLL directly)) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset (Disabled) #pragma config XINST = ON // Extended Instruction Set (Enabled) // CONFIG1H #pragma config CPUDIV = OSC1 // CPU System Clock Postscaler (No CPU system clock divide) #pragma config CP0 = OFF // Code Protect (Program memory is not code-protected) // CONFIG2L #pragma config OSC = INTOSC // Oscillator (INTOSC) #pragma config T1DIG = OFF // T1OSCEN Enforcement (Secondary Oscillator clock source may not be selected) #pragma config LPT1OSC = OFF // Low-Power Timer1 Oscillator (High-power operation) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor (Disabled) #pragma config IESO = OFF // Internal External Oscillator Switch Over Mode (Disabled) // CONFIG2H #pragma config WDTPS = 32768 // Watchdog Postscaler (1:32768) // CONFIG3L #pragma config DSWDTOSC = INTOSCREF// DSWDT Clock Select (DSWDT uses INTRC) #pragma config RTCOSC = INTOSCREF// RTCC Clock Select (RTCC uses INTRC) #pragma config DSBOREN = OFF // Deep Sleep BOR (Disabled) #pragma config DSWDTEN = OFF // Deep Sleep Watchdog Timer (Disabled) #pragma config DSWDTPS = G2 // Deep Sleep Watchdog Postscaler (1:2,147,483,648 (25.7 days)) // CONFIG3H #pragma config IOL1WAY = ON // IOLOCK One-Way Set Enable bit (The IOLOCK bit (PPSCON<0>) can be set once) #pragma config MSSP7B_EN = MSK7 // MSSP address masking (7 Bit address masking mode) // CONFIG4L #pragma config WPFP = PAGE_63 // Write/Erase Protect Page Start/End Location (Write Protect Program Flash Page 63) #pragma config WPEND = PAGE_WPFP// Write/Erase Protect Region Select (valid when WPDIS = 0) (Page WPFP<5:0> through Configuration Words erase/write protected) #pragma config WPCFG = OFF // Write/Erase Protect Configuration Region (Configuration Words page not erase/write-protected) // CONFIG4H #pragma config WPDIS = OFF // Write Protect Disable bit (WPFP<5:0>/WPEND region ignored) #define _XTAL_FREQ 8000000 void delay(unsigned char cnt){ unsigned char i; for(i=0; i<cnt; i++){ __delay_ms(10); } } void main(void){ OSCCONbits.SCS = 0b11;//System Clock is Postscaled internal clock (INTRC/INTOSC derived) OSCCONbits.IRCF = 0b111;//8MHz TRISB = 0;//PORTB is Output ANCON0 = 0b1111111;//PORTB is Digital Port while(1){ LATB = 0b11111111; delay(100); LATB = 0; delay(100); } } |
MCLRをプルアップして今度は問題なく動いている。
MCLR専用PINのプルアップは省略できない。
Datasheetによれば、
If programming and debugging are not required in the end application, a direct connection to VDD may be all that is required.
とあるので、プログラムが終われば単にVddへつないどけばいいようだ。
プログラムやデバッグの際はコンデンサが必要で、下の図のようにジャンパーでも付けて、実行時には外しなさいとある。
面倒だなと思って抵抗を付けてプルアップだけにしてあるが、プログラム時にも特に支障は無いようだ。
抵抗無しのVdd直結だと「Target Device ID (0x0) does not match expected Device ID (0x4d60).」と出て書き込めない。