Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/74: Рейтинг темы: голосов - 74, средняя оценка - 4.82
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
1

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток.

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

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

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

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

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

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

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

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

Обмен данными между телефонами через интернет
Здравствуйте! Идея заключается вот в чем: я не так давно начал изучать java под android и сейчас...

86
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
10.12.2015, 22:10  [ТС] 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Voland_ Посмотреть сообщение
я бы проверил еще питание МК, чтобы убедиться, что скрытые его ноги берут его оттуда, откуда надо
Это ведь только схема.
Отладку провожу на железе (Proteus`у уже не доверяю....).
Питание к МК идет от VCC 5V
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
15.12.2015, 08:55  [ТС] 62
Цитата Сообщение от Voland_ Посмотреть сообщение
L1 подключен неправильно. Для силового питания МК он как раз таки не нужен. Если только это не ферритовый фильтр, а таки катушка.

Такой? КИГ 0.1- 120 мкГн, 10%-20%, Катушка индуктивности
Или такой? EC24-121K, 120 мкГн, 10%, Индуктивность

Добавлено через 3 минуты
Вообще по этой катушке информацию находил в Ликбезе по МК рисунок 2
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
15.12.2015, 12:17 63
Цитата Сообщение от Calligraff Посмотреть сообщение
Такой?
Я ж не знаю что вы хотите. ) если вы АЦП контроллера не собираетесь ничего мерять - можете вообще "понять и простить" этот AVCC и запитать его от 5В напрямую. Если хотите убрать высокочастотные шумы, ставьте хоть что-нибудь. Я ставил фильтры, типа вот таких.
ЗЫ: обычно их полно в компьютерной технике (выпаивал со старых плат винчестеров).
2
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
15.12.2015, 20:51  [ТС] 64
Последний вариант:

Вроде нигде не ошибся... пойду на макетке собирать...

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


Убрал из схемы релюшки, так как управляющая часть будет на отдельном канале для быстроты реакции

Огромное спасибо Voland`у
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
15.12.2015, 21:11 65
Цитата Сообщение от Calligraff Посмотреть сообщение
Огромное спасибо Voland`у
сначала собери
Цитата Сообщение от Calligraff Посмотреть сообщение
пойду на макетке собирать...

Не по теме:

а если хочешь очень поблагодарить нажми "отзыв" репа сильно повысится:) или понизится смотря куды нажмешь

1
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
15.12.2015, 21:29 66
Цитата Сообщение от ValeryS Посмотреть сообщение
сначала собери
поддерживаю. Но схема действительно не сложная. Calligraff, а зачем вы CS выводите на ISP?
1
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
15.12.2015, 21:35  [ТС] 67
Цитата Сообщение от Voland_ Посмотреть сообщение
а зачем вы CS выводите на ISP?
Оу.. точно! Там GND должен быть. Спасибо!
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
15.12.2015, 22:11  [ТС] 68
Ну она уже собрана частично. не воткнут только BMP180 и NFR`ка
Update:
Обмен данными между МК через RS-485 (MAX487)
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
24.12.2015, 07:34  [ТС] 69
Проверил работу вот этой части схемы. Все отлично. двунаправленное согласование уровней работает
Обмен данными между МК через RS-485 (MAX487)
2
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
03.03.2016, 21:22  [ТС] 70
Ну вот и подошло к концу проектирование и сборка опытного образца (в кол-ве 17 штук )) ) моей метеостанции.. произвел некоторые изменения.. но о них позже. как и фото
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
06.05.2016, 11:02  [ТС] 71
Доброго времени суток.
Чего-то никак не получается получить в коде функции длину массива uint8_t dat[]

Обращаемся к функции:

C++
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
// Macros of Array len
#define N_ELEMENTS(X) (sizeof(X)/sizeof(*(X)))
 
.......
Packet_Append_TLV(data_pack, 0x01, "Calligraff Meteostation Mini"); // САМО ОБРАЩЕНИЕ
.......
 
// Добавление TLV в пакет данных
void Packet_Append_TLV(st_data_pack *data_pack, uint8_t tag, const char dat[])
{
    //len = N_ELEMENTS(dat); - НЕ РАБОТАЕТ
    //len = Packet_Len(dat); - НЕ РАБОТАЕТ
    Packet_Append_8bit(data_pack, tag);
    Packet_Append_8bit(data_pack, len);
    for (int i=0; i < len; i++) {
        Packet_Append_8bit(data_pack, dat[i]);
    }
}
 
// Определение длины пакета
uint8_t Packet_Len (uint8_t data_pack[])
{
    uint8_t* p_data_pack = (uint8_t*)data_pack;
    uint8_t len = strlen((char*)p_data_pack);
    return len;
}
В итоге ни N_ELEMENTS(dat); - НЕ правильно считает и Packet_Len(dat); - НЕ правильно считает

Подскажите правильный способ. Спасибо.
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
06.05.2016, 14:15 72
Обычно в функцию передается указатель на массив и длина массива. Это, по крайней мере, общепринятый принцип в Си.
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
06.05.2016, 15:33  [ТС] 73
Так - то оно так, но как передавать длину массива, если заранее не известна его длина? Т.е. ее все равно нужно вычислить. Вопрос как?

Добавлено через 11 минут
А если так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
......
Packet_Append_TLV(data_pack, 0x01, "Calligraff Meteostation Mini"); // САМО ОБРАЩЕНИЕ
.......
 
