Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/33: Рейтинг темы: голосов - 33, средняя оценка - 4.94
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
1

Обмен данными между МК через RS-485 (MAX487)

28.10.2015, 09:01. Просмотров 6170. Ответов 86
Метки нет (Все метки)

Доброго времени суток.

Сразу к делу:
В сообщении прикреплено фото и файл исходного кода (AtmelStudio 6) и проект в Proteus 8 Prof.

Проблема в следующем:
из МК U2 поднимаем ножку PD3, передаем данные TXD (рис.п.1) MAX487 передает другой стороне (рис.п.2), а U3 принимает RXD (рис.п.3).

Далее U3 обрабатывает данные и выдает ответ TXD (рис.п.4), MAX487 передает другой стороне (рис.п.5), но вот U2 через RXD (рис.п.6) ничего не принимает.

Помогите пожалуйста разобраться.
0
Миниатюры
Обмен данными между МК через RS-485 (MAX487)  
Вложения
Тип файла: zip project.zip (105.9 Кб, 49 просмотров)
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.10.2015, 09:01
Ответы с готовыми решениями:

Обмен данными по RS-485 в CodeVisionAVR (на базе кода Wizard
Задача: дополнить (видоизменить) код на С (в CodeVisionAvr) , чтобы получить работу функций...

RS-485: PIC18f4620 и MAX487
Доброй ночи. Подскажите, пожалуйста, такую штуку. Разбираюсь с передачей данных посредством...

Обмен данными по UART между несколькими устройствами
Планирую собрать систему из 2 - 33 устройств обменивающимися данными между собой по UART. В систему...

Обмен данными по SPI между двумя Atemga
Пытаюсь реализовать обмен 5 байт данными между двумя Atmeg(1-Atmega165 ведущий, 2-Atmega16...

Обмен данными через COM- порт
Добрый день, пытаюсь освоить передачу данных. Отсылаю на мк скажем "1", приходит "1" и "-38"...

86
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
14.11.2015, 18:43  [ТС] 41
Что-то запутался с условиями:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int8_t _cmd = data_rx[1];
 
if (_cmd == 0xA0) {
   soft_reset();
} else if (_cmd == 0xB0) {
   proc1();
} else if (_cmd == 0xB1) {
   proc2();
} else if (_cmd == 0xB2) {
   proc3();
} else if (_cmd == 0xB3) {
   proc4();
} else if (_cmd == 0xB4) {
   proc5();
} else {
   proc_err();
}
проверял и _cmd = 0xB1, но вот при обработке условий попадает в else и отрабатывает процедура proc_err();

Где я туплю не могу понять.

Процедура полностью:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void Packet_Process(uint8_t data_rx[])
{
    st_data_pack data_tx;
    if (Packet_CheckCRC(data_rx))
    {
 
        // Подготовка пакета ответа
        int8_t _cmd = data_rx[1];
 
        if (_cmd == 0xA0) {                                                 // Запрос на выполнение сброса (Reset)
            soft_reset();
        } else if (_cmd == 0xB0) {                                          // Запрос [Температуры внешнего датчика] / [Температуры внутреннего датчика] / [Влажности] / [Атмосферного давления]
            Packet_Prepare(&data_tx, 0x00); // 0x00 - Ошибок нет
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
            Packet_Append_16bit(&data_tx, ex_sensor_temp_ds18b20);
            Packet_Append_8bit(&data_tx, ex_sensor_temp_dth11);
            Packet_Append_8bit(&data_tx, ex_sensor_humidity_dth11);
            Packet_Append_16bit(&data_tx, ex_sensor_pressure_mpx4115);
        } else if (_cmd == 0xB1) {                                          // Запрос [Температуры внешнего датчика]
            Packet_Prepare(&data_tx, 0x00); // 0x00 - Ошибок нет
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
            Packet_Append_16bit(&data_tx, ex_sensor_temp_ds18b20);
        } else if (_cmd == 0xB2) {                                          // Запрос [Температуры внутреннего датчика]
            Packet_Prepare(&data_tx, 0x00); // 0x00 - Ошибок нет
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
            Packet_Append_8bit(&data_tx, ex_sensor_temp_dth11);
        } else if (_cmd == 0xB3) {                                          // Запрос [Влажности]
            Packet_Prepare(&data_tx, 0x00); // 0x00 - Ошибок нет
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
            Packet_Append_8bit(&data_tx, ex_sensor_humidity_dth11);
        } else if (_cmd == 0xB4) {                                          // Запрос [Атмосферного давления]
            Packet_Prepare(&data_tx, 0x00); // 0x00 - Ошибок нет
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
            Packet_Append_16bit(&data_tx, ex_sensor_pressure_mpx4115);
        } else {
            Packet_Prepare(&data_tx, 0x2A); // 0x2A - Неизвестная команда
            Packet_Append_8bit(&data_tx, _cmd); // CMD bit
        }
        Packet_Append_CRC(&data_tx);
        Packet_Send(data_tx);
    } else {
        // Подготовка пакета ошибки CRC
        Packet_Prepare(&data_tx, 0x2F); // 0x2F - Ошибка CRC
        Packet_Append_CRC(&data_tx);
        Packet_Send(data_tx);
    }
}
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,522
14.11.2015, 23:04 42
int8_t - знаковое восьмибитное число - [-128...127]. Значения, с которыми вы сравниваете эту переменную - беззнаковые, и все больше 127ми. Используйте беззнаковый тип для этой переменной.

И еще такую структуру можно описать с помощью switch()...case...break...
1
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
15.11.2015, 10:13  [ТС] 43
ТОЧНО!!! должно быть uint8_t - Спасибо! Мелочь, а так незаметна

Добавлено через 10 часов 7 минут
Осталось повесить датчики скорости ветра и направления. Атмосферка еще в пути

Добавлено через 2 минуты
по поводу "И еще такую структуру можно описать с помощью switch()...case...break..."

для компиляторов и вообще что более гуманно и целесообразнее использовать switch/case/break или if/then/else

Или тут сугубо на любителя?
0
ФедосеевПавел
Модератор
4250 / 2340 / 939
Регистрация: 01.02.2015
Сообщений: 7,730
15.11.2015, 10:36 44
Цитата Сообщение от Calligraff Посмотреть сообщение
для компиляторов и вообще что более гуманно и целесообразнее использовать switch/case/break или if/then/else
IMHO, забота о компиляторе пусть лежит на разработчиках компилятора. Потому, что актуальная сегодня предварительная оптимизация, может быть нивелирована качеством компилятора в следующих версиях. А код будет нечитаемым. И как следствие - содержащим ошибки. Это из разряда "какой цикл оптимальнее for, do while, while".
0
ValeryS
Модератор
7483 / 5666 / 725
Регистрация: 14.02.2011
Сообщений: 19,370
Завершенные тесты: 1
15.11.2015, 11:51 45
Цитата Сообщение от Calligraff Посмотреть сообщение
для компиляторов и вообще что более гуманно и целесообразнее использовать switch/case/break или if/then/else
компиляторы чаще оптимизируют switch
вместо кучи сравнений создаст таблицу переходов
но ФедосеевПавел прав? читать то листинг будет человек а не компилятор,а с кучей
Цитата Сообщение от Calligraff Посмотреть сообщение
if/then/else
сам через неделю забудешь, и заплюхаешься

Не по теме:

кстати в Си нет then:)


и еще,порекомендую, вместо "волшебных чисел" использовать псевдонимы
типа
C
1
#define COMMAND1 0xB0
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
06.12.2015, 19:04  [ТС] 46
Лучший ответ Сообщение было отмечено Voland_ как решение

Решение

Ну вроде как собрал... единственное смущают некоторые момент, такие как организация питания (что-то я намудрил, или даже недомудрил).
да и так в общем может подскажите ошибки, или возможные улучшения.

Спасибо заранее.

Обмен данными между МК через RS-485 (MAX487)
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
06.12.2015, 19:11  [ТС] 47
Вообще с питанием была следующая идея:
На контроллере всего этого дела (а эта схема лишь 1 из множества устройств, которые подключены к контроллеру по шине RS485) организовано бесперебойное питание в 24 вольта. Так как устройства разбросаны по дому и связаны кабелем витой пары, то чем длиннее кабель, тем больше падение напряжения. в итоге приходящее питание к устройству стабилизируется до 12 вольт для релюшек и других устройств потребляющих до 1 ампера, далее до 5 вольт для питания микроконтроллера и различных датчиков и 3.3 вольта для датчиков BMP180 и RF-радиомодуля.
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,522
07.12.2015, 19:59 48
последовательно с диодами к базам транзисторов нужны резисторы для ограничения тока базы, есть сомнение, что i2c будет работать с вашим согласованием уровней, просто так не пробовал (если частота меги не более 8МГц, то ее можно питать от 3.3В). Опять же, я уже не помню может ли 24l01 иметь уровни 5В на SPI при питании 3,3В?
Почему C8 завязан на плюс, а не на землю?
Логика подсказывает не использовать реле на 12В, а использовать на 24В и питать его напрямую от источника - меньше токи, меньше помех.
ЗЫ: использовали бы NRF24LE1. У него все есть из того, что вы нарисовали, только все в одном камне, кроме драйвера RS485 ). Ну, программатор для нее надо докупить, если еще нету... А так - 8051-based не намного отличается от AVR, если писать на сях.

Добавлено через 6 минут
Цитата Сообщение от Calligraff Посмотреть сообщение
тем больше падение напряжения.
посчитайте падение на витой паре обязательно! Потому что потом либо придется ставить твердотельные реле, либо отказываться от витой пары. Такое уже было в реальном проекте...

Добавлено через 2 минуты
...и на 3.3В обязателен электролит или тантал на 10-47мкф. Может даже больше.
1
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
07.12.2015, 22:29  [ТС] 49
По поводу сглаживающего кондера - он есть. не дорисовал на схеме.
Питание АЦП исправил - Спасибо.

Про согласование уровней и 24L01 делал по аналогии со статьей ЛОГГЕР ТЕМПЕРАТУРЫ 2.0

По поводу падения напряжения на витой паре - завтра попробую опытным путем на бухле в 305 метров и сравню с расчетами по формуле.

"Логика подсказывает не использовать реле на 12В, а использовать на 24В" - втом-то и дело, что после 100-150 метров витухи может и не быть этих 24 вольт...
В начале стоит 24 ИБП Скат 2400

Можно подробнее (желательно с номиналами) про "последовательно с диодами к базам транзисторов нужны резисторы для ограничения тока базы".
Спасибо.
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
07.12.2015, 23:25  [ТС] 50
по поводу nRF24L01 покопался в DS..

