秋月でPIC10F200が60円、PIC10F322が55円という逆転現象が起きている。
少しも珍しいことではない。
PIC10F222も、10+1の在庫が無くなったら値上げされるんだろう。
要らないDIPを計算に入れないと1個あたり50円なので、それなら55円のPIC10F322の方がいいかもと思う。
PIC10F322の取り扱いはまだ最近の事だから当分は55円のままだろう。
そもそも、まずは「米粒PIC」という魅惑の言葉につられてPIC10F222を買うわけだが、当時はPIC10F322は取り扱いが無かった。
しばらくして、「でも、割り込みくらいは欲しいよな」と思っている鼻先に、PIC10F322の取り扱い開始がぶら下がるという絶妙なタイミングで、結局PIC10F322も買った。
そのうち、UARTもI2CもBit Bangingで実装できるようになり、意外にもPIC10F222がそこそこ使えるやつだとなり、気がつけば、チップ別実戦投入数ではPIC10F222がダントツだったりする。
ところで、PIC10F322は私にとっては見慣れないちょっと変わった機能が載っているPICだ。
ロジックとかモーター制御とかに関連した機能のようだが、ここでは触れない(というか分からないから触れられない)。
いずれ「新しい周辺モジュールのヒントとコツ」http://www.microchip.com/mymicrochip/filehandler.aspx?ddocname=jp557841でも読んで勉強することにしよう。
そして、そういうもろもろを無頓着に放置して、やはりまずはLチカだ。
PIC10F222のコードを持ってきて、ポート名をRAに変えただけでそのまま動いたのでちょっと拍子抜け。
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 |
#include <xc.h> // CONFIG #pragma config FOSC = INTOSC // Oscillator Selection bits (INTOSC oscillator: CLKIN function disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #pragma config LPBOR = ON // Brown-out Reset Selection bits (BOR enabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #define _XTAL_FREQ 8000000 int main(void) { TRISA = 0b000;//Output ANSELA = 0b000;//for Digital I/O while(1){ RA0 = 1; __delay_ms(700); RA0 = 0; RA1 = 1; __delay_ms(700); RA1 = 0; RA2 = 1; __delay_ms(700); RA2 = 0; RA1 = 1; __delay_ms(700); RA1 = 0; } } |
RA0からRA2につないだ3つのLEDを順に点滅させるだけのプログラムなので、もちろん回路図は無い。
1つだけTimer0の割り込みで点滅するコードも書いてみた。
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 |
#include <xc.h> // CONFIG #pragma config FOSC = INTOSC // Oscillator Selection bits (INTOSC oscillator: CLKIN function disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD) #pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) #pragma config LPBOR = OFF // Brown-out Reset Selection bits (BOR disabled) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #define _XTAL_FREQ 16000000 unsigned char cnt; void interrupt intr(void) { INTCONbits.TMR0IF = 0;//Timer0 Overflow Interrupt Flag Clear cnt--; if(cnt==0){ RA2 = ~RA2; cnt = 10; } } int main(void) { TRISA = 0b000;//Output ANSELA = 0b000;//for Digital I/O OSCCONbits.IRCF = 0b111;//16MHz OPTION_REGbits.PSA = 0;//Prescaler is assigned to the Timer0 module OPTION_REGbits.PS = 111;//1:256 OPTION_REGbits.T0CS = 0;//TMR0 Clock Source is Internal instruction cycle clock (FOSC/4) INTCONbits.GIE = 1;//Global Interrupt Enabled INTCONbits.PEIE = 1;//Peripheral Interrupt Enabled INTCONbits.TMR0IE = 1;//Timer0 Overflow Interrupt Enabled INTCONbits.TMR0IF = 0;//Timer0 Overflow Interrupt Flag Clear cnt = 10; while(1){ RA0 = 1; __delay_ms(300); RA1 = 1; __delay_ms(300); RA0 = 0; __delay_ms(300); RA1 = 0; __delay_ms(300); } } |
OPTION_REGbits.PSA = 0;//Prescaler is assigned to the Timer0 module
を忘れていて、点滅が速すぎる理由が分からず悩んだ。
初期設定ではプリスケーラが効かないようになっている。