Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-сен-23 15:41

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-17 14:51 
Не в сети

Зарегистрирован: 2016-апр-10 23:50
Сообщения: 8
Здравствуйте.
Пытаюсь реализовать связь ВЕ6 с терминальной программой по RS485, терминал получает посылку с МК, но МК не принимает посылку с терминала. В режиме ожидания на TX2 "1", а на RX"0".
Какой уровень сигнала должен быть на ножках TX2, RX2 при включенном в асинхронном режиме USART2 в режиме ожидания?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-18 08:05 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 992
Откуда: Тула
лог. единица. Стартовый бит - ноль, дальше данные, парити, стоповый бит - единица и так она и остаётся до следующего стартового бита.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-23 11:23 
Не в сети

Зарегистрирован: 2016-апр-10 23:50
Сообщения: 8
Здравствуйте.
Подскажите пожалуйста где ошибка в настройке UART1. МК не хочет уходить в прерывание по приему посылки по UART1

Код:
*/
#include "1886VE6.h"

/****************************************************/
#include "int17xxx.h"
#pragma origin 0x10

interrupt iServer(void)
{
    multi_interrupt_entry_and_save

PERIPHERAL_service:
char FSR01=FSR0;                           
  {
  if(RC1IF)                               
    {     
       ADCON1 = 0b00001110;    //PortC - Didital 
       PORTC = 0b00000011;
       DDRC = 0b00000000;       
    }     
 
     FSR0=FSR01;                     
   
     TMR0_service:   
     T0CKI_service:
     INT_service:
     interrupt_exit_and_restore
  }     


/****************************************************/ 

void main()
{
  GLINTD = 1;                   // Interrupts disable
     
  ADCON1 = 0b00001110;          // PortC - Didital 
 
  TMR1H = 0xBF;               // установка частоты прерывний от таймера 1
  TMR1 = 0x00; 
 
  SPBRG1 = 0;                 // 256000 бит/с, 8 МГц
  RCSTA1 = 0b10000000;          //on uart1
 
  SYNC1 = 0;                            // асинхронный режим
  TXEN1 = 0;                            // запретить передачу

  INTSTA = 0b00001000;           // разрешение переферийных прерываний             
  PIE1 = 0b00010001;                // разрешение прерываний от таймера1
                                               // разрешение прерываний USART1
  CREN1=1;                              // разрешение непрерывного приема
 
  RC1IF = 0;                             //флаг запроса прерывания
  PORTC.2 = 0;                         // на RE, DE 5559ИН10
 
  GLINTD = 0;                   // Interrupts enable      
        


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-23 11:46 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 435
При беглом взгляде:
1 Из СП (на ВЕ5, UART ВЕ6 идентичен): "RCIF доступен только для чтения, он сбрасывается аппаратно когда считываются данные из RCREG и регистр пуст." Ваш обработчик RCREG не считывает, соответственно RCIF встанет навсегда.
2 Из СП на ВЕ6: "Флаг запроса прерывания от приемника USART1. Флаг устанавливается и сбрасывается аппаратно, доступен только для чтения." Соответственно RC1IF = 0 в main бессмысленно.
3 Сомнительно, что на тактовой 8МГц CPU будет успевать обрабатывать поток 256 кБит/с, т.е. прерывания каждые 3,9 мкс.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-23 14:06 
Не в сети

Зарегистрирован: 2016-апр-10 23:50
Сообщения: 8
Возможно вы и правы, но микроконтроллер не заходит в обработчик, хотя вроде все шаги для настройки асинхронного приема описанные на стр. 90 спецификации выполняются. Скорректировал код: уменьшил скорость до 9600 б/с и добавил в обработчик прерываний чтение RCREG, но результата нет.
Код:
*/
#include "1886VE6.h"
unsigned char RCBuf[10];
unsigned char N;
/****************************************************/
#include "int17xxx.h"
#pragma origin 0x10

interrupt iServer(void)
{
    multi_interrupt_entry_and_save

PERIPHERAL_service:
char FSR01=FSR0;                           
  {
  if(RC1IF)
  {   
      ADCON1 = 0b00001110;    //PortC - Didital 
      PORTC = 0b00000011;
      DDRC = 0b00000000;
         
      RCBuf[N] = RCREG2;         // запомнить принятый байт   
      if (N < 7) { ++N; }     // номер следующего байта}
                   
    }                   
       
     FSR0=FSR01;                     
   
     TMR0_service:   
     T0CKI_service:
     INT_service:
     interrupt_exit_and_restore
  }     


/****************************************************/ 

void main()
{
  GLINTD = 1;                   // Interrupts disable
     
  ADCON1 = 0b00001110;          // PortC - Didital 
 
  SPBRG1 = 25;                 // 9600 бит/с, 8 МГц
  RCSTA1 = 0b10000000;          //on uart1
 
  SYNC1 = 0;                            // асинхронный режим
  TXEN1 = 0;                            // запретить передачу

  INTSTA = 0b00001000;                  // разрешение переферийных прерываний             
  PIE1 = 0b00010001;                    // разрешение прерываний от таймера1
                                        // разрешение прерываний USART1
  CREN1=1;             
 

  PORTC.2 = 0; 
 
  GLINTD = 0;                   // разрешение всех прерываний       
        
}           


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-23 17:05 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 435
Для сравнения, выдрано из рабочего проекта для ВЕ5, Fclc=16МГц:
Код:
void Init_Uart(void)
{
SPBRG = 25;    // задание скорости 19200 bps для Fc 16 МГц
RCSTA = 0x90;   // SPEN = RX8(реж. 8 бит приёма) = CREN = 1
TXSTA = 0x00;   // TX9 = 0 (реж. 8 бит передатчика)
RCIE = 1;
}

void main()
{
..................................
// Инициализируем регистры разрешения периферийных прерываний
PIE1 = 0;
PIE2 = 0;
// Инициализируем регистры флагов запросов прерываний
PIR1 = 0;
PIR2 = 0;

INTSTA = 0x08;  // PEIE = 1

Init_Uart();
GLINTD = 0;
...............................
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-24 16:54 
Не в сети

Зарегистрирован: 2016-апр-10 23:50
Сообщения: 8
Почему не выбран источник прерываний ?
В предыдущем письме вы писали :"Соответственно RC1IF = 0 в main бессмысленно." , а в вашем коде вы обнуляете флаги прерываний (PIR1 = 0).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: K1886BE61 USART2
СообщениеДобавлено: 2017-янв-25 08:53 
Не в сети

Зарегистрирован: 2009-сен-21 12:39
Сообщения: 435
Код поставляется как есть, без гарантий и контрибуций (с)... :)
Кстати, есть смысл проверить работает ли передатчик.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB