米粒PIC PIC10F222 でAD変換した値を FT232RLモジュールから PC へ送る。
PIC10F222 は UART の機能を持ってないので、Bit Banging で行う。
参考にしたのは、もう幾度も登場しているhttp://saeedsolutions.blogspot.jp/2012/07/pic12f675-software-uart-bit-banging.htmlだ。
もらってきたコードは PIC12F675用なので、手直しして使う。
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 |
#include <xc.h> #include "Includes.h" // CONFIG #pragma config IOSCFS = 8MHZ // Internal Oscillator Frequency Select bit (8 MHz) #pragma config MCPU = OFF // Master Clear Pull-up Enable bit (Pull-up disabled) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config CP = OFF // Code protection bit (Code protection off) #pragma config MCLRE = OFF // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #define _XTAL_FREQ 8000000 void doad(void); void main(){ OSCCALbits.FOSC4 = 0;//GP2/T0CKI applied to GP2 OPTION = 0b00000000;//Timer0 Clock Source is not T0CKI ADCON0bits.ANS1 = 0;//GP1/AN1 is digital I/O ADCON0bits.ANS0 = 1;//GP0/AN0 is analog input ADCON0bits.CHS = 0b00;//AN0 is Analog input ADCON0bits.ADON = 1;// A/D converter module is ON InitSoftUART();//Intialize Soft UART while(1){ __delay_ms(500); doad(); } } void doad(){ __delay_us(50); ADCON0bits.CHS = 0b00;//AN0 is Analog input __delay_us(50); ADCON0bits.GO_nDONE = 1;//ADC start while(ADCON0bits.GO_nDONE){}//ADC waiting UART_Transmit(ADRES); } |
OPTION = 0b00000000;//Timer0 Clock Source is not T0CKI
は、T0CSだけを設定すれば良いので
OPTION_REGbits.T0CS = 0b0;
という風に書きたいところだが、エラーが出る。
ビットごとの設定は出来ないのか?
でも
ADCON0bits.ANS1 = 0;
はエラーが出ない。
それとは無関係に、忘れててちょっと迷った原因が
OSCCALbits.FOSC4 = 0;//GP2/T0CKI applied to GP2
を書かなかったことだ。
ちょうどGP2をデータの出力用に使ったので、うんともすんとも言わずに悩んだ。
GP2 は FOSC4 と T0CKI の2つを設定しないと Digital I/O としては使えない。
また、出力用に sprintf を書くとメモリーが足りなくなるので、データはただ垂れ流すだけにした。
あと、Software_UART.c の入力か出力かを決める部分は以下のようにした。
TRISGPIObits.hogehoge とやりたいところだが、これもエラーが出るからだ。
1 2 3 4 5 6 7 8 |
void InitSoftUART(void)//Initialize UART pins to proper values { // UART_TX = 1;//TX pin is high in idle state // UART_RX_DIR = 1;//Input // UART_TX_DIR = 0;//Output TRISGPIO = 0b11111011; } |
Tweet