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

Проблемы с UART2 на PIC18F45K22


Рекомендуемые сообщения

Доброго дня, товарищи программисты-электронщики!

Помогите, пожалуйста, разобраться в чём проблема. Есть плата на 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;
}

 

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

Непонятно вот тут. В прерывании проверка бита поступления данных на UART1

if(RC1IF_bit){

а при этом читается UART2

uart2_read_text(uart_r, "!", 20);

Куда эти УАРТы оба подключены?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Также как и в ТЗ - эфемерное значение. 
    • Смотрите даташит на мк, там все подробно написано!
    • У меня 5 версия с ОРА2604 звучит чисто и прозрачно, замечательно для джаза и женского вокала. А вот для рока такое впечатление что не хватает басов.  Собрал версию 6. Сейчас с китайскими ОРА134 с такими же самодельными колонками ( Peerless 6,5' на нч и сч, и  китайский Аl-100 на вч) играет побасистие чем версия 5, но прозрачности поменьше. Пробовал ставить КР574уд1 получил постоянку на выходе 5-6мв, (что не смертельно)  но сильно греются радиаторы, буду думать о коррекции или о покупке настоящих оперов. 
    • Есть несколько вопросов касаемо данного плеера. Первое я всё же решил перебраться на ATMEGA16, но тут нужно ещё понять как подключить внешний кварц на 7.3728 MHz. Как подключить на схеме это понятно. Но вот с фьюзами так и не понятно как их нужно выставлять? Далее вопросы по некоторым командам самого плеера потому как в описании мало что поймёшь. Хотя большую часть команд я уже понял. Интересуют такие команды . Мне нужно понять правильно ли я понимаю назначение функций данных команд. AT+AC02 воспроизведение выбранной музыки в цикле  AT+AC03 воспроизведение музыки в случайном порядке И главное ещё нужно понять какой командой эти команды в последующем можно отменить? Скажем так нажал я кнопку в случайном порядке. Плеер воспроизводит музыку в случайном порядке, а при повторном нажатии нужно отменить случайный порядок. Тоже самое и с цикличным воспроизведением делается то аналогично. И есть ли команда чтоб получить уровень звука на плеере в данный момент?
    • Не дербаньте Вы свою платку с тини85. Оставьте её для других поделок.  Возьмите ATtiny13A-PU и по такой схеме (диод Шоттки примените какой удобней, к примеру такой 1N5817) будет то, что Вам так давно хочется (как я заметил). МК тактируется на заводских установках (1,2 МГц). Потребление тока в спящем режиме при напряжении 2 В (согласно моего прибора) 3 мкА. Светодиод мигает с периодом раз в 4 сек. sat_4s.hex А в этой прошивке,  Светодиод мигает с периодом раз в 8 сек. sat_8s.hex Выбирайте какая прошивка ближе к Вашим запросам и Ваша мечта сбудется. 
×
×
  • Создать...