入門用お勧めPICはPIC16F1827だというようなニュアンスで書いておきながら、作例はいまだにPIC12F675ばっかりだったりする。
そこで、お気に入りの Bit Banging でAD変換値を FT232RL 経由でPC上の Tera Term へ送信する実験を PIC16F1827 でもやっておくことにした。
とはいえ、Bit Banging はその性格上特に変更するところも無く、結局、久しぶりに使った PIC16F1827 のレジスターの設定を思い出せるか否かに尽きる。
思い出せない。
データシート読む。
じたばたする。
なんとかこぎつける。
以下、main.c がこんな感じ。
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 70 71 72 73 74 75 76 77 78 79 80 81 |
#include "Includes.h" #include <xc.h> #include <stdio.h> // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = ON // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = ON // Low-Voltage Programming Enable (Low-voltage programming enabled) #define _XTAL_FREQ 4000000 void doad(void); void interrupt intr(void){ INTCONbits.T0IF = 0; doad(); } void main(){ OSCCONbits.SPLLEN = 0;//4x PLL is disabled OSCCONbits.IRCF = 0b1101;//4 MHz ADCON0bits.CHS = 0b00000;//AN0 is Analog input ADCON0bits.ADON = 1;// A/D converter module is operating ADCON1bits.ADFM = 1;//Right justified ADCON1bits.ADCS = 0b001;//Fosc/8 ADCON1bits.ADNREF = 0;//VREF- is connected to VSS ADCON1bits.ADPREF = 0b11;//VREF+ is connected to internal Fixed Voltage Reference (FVR) module FVRCONbits.FVREN = 1;//Fixed Voltage Reference is enabled FVRCONbits.ADFVR = 0b11;//ADC Fixed Voltage Reference Peripheral output is 4x (4.096V) CM1CON0bits.C1ON = 0;//Comparator 1 is disabledf CM2CON0bits.C2ON = 0;//Comparator 2 is disabledf ANSELAbits.ANSELA = 0b00000001;//RA0 as AN0 OPTION_REGbits.T0CS = 0;//TMR0 Clock Source is Internal OPTION_REGbits.PSA = 0;//Prescaler is assigned to the TIMER0 module OPTION_REGbits.PS = 0b111;// Prescaler 1:256 INTCONbits.GIE = 1;//Global Interrupt Enabled INTCONbits.PEIE = 1;//Peripheral Interrupt Enabled INTCONbits.T0IE = 1;//TMR0 Overflow Interrupt Enabled INTCONbits.T0IF = 0;//TMR0 Overflow Interrupt Flag InitSoftUART();//Intialize Soft UART while(1){ } } void doad(){ unsigned char s[5]; unsigned char i; __delay_us(50); ADCON0bits.CHS = 0b00000;//AN0 is Analog input __delay_us(50); ADCON0bits.GO_nDONE = 1;// ADC start while(ADCON0bits.GO_nDONE){}// ADC waiting sprintf(s, "%d", ADRESH*256+ADRESL); for(i=0;i<4;i++){ UART_Transmit(s[i]); } UART_Transmit(0x0D); UART_Transmit(0x0A); } |
Includes.h と Software_UART.c には変更なし。
Software_UART.h の以下の部分だけ変更あり。
1 2 3 4 |
#define UART_RX RA1 //UART RX pin #define UART_TX RA2 //UART TX pin #define UART_RX_DIR TRISAbits.TRISA1//UART RX pin direction register #define UART_TX_DIR TRISAbits.TRISA2//UART TX pin direction register |
使うピンはAD変換用が17ピン(RA0/AN0)で、通信用が18ピン(RA1)と1ピン(RA2)だ。
これらのピンを選んだ理由は単純にアルファベット順で3本というだけ。
ブレッド上の回路は実に単純なものなので、回路図は無い。
ちなみに、ここに載せたコードではPIC16F1827は4MHzで駆動させ、ボーレートは1200baudに設定してある。
試しに8MHzでPLLを利かせて8×4の32MHzで駆動したら、19200baudまでは問題なく送信が確認できた。
その場合の変更点は、main.c では
OSCCONbits.SPLLEN = 1;//4x PLL is enabled
OSCCONbits.IRCF = 0b1110;//8 MHz
そして、Software_UART.h では
#define Baudrate 19200//baud
の合計3行だ。
後出しだが、Bit Banging のオリジナルはPIC12F675用のもので、参考にしたのはhttp://saeedsolutions.blogspot.jp/2012/07/pic12f675-software-uart-bit-banging.htmlで、もらってきたものだ。
くどいようだが、「Bit Banging で UART」のいいところは、他のどの機能も無駄にせずに、
Includes.h
Software_UART.c
をプロジェクトに追加するだけで、あとは UART_Transmit(); をぶっこんどけば、PC上でデバッグ・モニターもどきが構築できる点だ。
しかも使うピンは実質1本だけ。
唯一の出費となるFT232RLモジュールも、海外通販で買えば400円以下だ。
最近Banggoodで買った(2014/8/22 $3.98)お勧めはこれ。
この手を使うようになってから、過去にデバッグ用に用意したLCDとかは完全にホコリをかぶっている。