// Добавление TLV в пакет данных
void Packet_Append_TLV(st_data_pack *data_pack, uint8_t tag, const char dat[])
{
    // Добавляем Tag
    Packet_Append_8bit(data_pack, tag);
 
    // Вставляем 0x00 вместо длины и запоминаем позицию
    Packet_Append_8bit(data_pack, 0x00);
    uint8_t _pos = data_pack->length;
 
    // Добавляем данные
    uint8_t _tmpIdx=0;
    while( dat[ _tmpIdx ] != '\0' )
        Packet_Append_8bit(data_pack, dat[ _tmpIdx ]);
        _tmpIdx++;
    }
    // Вставляем длину в запомненное место место
    Packet_Append_8bit_InFixPos(data_pack, _pos, _tmpIdx);
}
Кстати, попутный вопрос.

Можно ли заменить
C++
1
2
data_pack->data[data_pack->lenght] = dat;
data_pack->lenght++;
на
C++
1
data_pack->data[data_pack->lenght++] = dat;
где - то видел подобную реализацию.
Только не понятно сначала присвоится значение в data_pack->data, а потом увеличится data_pack->lenght на единицу или наоборот?
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,523
06.05.2016, 15:56 74
Цитата Сообщение от Calligraff Посмотреть сообщение
Так - то оно так, но как передавать длину массива, если заранее не известна его длина?
а как ты память под массив выделять будешь?
Цитата Сообщение от Calligraff Посмотреть сообщение
Т.е. ее все равно нужно вычислить. Вопрос как?
по разному, для статического массива можно использовать sizeof
строка размер определяет по терминальному 0

Добавлено через 17 минут
Цитата Сообщение от Calligraff Посмотреть сообщение
Можно ли заменить
можно
Цитата Сообщение от Calligraff Посмотреть сообщение
Только не понятно сначала присвоится значение в data_pack->data, а потом увеличится data_pack->lenght на единицу
именно так
Цитата Сообщение от Calligraff Посмотреть сообщение
или наоборот?
тогда было бы

C
1
data_pack->data[++data_pack->lenght] = dat;
почитай про пост (i++)и пре(++i) инкремент/декремент
2
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
11.05.2016, 22:26  [ТС] 75
Снова доброго времени суток.

Подскажите как не студенческим методом слить два массива uint8_t в один путем добавления одного в другой с определенной позиции?
как бы с массивом char проблем нет - strcat(des, src) и готово, но с uint8_t не покатит.

пример:
C++
1
2
3
4
5
#define PACK_BUFFER_SIZE 256;
...
 
uint8_t _tmpPacket_1[PACK_BUFFER_SIZE] = {0x01,0x02,0x03};
uint8_t _tmpPacket_2[PACK_BUFFER_SIZE] = {0x04,0x05,0x06,0x07,0x07,0x09,0x0A,0x0B};
как в итоге получить uint8_t _tmpPacket_3[PACK_BUFFER_SIZE]
который будет содержать: {0x01,0x02,0x03, 0x04,0x05,0x06,0x07,0x07,0x09,0x0A,0x0B}
не используя циклы и переборы.

P.S. Первые 25 тем которые выдались в поиске по форуму результат не дали
0
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
11.05.2016, 22:34 76
Цитата Сообщение от Calligraff Посмотреть сообщение
не используя циклы и переборы.
в общем случае, исходя из представленных данных (и даже убрав ошибки из кода) - никак. Но можно обращаться к элементам вашего "волшебного массива", чтобы массив был одним. Примерно вот так:
C
1
2
#define get_tmpPacket_3(a) ((a<3)?_tmpPacket_1[a]:_tmpPacket_2[a-3])
#define set_tmpPacket_3(a,b) {if (a<3) _tmpPacket_1[a]=b; else _tmpPacket_2[a-3]=b;}
Но я бы так делать не стал, слишком много действий. Чтобы объединить два набора данных в одну структуру, надо чтобы они были без лишних данных.
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
11.05.2016, 22:35 77
Цитата Сообщение от Calligraff Посмотреть сообщение
как бы с массивом char проблем нет - strcat(des, src) и готово, но с uint8_t не покатит.
если учесть, что uint8_t псевдоним char то высказывание сильное.
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
11.05.2016, 22:58  [ТС] 78
C++
1
2
3
 uint8_t src[20] = {4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 uint8_t dst[20] = {1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
 memmove(dst+3, src, 6);
В результате dst содержит {1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0,0}

или могут быть грабли?
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
11.05.2016, 23:03 79
и что не так?
0
3 / 3 / 1
Регистрация: 26.07.2013
Сообщений: 46
11.05.2016, 23:08  [ТС] 80
в посте #78. ну попробовал таким образом - получается вроде все хорошо, но не попадутся ли грабли связанные с памятью?
0
11.05.2016, 23:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2016, 23:08
Помогаю со студенческими работами здесь

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

Обмен данными через COM- соединение между разными конфигурациями
Добрый день! Может быть кто знает в чем может быть причина вот этой проблемы? Есть база 1С...

Обмен данными между программой и сервисом через NamedPipe
Всем доброго времени суток. Друзья, у меня такая проблема: Создаю сервис, на OnExecute создаю...

Обмен данными между процессами через именованные каналы
Добрый день. У меня есть код, который создает 3 процесса-потомка, я пронумеровала каждый из них,...

Обмен данными между формами через нестатические члены
Вопрос выделен из темы Обсуждение FAQ &quot;Ответы на 7 самых частых вопросов по WinForms&quot; ...

Обмен данными между процессами в линуксе через pipe
После закомменчивания части кода записывающей в 1 файл из 2 других программы, она перестала...


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru