Skip to content

Instantly share code, notes, and snippets.

@amutake
Created November 22, 2015 08:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save amutake/b07c9c678fff32583855 to your computer and use it in GitHub Desktop.
Save amutake/b07c9c678fff32583855 to your computer and use it in GitHub Desktop.
PIC16F1827 で Analog In の値をシリアル通信で送ってくれるやつ
/*
* 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