реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Пытаюсь смоделировать RS485 на Протеусе
xoz
сообщение Mar 22 2009, 12:45
Сообщение #1





Группа: Участник
Сообщений: 14
Регистрация: 22-12-08
Пользователь №: 42 655



Доброго времени суток. Я тут пытаюсь смоделировать небольшое устройство использующее 485 протокол, но как вы наверное поняли не тут то было wacko.gif
использую:
Proteus 7.2 и CVAVR 1.25.5
Модели ATmega128, ATmega8, MAX487

Проблема следующая:
При построении передачик-приемник все работает данные посылаются одним и принимаются другим МК. При попытке ответа на запрос(переключение приемник- передачик или наоборот) перестает работать даже в одностороннем порядке.
В приложении проект.
Может быть 485 драйвер надо переключать по особому? Пролазил форумы и документации пока ничег

Сообщение отредактировал xoz - Mar 22 2009, 12:59
Прикрепленные файлы
Прикрепленный файл  source.rar ( 98.87 килобайт ) Кол-во скачиваний: 56
 
Go to the top of the page
 
+Quote Post
Vetal-Soft
сообщение Mar 22 2009, 13:58
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 60
Регистрация: 16-06-05
Пользователь №: 6 074



Цитата(xoz @ Mar 22 2009, 17:45) *
Может быть 485 драйвер надо переключать по особому? Пролазил форумы и документации пока ничег


))) по особому... включаем передатчик - выключаем пиемник и на оборот. Выводы RE и DE соединить вместе. Ну и заглянуть в даташит на max487.
Go to the top of the page
 
+Quote Post
xoz
сообщение Mar 22 2009, 15:01
Сообщение #3





Группа: Участник
Сообщений: 14
Регистрация: 22-12-08
Пользователь №: 42 655



Я так и делал. RE и DE пробовал вместе соединять.
может дело в задержках? В нете люди советовали не использовать delay_ms буду пробовать.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Mar 22 2009, 16:10
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Из "test8__.c":
Код
#asm("cli") // не надо этого, вы и так в обрабочике прерывания, флаг I сброшен -- прерывания запрещены
TRANSF; // переключаемся на передачу
delay_ms(5); // одного такта хватит чтобы нога порта переключилась, не надо так много
putchar('r'); // ну и где определена эта функция? что она вообще делает? в исходнике под второй МК она есть, обратите внимание, раз код писал за вас IDE компилятора
while(!(UCSRA & (1<<UDRE))); // ошибка, ждать надо флаг TXC (а лучше бы вообще прерыванием пользоваться)
RECIVE; // и уже потом переключаться на прием
#asm("sei") // ошибка, разрешать прерывания не надо -- вложенные прерывания получаются

Во втором исходнике аналогичные косяки.
Схему не смотрел, Proteus'а нет.

PS: в макросах, в #define, точки с запятой не ставятся -- не принято.
Go to the top of the page
 
+Quote Post
xoz
сообщение Mar 23 2009, 07:27
Сообщение #5





Группа: Участник
Сообщений: 14
Регистрация: 22-12-08
Пользователь №: 42 655



Спасибо огромное!
Для МК программировать начал недавно изза этого столько косяков в коде.
Проблему решил подругому:
Использовал только прерывания таймера. Первый такт открываю на посылку, второй такт отправляю данные, третий такт проверяю состояние и закрываю, жду четыре такта и считываю данные. За четыре такты слейв успевает отправлять ответ. Может криво написано но заработало с первого раза.


Не подскажите где можно посмотреть и поучится(уму разуму) хорошему коду. В просторах Инета очень много для начинающих а нормального кода встретиш мало, да и кто покажет smile.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 03:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016