AVR и RS485

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

phenomen писал(а):
alex1126 писал(а):Можно ли как-нить посмотреть что там за байты бегают между ними? ДОбавил в схему виртуальный терминал. Подключил к линиям между максами к А и Б, ртс подтянул к земле.
Добавьте еще между терминалом и линиями АБ макс485, посадив РЕ/ДЕ на землю.
вообще все работать перестало :(
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Схему приведите...
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Engineer_Keen писал(а):Схему приведите...
Вечером приведу. А вот такой вопрос Вам. Я сейчас читаю тему про протеус и там, чуть больше года назад, Вы спрашивали про то что в логах сыпятся рч фрейм еррор а бит в уарте не выставляется нужный. Вы победили эту пробелмму?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

э... не помню о чем речь, интернет хреново на работе грузится, искать влом)
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Engineer_Keen писал(а):э... не помню о чем речь, интернет хреново на работе грузится, искать влом)
http://radiokot.ru/forum/viewtopic.php? ... 0#p1084390
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

А, это... Я забил на эту проблему. Просто не понадобилось тогда. А фрейм еррор я специально делал (скорость выставлял другую), чтобы проверять как биты в регистре выставятся.
Реклама
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

я, наверно, знаю почему у меня не показывает терминал ничего. Помоему я как то скорость некорректно выставляю, а так как делаю это на обоих мк одинаково - то между собой они общаются :) Как можно посмотреть какие регистры в микроконтроллере как выставлены?
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

А что в коде нельзя посмотреть?
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Engineer_Keen писал(а):А что в коде нельзя посмотреть?
да там используется какая-то готовая библиотека без исходников.
вся работа с рс485 происходит следующим образом:

Код: Выделить всё

sbit  rs485_rxtx_pin  at PORTD2_bit;         // set transcieve pin
sbit  rs485_rxtx_pin_direction at DDD2_bit;  // set transcieve pin direction

// Interrupt routine
void interrupt() org IVT_ADDR_USART_RXC {
  RS485Slave_Receive(dat);
}
void main {
  UART1_Init(9600);                  // initialize UART1 module
  Delay_ms(100);
  RS485Slave_Init(160);              // Intialize MCU as slave, address 160

  dat[4] = 0;                        // ensure that message received flag is 0
  dat[5] = 0;                        // ensure that message received flag is 0
  dat[6] = 0;                        // ensure that error flag is 0

  SREG_I_bit = 1;                    // enable global interrupt
  RXCIE_bit  = 1;                    // enable interrupt on UARTs receive

  while (1) {
 
    if (dat[5])  {                   // if an error detected, signal it by
      PORTC = dat[5];                //   setting PORTC
      dat[5] = 0;
    }
    if (dat[4]) {                    // upon completed valid message receive
      dat[4] = 0;                    //   data[4] is set to 0xFF
      j = dat[3];

      for (i = 1; i <= dat[3];i++){  // show data on PORTB
        PORTB = dat[i-1];
      }
      dat[0] = dat[0]+1;             // increment received dat[0]
      Delay_ms(1);
      RS485Slave_Send(dat,1);        //   and send it back to master
    }
  }

}

тут то вроде как 9600, но даже если это и так то встает вопрос с четностью и стоп битами. Вообщем по любому хотел переписывать код что бы самом рулить, так как тут больше 3 байт данных не переслать похоже за раз
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Ну да, в функцию инициализации передается 9600. Если в проекте не напутана тактовая частота контроллера, то скорость должна быть правильная. Элементарно проверяется подключением на UART осциллографа и наблюдением за интервалом между старт и стоп битами при передаче. В том же протеусе можно и регистры посмотреть если во время паузы в контекстном меню МК выбрать I/O Registers, только надо по даташиту посмотреть какие адреса у регистров UBRR.
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

победил. В свойствах проекта была указана частота 8Мгц а в свойствах МК в протеусе - 1Мгц. Правда какая-то непонятка с регистрами, но скриншот на работе забыл, завтра пришлю.

А вот такой еще вопрос. Я так понял что рс485 или рс232 это чисто "среда" передачи и "рулиться" она через микросхемы МАХ487, МАХ232 и подобными. А передача идет по УАРТу, грубо говоря?
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Только у 485-го еще надо дергать пин "Направление передачи" .
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Сообщение pcb »

Если актуально еще, за небольшую денежку могу подкинуть скриншот с рабочей схемы :)
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Jack_A писал(а):Только у 485-го еще надо дергать пин "Направление передачи" .
ну да, там есть отличия конечно, но они больше подходят под "протокол". Там в 485, как я понял, выставляеться мультипроцесорный режим у слейвов, мастер шлет 9битовую посылку с выключенным 9битом и с адресом слейва в остальных 8байтах и все слейвы по этому пакету понимают кому адресовано сообщение и если не им, то не слушают дальше, а масте дальше шлет уже в режиме 8бит и слушает его только нужный слейв. Так? Но это же все равно все делается через уарт, тупо отправить байт принять байт....
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

