Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Пытаюсь смоделировать RS485 на Протеусе
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
xoz
Доброго времени суток. Я тут пытаюсь смоделировать небольшое устройство использующее 485 протокол, но как вы наверное поняли не тут то было wacko.gif
использую:
Proteus 7.2 и CVAVR 1.25.5
Модели ATmega128, ATmega8, MAX487

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


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

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

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


Не подскажите где можно посмотреть и поучится(уму разуму) хорошему коду. В просторах Инета очень много для начинающих а нормального кода встретиш мало, да и кто покажет smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.