Перейти к содержанию

R'j_395

Members
  • Постов

    1
  • Зарегистрирован

  • Посещение

Информация

  • Город
    Москва

Электроника

  • Стаж в электронике
    Менее года
  • Оборудование
    PIC18F45K22

Достижения R'j_395

Новичок

Новичок (1/14)

  • Неделя на форуме
  • Месяц на форуме
  • Год на форуме

Последние значки

0

Репутация

  1. Доброго дня, товарищи программисты-электронщики! Помогите, пожалуйста, разобраться в чём проблема. Есть плата на 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; }
×
×
  • Создать...