Миландр

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

Часовой пояс: UTC+03:00




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

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


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

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

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


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

Зарегистрирован: 2016-апр-10 23:50
Сообщения: 8
Организация: home
Здравствуйте.
Подскажите пожалуйста где ошибка в настройке 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
Сообщения: 513
При беглом взгляде:
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
Организация: home
Возможно вы и правы, но микроконтроллер не заходит в обработчик, хотя вроде все шаги для настройки асинхронного приема описанные на стр. 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
Сообщения: 513
Для сравнения, выдрано из рабочего проекта для ВЕ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
Организация: home
Почему не выбран источник прерываний ?
В предыдущем письме вы писали :"Соответственно RC1IF = 0 в main бессмысленно." , а в вашем коде вы обнуляете флаги прерываний (PIR1 = 0).


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

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


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

Часовой пояс: UTC+03:00


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

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


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

Перейти: 

Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB