Created
November 22, 2015 08:03
-
-
Save amutake/b07c9c678fff32583855 to your computer and use it in GitHub Desktop.
PIC16F1827 で Analog In の値をシリアル通信で送ってくれるやつ
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* File: main.c | |
* Author: amutake | |
* | |
* Created on November 22, 2015, 1:43 PM | |
* | |
* シリアル通信で、なんかデータ (char 型) を送ると Analog In の値を送り返してくる。 | |
* 使うピンは以下の通り | |
* | |
* RB1: RX | |
* RB2: TX | |
* RB3: Analog In | |
*/ | |
#include <xc.h> | |
#include <stdio.h> | |
#define _XTAL_FREQ 8000000 // 8MHz | |
// コンフィギュレーション1の設定 | |
#pragma config FOSC = INTOSC // 内部クロックを使用する(INTOSC) | |
#pragma config WDTE = OFF // ウオッチドッグタイマー無し(OFF) | |
#pragma config PWRTE = ON // 電源ONから64ms後にプログラムを開始する(ON) | |
#pragma config MCLRE = OFF // 外部リセット信号は使用せずにデジタル入力(RA5)ピンとする(OFF) | |
#pragma config CP = OFF // プログラムメモリーを保護しない(OFF) | |
#pragma config CPD = OFF // データメモリーを保護しない(OFF) | |
#pragma config BOREN = ON // 電源電圧降下常時監視機能ON(ON) | |
#pragma config CLKOUTEN = OFF // CLKOUTピンをRA6ピンで使用する(OFF) | |
#pragma config IESO = OFF // 外部・内部クロックの切替えでの起動はなし(OFF) | |
#pragma config FCMEN = OFF // 外部クロック監視しない(FCMEN_OFF) | |
// コンフィギュレーション2の設定 | |
#pragma config WRT = OFF // Flashメモリーを保護しない(OFF) | |
#pragma config PLLEN = OFF // 動作クロックを32MHzでは動作させない(OFF) | |
#pragma config STVREN = ON // スタックがオーバフローやアンダーフローしたらリセットをする(ON) | |
#pragma config BORV = HI // 電源電圧降下常時監視電圧(2.5V)設定(HI) | |
#pragma config LVP = OFF // 低電圧プログラミング機能使用しない(OFF) | |
volatile char RXBUFF; | |
volatile short RXSET; | |
void interrupt isr() { | |
if (RCIF == 1) { | |
RXBUFF = RCREG; | |
RXSET = 1; | |
RCIF = 0; | |
} | |
} | |
char wait_recv() { | |
while (RXSET == 0); | |
char c = RXBUFF; | |
RXSET = 0; | |
return c; | |
} | |
void send_char(char c) { | |
while (TXIF == 0) { | |
// wait... | |
} | |
TXREG = c; | |
} | |
void send_line(char str[]) { | |
for (short i = 0; str[i] != '\0'; i++) { | |
send_char(str[i]); | |
} | |
send_char('\n'); | |
} | |
unsigned int adconv() { | |
unsigned int temp; | |
GO_nDONE = 1; // アナログ値読取り開始指示 | |
while (GO_nDONE); // 読取り完了まで待つ | |
temp = ADRESH; // ADRESH と ADRESL に入るらしい | |
temp = (temp << 8) | ADRESL; // 何やってるのかわからない | |
return temp; | |
} | |
void loop() { | |
wait_recv(); | |
unsigned int v = adconv(); | |
char str[10]; | |
sprintf(str, "%d", v); | |
send_line(str); | |
} | |
// reference: http://www.geocities.jp/zattouka/GarageHouse/micon/USART/USART.htm | |
void main(void) { | |
// general settings | |
OSCCON = 0b01110010; | |
ANSELA = 0b00000000; // RA0-RA7, アナログにするかどうか | |
ANSELB = 0b00001000; // RB0-RB7, アナログにするかどうか (RB3) | |
TRISA = 0b00000000; // ピン(RA)は全て出力に割当てる | |
TRISB = 0b00001010; // ピン(RB)は全て出力に割当てる | |
PORTA = 0b00000000; // RA出力ピンの初期化(全てLOWにする) | |
PORTB = 0b00000000; // RB出力ピンの初期化(全てLOWにする) | |
// A/D converter settings | |
ADCON1 = 0b10010000; // 読取値は右寄せ、A/D変換クロックはFOSC/8、VDDをリファレンスとする | |
ADCON0 = 0b00100101; // アナログ変換情報設定(AN9から読込む) | |
__delay_us(5); // アナログ変換情報が設定されるまでとりあえず待つ | |
// serial communication settings | |
TXSTA = 0b00100100; | |
RCSTA = 0b10010000; | |
TXCKSEL = 0; // pin8 as TX | |
RXDTSEL = 0; // pin7 as RX | |
SPBRG = 51; // 9600 | |
RCIF = 0; | |
RCIE = 1; // receive interruption enabled | |
PEIE = 1 ; // peripheral interruption enabled | |
GIE = 1; // global interruption enabled | |
RXSET = 0; // データ受信フラグのリセット | |
while (1) { | |
loop(); | |
} | |
return; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment