-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.c
162 lines (136 loc) · 7.39 KB
/
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
* File: main.c
* Author: user
*
* Created on 20 лютого 2017, 22:38
*/
#include <xc.h>
#include <stdlib.h>
#include <stdio.h>
#include <pic16f688.h>
#include "usart.h"
#define _XTAL_FREQ 4000000
// PIC16LF88 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCIO // Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (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 MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Detect (BOR disabled)
#pragma config IESO = ON // Internal External Switchover bit (Internal External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
void ADC_Init()
{
ADCON0 = 0x10000001; //Turn ON ADC and Clock Selection
ADCON1 = 0b001;
}
unsigned int ADC_Read(unsigned char channel)
{
if(channel > 7) return 0; //Channel range is 0 ~ 7
RCIE = 0; //запрещаем прерывания
ADCON0 = 0b10000001; //Clearing channel selection bits
ADCON0 |= channel<<2; //Setting channel selection bits
__delay_ms(2); //Acquisition time to charge hold capacitor
GO_nDONE = 1; //Initializes A/D conversion
while(GO_nDONE) NOP(); //Waiting for conversion to complete
RCIE = 1; //разрешаем прерывания
return ((ADRESH<<8)+ADRESL); //Return result
}
volatile int ulitsa = 0, tseh = 0, obratka = 0, kotel = 0; // переменные для хранения температуры
volatile char a[16] = ""; // буфер для команд UART
volatile char c; // символ для работы UART
volatile int i= 0; // просто счётчик для прерываний
#define obratka_xolodnaya RC1 // назначение выводов
#define peregrev RC2
#define ventil RC3
#define elektro RA3
#define nasos RA5
// входы контроля светодиодов
void main(void) {
// Подготавливаем всё для прерываний и ком-порта
INTCON = 0b11000000;; //разрешить прерывания от периферии
RCIE=1; // разрешаем прерывание по приему байта UART
init_comms(); // запускаем UART
TRISA = 0b00101111; //Port A as input
TRISC = 0b00101111; //Port C as INPUT
ANSEL = 0b00010111; // Аналоговые входы выбраны
ADC_Init(); //Initialize ADC
RA4 = 0;
__delay_ms(1000);
RA4 = 1;
while (1) {
ulitsa = ADC_Read(0)*1000/208; //Read Analog Channel 0
tseh = ADC_Read(1)*1000/208; //Read Analog Channel 1
obratka = ADC_Read(2)*1000/208; //Read Analog Channel 2
kotel = ADC_Read(4)*1000/208; //Read Analog Channel 4
//printf("%d|%d|%d|%d|%d\r\n", obratka_xolodnaya, peregrev, ventil, elektro, nasos );
__delay_ms(500);
};
};
void interrupt isr(void) {
if ((RCIE)&&(RCIF)) { // если что-то пришло в приёмник UART и принимать можно
if(!RX9D && !OERR && !FERR) { // если нет ошибок
c = RCREG;
if ( c == 0x0d || c == 0x0a ) { //введен символ конца строки или возврат каретки
a[i] = '\0';
// =============================================================
// Начинаем распознавать и выполнять комманды, которые пришли
// =============================================================
if (a[0]=='A' && a[1]=='T') { //если это комманда, то обрабатываем
if (a[2]=='\0') { // тестовая комманда которая возвращает просто ОК
print_to_uart("OK");
};
if (a[2]==' ' && a[3]=='H' && a[4]=='\0') { //AT D - описание комант
printf("AT H - this help\r\n");
printf("AT T - print temperature array\r\n");
printf("AT D - print level array\r\n");
printf("AT A - print temperatue/level array\r\n");
};
if (a[2]==' ' && a[3]=='T' && a[4]=='\0') { //AT T - текущая температура
printf("%d.%d|", ulitsa/10,(ulitsa - (ulitsa/10)*10));
printf("%d.%d|", tseh/10,(tseh - (tseh/10)*10));
printf("%d.%d|", obratka/10,(obratka - (obratka/10)*10));
printf("%d.%d\r\n", kotel/10,(kotel - (kotel/10)*10));
};
if (a[2]==' ' && a[3]=='D' && a[4]=='\0') { //AT D - состояние светодиодов
printf("%d|%d|%d|%d|%d\r\n", obratka_xolodnaya, peregrev, ventil, elektro, nasos );
//print_to_uart("2\n");
};
if (a[2]==' ' && a[3]=='A' && a[4]=='\0') { //AT T - текущая температура и сост. светодиодов
printf("%d.%d|", ulitsa/10,(ulitsa - (ulitsa/10)*10));
printf("%d.%d|", tseh/10,(tseh - (tseh/10)*10));
printf("%d.%d|", obratka/10,(obratka - (obratka/10)*10));
printf("%d.%d|", kotel/10,(kotel - (kotel/10)*10));
printf("%d|%d|%d|%d|%d\r\n", obratka_xolodnaya, peregrev, ventil, elektro, nasos );
//print_to_uart("2\n");
};
};
// если другой набор данных - игнорируем и не отвечаем
a[0] = '\0'; //записываем пустую строку
i = 0; //сбрасываем указатель символа на 0
} else {
//Заполняем буффер следующим символом
if (i==16){ // если переполнение то сбрасываем на первый символ
a[0] = c;
i = 0;
} else { //увеличиваем команду на 1 единицу
a[i] = c;
i++;
};
};
} else {
//сброс ошибки приёмника
c = RCREG;
c = RCREG;
CREN = 0;
NOP();
NOP();
CREN = 1;
};
};
};