вообще все работать пересталоphenomen писал(а):Добавьте еще между терминалом и линиями АБ макс485, посадив РЕ/ДЕ на землю.alex1126 писал(а):Можно ли как-нить посмотреть что там за байты бегают между ними? ДОбавил в схему виртуальный терминал. Подключил к линиям между максами к А и Б, ртс подтянул к земле.
AVR и RS485
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
- Реклама
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Вечером приведу. А вот такой вопрос Вам. Я сейчас читаю тему про протеус и там, чуть больше года назад, Вы спрашивали про то что в логах сыпятся рч фрейм еррор а бит в уарте не выставляется нужный. Вы победили эту пробелмму?Engineer_Keen писал(а):Схему приведите...
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
http://radiokot.ru/forum/viewtopic.php? ... 0#p1084390Engineer_Keen писал(а):э... не помню о чем речь, интернет хреново на работе грузится, искать влом)
- Реклама
А, это... Я забил на эту проблему. Просто не понадобилось тогда. А фрейм еррор я специально делал (скорость выставлял другую), чтобы проверять как биты в регистре выставятся.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
я, наверно, знаю почему у меня не показывает терминал ничего. Помоему я как то скорость некорректно выставляю, а так как делаю это на обоих мк одинаково - то между собой они общаются
Как можно посмотреть какие регистры в микроконтроллере как выставлены?
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
да там используется какая-то готовая библиотека без исходников.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. Если в проекте не напутана тактовая частота контроллера, то скорость должна быть правильная. Элементарно проверяется подключением на UART осциллографа и наблюдением за интервалом между старт и стоп битами при передаче. В том же протеусе можно и регистры посмотреть если во время паузы в контекстном меню МК выбрать I/O Registers, только надо по даташиту посмотреть какие адреса у регистров UBRR.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
победил. В свойствах проекта была указана частота 8Мгц а в свойствах МК в протеусе - 1Мгц. Правда какая-то непонятка с регистрами, но скриншот на работе забыл, завтра пришлю.
А вот такой еще вопрос. Я так понял что рс485 или рс232 это чисто "среда" передачи и "рулиться" она через микросхемы МАХ487, МАХ232 и подобными. А передача идет по УАРТу, грубо говоря?
А вот такой еще вопрос. Я так понял что рс485 или рс232 это чисто "среда" передачи и "рулиться" она через микросхемы МАХ487, МАХ232 и подобными. А передача идет по УАРТу, грубо говоря?
Если актуально еще, за небольшую денежку могу подкинуть скриншот с рабочей схемы 
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
ну да, там есть отличия конечно, но они больше подходят под "протокол". Там в 485, как я понял, выставляеться мультипроцесорный режим у слейвов, мастер шлет 9битовую посылку с выключенным 9битом и с адресом слейва в остальных 8байтах и все слейвы по этому пакету понимают кому адресовано сообщение и если не им, то не слушают дальше, а масте дальше шлет уже в режиме 8бит и слушает его только нужный слейв. Так? Но это же все равно все делается через уарт, тупо отправить байт принять байт....Jack_A писал(а):Только у 485-го еще надо дергать пин "Направление передачи" .
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
спасибо, но схема у меня уже естьpcb писал(а):Если актуально еще, за небольшую денежку могу подкинуть скриншот с рабочей схемы
Протокол -- протоколом, но на аппаратном уровне этим битом все равно рулить надо, потому что на шине может быть единовременно только один мастер. Передав запрос, он переводит свой драйвер 485 на прием, адресованный слейв переводит свой драйвер 485 на передачу и уже бухтит с мастером по протоколу. Закончив - опять переводит на прием. Впрочем, вроде есть законченные устройства, где это делается автоматически, но это не одна микросхема. Я с такими дел не имел.
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Идем дальше. Начинаю пистаь свою реализацию и затупил в самом начале.
Итак, что имеем. Два мк, в которых залиты прошивки из примеров, якобы по рс485. Все работает. Терминал тоже видит байтики которые летают. Там правда много чего летает, но адрес и байты которые я передаю видно отчетливо и корректно.
Но там испольузется сторонняя бибилотека которая живет "своей жизнью".
Пишем свою реализацию. Начинаем с USART. Берем один МК, выход подаем на вход виртуального терминала и начинаем опыты. Берем пример с даташита и сталкиваемся с тем, что с текущими настройками (частота МК - 1Мгц) не возможно задать скорость 9600. 4800 - работает, 9600 работает тоьлко если частоту сделать 2 Мгц. Как тогда работают прошивки из примера?
Да и по регистрам вопрос UBRRH равен 0х86 при установленных только втором и третьем бите? Я как то считал что 0х86=10000110b а 00000110b это 0х06. При этом UBRRL правильно считается.....
Итак, что имеем. Два мк, в которых залиты прошивки из примеров, якобы по рс485. Все работает. Терминал тоже видит байтики которые летают. Там правда много чего летает, но адрес и байты которые я передаю видно отчетливо и корректно.
Но там испольузется сторонняя бибилотека которая живет "своей жизнью".
Пишем свою реализацию. Начинаем с USART. Берем один МК, выход подаем на вход виртуального терминала и начинаем опыты. Берем пример с даташита и сталкиваемся с тем, что с текущими настройками (частота МК - 1Мгц) не возможно задать скорость 9600. 4800 - работает, 9600 работает тоьлко если частоту сделать 2 Мгц. Как тогда работают прошивки из примера?
Да и по регистрам вопрос UBRRH равен 0х86 при установленных только втором и третьем бите? Я как то считал что 0х86=10000110b а 00000110b это 0х06. При этом UBRRL правильно считается.....
Ну правильно, в UBRRL - 0x0C, т.е. число 12, которое соответствует битрейту 9600 для частоты 2МГц (см. таблицу в даташите). Чтобы работало на 1 МГц нужно ставить 0х06 (но ошибка большая - 7%) или включать бит U2X.alex1126 писал(а): 9600 работает тоьлко если частоту сделать 2 Мгц
UBRRH в некоторых контроллерах на самом деле хитрый регистр. Это одновременно и UBRRH и UCSRC, и данные пишутся в него в зависимости от старшего бита. Т.е если записать 0x06, то 0x06 попадет в UBRRH, а если писать 0x86, то 0x06 попадает в UCSRC - в данном случае биты задают размер символа - 8 бит.alex1126 писал(а): Да и по регистрам вопрос UBRRH равен 0х86 при установленных только втором и третьем бите? Я как то считал что 0х86=10000110b а 00000110b это 0х06. При этом UBRRL правильно считается.....
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
А как он раньше работал с "чужой" прошивкой. В свойствах мк стояла частота 1Мгц, терминал настроен на 9600. Как они это сделали? U2X включили? Ступил я чтот то ,надо было посмотреть сегодня....Engineer_Keen писал(а):Ну правильно, в UBRRL - 0x0C, т.е. число 12, которое соответствует битрейту 9600 для частоты 2МГц (см. таблицу в даташите). Чтобы работало на 1 МГц нужно ставить 0х06 (но ошибка большая - 7%) или включать бит U2X.alex1126 писал(а): 9600 работает тоьлко если частоту сделать 2 Мгц
- Сообщения: 567
- Зарегистрирован: Ср дек 19, 2012 12:16:22
Ладно. Продолжаем разговор. Есть два мк, соединенных через два мах487. Схема рабочая. Интересует алгоритм (хотя бы) для общения по рс485. Может кто рассказать? Не нашел описания именно программной части. По уарту передавать и принимать научился. Благо этого полно где написано. Даже в даташите. Про 485 обрывками и не полностью.
Инициализацию как производить? Ну скорость, четность, стоп биты... а на сколько бит? 9? Один обозначающий что пакет с адресом, и 8 бит данных?
Далее. Все слейвы выставляют MPCM и ждут. Соотствтенно на прием к ним попадают только пакты где 8 бит (от 0) в 1 и там, соответственно есть адрес. Когда принимают, смотрят, если это их адрес, то сбрасывают этот MPCM и слушают дальше. Если адрес не ихний, то устанавливают MPCM.
После того как они приняли данные, они отвечают и мастер принимает данные.
Так все?
Инициализацию как производить? Ну скорость, четность, стоп биты... а на сколько бит? 9? Один обозначающий что пакет с адресом, и 8 бит данных?
Далее. Все слейвы выставляют MPCM и ждут. Соотствтенно на прием к ним попадают только пакты где 8 бит (от 0) в 1 и там, соответственно есть адрес. Когда принимают, смотрят, если это их адрес, то сбрасывают этот MPCM и слушают дальше. Если адрес не ихний, то устанавливают MPCM.
После того как они приняли данные, они отвечают и мастер принимает данные.
Так все?