pcb писал(а):Если актуально еще, за небольшую денежку могу подкинуть скриншот с рабочей схемы :)
спасибо, но схема у меня уже есть :)
Друг Кота
Аватара пользователя
Сообщения: 6337
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Протокол -- протоколом, но на аппаратном уровне этим битом все равно рулить надо, потому что на шине может быть единовременно только один мастер. Передав запрос, он переводит свой драйвер 485 на прием, адресованный слейв переводит свой драйвер 485 на передачу и уже бухтит с мастером по протоколу. Закончив - опять переводит на прием. Впрочем, вроде есть законченные устройства, где это делается автоматически, но это не одна микросхема. Я с такими дел не имел.
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Идем дальше. Начинаю пистаь свою реализацию и затупил в самом начале.
Итак, что имеем. Два мк, в которых залиты прошивки из примеров, якобы по рс485. Все работает. Терминал тоже видит байтики которые летают. Там правда много чего летает, но адрес и байты которые я передаю видно отчетливо и корректно.
Но там испольузется сторонняя бибилотека которая живет "своей жизнью".
Пишем свою реализацию. Начинаем с USART. Берем один МК, выход подаем на вход виртуального терминала и начинаем опыты. Берем пример с даташита и сталкиваемся с тем, что с текущими настройками (частота МК - 1Мгц) не возможно задать скорость 9600. 4800 - работает, 9600 работает тоьлко если частоту сделать 2 Мгц. Как тогда работают прошивки из примера?

Да и по регистрам вопрос
Безымянный.jpg
(90.4 КБ) 873 скачивания
UBRRH равен 0х86 при установленных только втором и третьем бите? Я как то считал что 0х86=10000110b а 00000110b это 0х06. При этом UBRRL правильно считается.....
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

alex1126 писал(а): 9600 работает тоьлко если частоту сделать 2 Мгц
Ну правильно, в UBRRL - 0x0C, т.е. число 12, которое соответствует битрейту 9600 для частоты 2МГц (см. таблицу в даташите). Чтобы работало на 1 МГц нужно ставить 0х06 (но ошибка большая - 7%) или включать бит U2X.
alex1126 писал(а): Да и по регистрам вопрос
Безымянный.jpg
UBRRH равен 0х86 при установленных только втором и третьем бите? Я как то считал что 0х86=10000110b а 00000110b это 0х06. При этом UBRRL правильно считается.....
UBRRH в некоторых контроллерах на самом деле хитрый регистр. Это одновременно и UBRRH и UCSRC, и данные пишутся в него в зависимости от старшего бита. Т.е если записать 0x06, то 0x06 попадет в UBRRH, а если писать 0x86, то 0x06 попадает в UCSRC - в данном случае биты задают размер символа - 8 бит.
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Engineer_Keen писал(а):
alex1126 писал(а): 9600 работает тоьлко если частоту сделать 2 Мгц
Ну правильно, в UBRRL - 0x0C, т.е. число 12, которое соответствует битрейту 9600 для частоты 2МГц (см. таблицу в даташите). Чтобы работало на 1 МГц нужно ставить 0х06 (но ошибка большая - 7%) или включать бит U2X.
А как он раньше работал с "чужой" прошивкой. В свойствах мк стояла частота 1Мгц, терминал настроен на 9600. Как они это сделали? U2X включили? Ступил я чтот то ,надо было посмотреть сегодня....
Вымогатель припоя
Сообщения: 567
Зарегистрирован: Ср дек 19, 2012 12:16:22

Сообщение alex1126 »

Ладно. Продолжаем разговор. Есть два мк, соединенных через два мах487. Схема рабочая. Интересует алгоритм (хотя бы) для общения по рс485. Может кто рассказать? Не нашел описания именно программной части. По уарту передавать и принимать научился. Благо этого полно где написано. Даже в даташите. Про 485 обрывками и не полностью.

Инициализацию как производить? Ну скорость, четность, стоп биты... а на сколько бит? 9? Один обозначающий что пакет с адресом, и 8 бит данных?
Далее. Все слейвы выставляют MPCM и ждут. Соотствтенно на прием к ним попадают только пакты где 8 бит (от 0) в 1 и там, соответственно есть адрес. Когда принимают, смотрят, если это их адрес, то сбрасывают этот MPCM и слушают дальше. Если адрес не ихний, то устанавливают MPCM.
После того как они приняли данные, они отвечают и мастер принимает данные.

Так все?
Ответить

Вернуться в «Интеграция с ПК»