вроде как 5V нормуль:

Обмен данными между МК через RS-485 (MAX487)

Причем выходные пины где MAX равное VDD 3.3, как я понимаю, должны быть достаточными для понимания atmeg`ой?
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
07.12.2015, 23:51  [ТС] 51
Добавил сопротивления R11 - R14, отделив линию программатора от радиомодуля. надеюсь нормальной работе шины эти 10к резисторы особо не навредят. а может и вообще не навредят.

почитал тут неплохой
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
07.12.2015, 23:58  [ТС] 52
А схемку-то измененную забыл

Обмен данными между МК через RS-485 (MAX487)
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,522
08.12.2015, 01:41 53
Цитата Сообщение от Calligraff Посмотреть сообщение
эти 10к резисторы особо не навредят
смотря на какой скорости делать обмен. Резисторы там не нужны. Максимум - 47-100Ом. Резисторы "валят" фронты сигналов, что при увеличении частоты приводит к нечеткой сработке сигналов и как следствие - ошибкам в данных.
Цитата Сообщение от Calligraff Посмотреть сообщение
Про согласование уровней и 24L01 делал по аналогии со статьей
я не против. Двунаправленное согласование уровней примерно так и делается - найдите еще хоть какой-нибудь пример. Кстати, согласно источнику статьи - вы не дорисовали схему. По поводу применимости - как сделаете, отпишитесь. Интересно, получилось ли сделать I2C по этому принципу без ошибок на шине.
И резисторов на базах управляющих транзисторов что-то не увидел. Без них вы спалите выходы МК.
L1 подключен неправильно. Для силового питания МК он как раз таки не нужен. Если только это не ферритовый фильтр, а таки катушка.
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
08.12.2015, 09:20  [ТС] 54
Цитата Сообщение от Voland_ Посмотреть сообщение
Кстати, согласно источнику статьи - вы не дорисовали схему.
Когда я смотрел пример этого "логгера температуры 2.0", то меня смутили моменты с сопротивлениями подтягивающими Vcc +5V
На картинке я обозначил их соответствующими цветами.

Ведь в итоге запараллелины сопротивления R6+R8 и R3+R7 и каждая эта пара дает в итоге что-то около 3.2кОм
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
08.12.2015, 09:33  [ТС] 55
Обмен данными между МК через RS-485 (MAX487)
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,522
08.12.2015, 11:47 56
Calligraff, вы просто предусмотрите эти резисторе в схеме, а потом будете думать - нужны они или нет ). В вашем примере эти резисторы могут быть по 10к, что в "параллели" дает 5к подтяжки. Но... фишка ведь в том, что они по обоим концам транзистора. На мой взгляд, это и дает возможность держать уровни с обоих сторон.
1
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
08.12.2015, 19:59  [ТС] 57
Изменения отметил для удобства:
0
Миниатюры
Обмен данными между МК через RS-485 (MAX487)  
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
08.12.2015, 20:06  [ТС] 58
Снова не то прицепил. Вот последний вариант:

Обмен данными между МК через RS-485 (MAX487)
0
Calligraff
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
10.12.2015, 15:34  [ТС] 59
Voland_, Я правильно понял ваши замечания (см. схему выше)?
0
Voland_
1694 / 1038 / 98
Регистрация: 04.01.2010
Сообщений: 3,522
10.12.2015, 16:55 60
Нормально. я бы проверил еще питание МК, чтобы убедиться, что скрытые его ноги берут его оттуда, откуда надо.
1
10.12.2015, 16:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2015, 16:55

Обмен данными между 2 клиентами через интернет
Пожалуйста, подробно опишите, как сделать обмен данных через интернет между клиентами. На с++, или...

Обмен данными между БП и УТ на 1С 8.2 через OLE, ADO
Посоветуйте какие-нибудь статьи, книги, видео уроки по обмену данными между БП и УТ на 1С 8.2 через...

Обмен данными через указатель между потоками
Скажите, валидный ли такой код : #include <iostream> #include <thread> using namespace std;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru