Доброго дня, товарищи программисты-электронщики!
Помогите, пожалуйста, разобраться в чём проблема. Есть плата на PIC18F45K22, она должна работать через UART2. Принимать значения, выполнять некоторые действия и возвращать значения. Однако, при подключении второго UART'a основная программа выходит из цикла (с первым UART'ом прекрасно работает). При этом, плата выполняет необходимые действия с периферией, но не возвращает никаких значений.
Код основной программы, написанный в среду mikroC PRO for PIC
#define timeout1 500000
#define timeout2 1000000
#include "main.h"
int disconnected = 1;
int ping=0;
volatile char ID='1';
volatile int sendPress=0;
volatile int sendRele=0;
volatile int sendID=0;
volatile int uartN = 0;
char relArr[10];
void meas_press();
void interrupt(void)
{
if(RC1IF_bit){
ping=0;
INTCON.GIE = 0;
RC1IF_bit = 0;
delay_us(5);
uart2_read_text(uart_r, "!", 20);
if(uart_r[0]==36) //$
{
disconnected =1;
}
if(uart_r[0]==82) //R
{
relay_set(uart_r);
}
if(uart_r[0]==80) //P
{
sendPress=1;
}
if(uart_r[0]==42) //*
{
sendID=1;
}
if(uart_r[0]==73) //I
{
ID=uart_r[1];
}
}
INTCON.GIE = 1;
}
void initialisation_relmod(void){
RELAY_1 = 0;
RELAY_2 = 0;
RELAY_3 = 0;
RELAY_4 = 0;
RELAY_5 = 0;
RELAY_6 = 0;
RELAY_7 = 0;
RELAY_8 = 0;
RELAY_9 = 0;
RELAY_10 = 0;
CS1 = 1;
CS2 = 1;
CS3 = 1;
}
void adc_select(int ch){
switch(ch){
case 0: CHS0_bit = 0; CHS1_bit = 0; CHS2_bit = 0; break; //select AN0
case 1: CHS0_bit = 1; CHS1_bit = 0; CHS2_bit = 0; break; //select AN1
case 2: CHS0_bit = 0; CHS1_bit = 1; CHS2_bit = 0; break; //select AN2
case 3: CHS0_bit = 1; CHS1_bit = 1; CHS2_bit = 0; break; //select AN3
case 4: CHS0_bit = 0; CHS1_bit = 0; CHS2_bit = 1; break; //select AN4
case 5: CHS0_bit = 1; CHS1_bit = 0; CHS2_bit = 1; break; //select AN5
}
}
void meas_press(){ //функция рассчёта давления
for (i = 0; i < 6; i++){
adc_select(i);
ADON_bit = 1;
GO_DONE_bit = 1;
delay_ms(2);
for (j = 0; j < 30; j++){
if(GO_DONE_bit == 0){
admes[i][j] = ADRESH;
GO_DONE_bit = 1;
delay_ms(2);
}
}
ADON_bit = 0;
}
uart2_write(80);
for (i = 0; i < 6; i++){
for (j = 0; j < 30; j++){
sum[i] += admes[i][j];
}
sum[i] = sum[i]/30;
uart2_write(sum[i]);
}
uart2_write(33);
}
void relay_set(char uart_rd[12]) //функция установки необходимых значений реле
{
int ct=0;
switch(uart_rd[1]){
case 48:{ RELAY_1 = 0; relArr[0]='0'; break; }
case 49:{ RELAY_1 = 1; relArr[0]='1'; break; }
case 120:; break;
}
switch(uart_rd[2]){
case 48:{ RELAY_2 = 0; relArr[1]='0'; break;}
case 49:{ RELAY_2 = 1; relArr[1]='1'; break;}
case 120:; break;
}
switch(uart_rd[3]){
case 48:{ RELAY_3 = 0; relArr[2]='0'; break;}
case 49:{ RELAY_3 = 1; relArr[2]='1'; break;}
case 120:; break;
}
switch(uart_rd[4]){
case 48:{ RELAY_4 = 0; relArr[3]='0'; break;}
case 49:{ RELAY_4 = 1; relArr[3]='1'; break;}
case 120:; break;
}
switch(uart_rd[5]){
case 48:{ RELAY_5 = 0; relArr[4]='0'; break;}
case 49:{ RELAY_5 = 1; relArr[4]='1'; break;}
case 120:; break;
}
switch(uart_rd[6]){
case 48:{ RELAY_6 = 0; relArr[5]='0'; break;}
case 49:{ RELAY_6 = 1; relArr[5]='1'; break;}
case 120:; break;
}
switch(uart_rd[7]){
case 48:{ RELAY_7 = 0; relArr[6]='0'; break;}
case 49:{ RELAY_7 = 1; relArr[6]='1'; break;}
case 120:; break;
}
switch(uart_rd[8]){
case 48:{ RELAY_8 = 0; relArr[7]='0'; break;}
case 49:{ RELAY_8 = 1; relArr[7]='1'; break;}
case 120:; break;
}
switch(uart_rd[9]){
case 48:{ RELAY_9 = 0; relArr[8]='0'; break;}
case 49:{ RELAY_9 = 1; relArr[8]='1'; break;}
case 120:; break;
}
switch(uart_rd[10]){
case 48:{ RELAY_10 = 0; relArr[9]='0'; break;}
case 49:{ RELAY_10 = 1; relArr[9]='1'; break;}
case 120:; break;
}
sendRele=1;
}
void main(void){
int ct=0;
reg_ini();
initialisation_relmod();
initialisation_usart();
start_ISR();
INTCON.GIE=1;
while(1)
{
uart2_write_text("Text"); //текст, выводимый для проверки находится ли программа в цикле
if(sendPress)
{
meas_press();
sendPress=0;
}
if(sendRele)
{
uart2_write('R');
for(ct=0;ct<10;ct++)
{
uart2_write(relArr[ct]);
}
uart2_write('!');
sendRele=0;
}
delay_ms(100);
if(sendID)
{
uart2_write(35);
uart2_write(ID);
uart2_write('!');
sendID=0;
}
}
}
Код файла инициализации, написанный в той же среде
/*****************************************************************************/
/*
Функция инициализации регистров
*/
/*****************************************************************************/
void reg_ini(void){
ANSELA = 0x2F;
ANSELE = 0x07;
ANSELB = 0x00;
ANSELC = 0x00;
ANSELD = 0x00;
OSCCON.SCS0 = 0;
OSCCON.SCS1 = 0;
OSCCON2.PLLRDY = 1;
OSCCON2.PLLEN = 1;
TRISC = 0xC0;
TRISD = 0xC0;
PORTC = 0x00;
PORTD = 0x00;
TRISA = 0x2F;
TRISE = 0x07;
TRISB0_bit = 0;
TRISB1_bit = 0;
TRISB2_bit = 0;
TRISB3_bit = 0;
TRISB4_bit = 0;
TRISB5_bit = 0;
TRISC1_bit = 0;
TRISC2_bit = 0;
TRISC.F6 = 0;
TRISC.F7 = 1;
TRISD0_bit = 1;
TRISD1_bit = 1;
TRISD2_bit = 1;
TRISD4_bit = 0;
TRISD5_bit = 0;
TRISD.F6 = 0;
TRISD.F7 = 1;
ADCON0 = 0x03;
ADCON1 = 0x00;
ADCON2 = 0b00010110;
INTCON = 0x00;
RCON.IPEN = 0;
TMR0L = 0;
}
/*****************************************************************************/
/*
Функция инициализации USART1->FT232RL to USB & USART2->Terminal
*/
/*****************************************************************************/
void initialisation_usart(void){
UART1_Init(38400);
UART2_Init(38400);
}
/*****************************************************************************/
/*
Функция запуска прерываний и таймера
*/
/*****************************************************************************/
void start_ISR(void){
PIR1 = 0x00;
INTCON = 0xE0;
PIE1 = 0x20;
IPR1 = 0x00;
}