Задача: дополнить (видоизменить) код на С (в CodeVisionAvr) , чтобы получить работу функций приема/передачи (getchar, putchar) по RS485. Тестирование функций - с помощью терминала по схеме: Комп/RS232/RS485==========RS485/ USART0 MEGA2560.
Исходные данные:
1)Работающий на прерываниях RX Complete, TX Complete (проверенный на железе) автоматич. код программы обмена по RS-232. Комп/RS232==================RS23 2/USART0 MEGA2560.
2)Собранная схема: Комп /RS232/RS485==========RS485/USAR T0 MEGA2560 (считаем что аппаратная часть схемы работает). Переключение прием/передача с помощью вывода PE7.
Задача: дополнить (видоизменить) код, чтобы получить работающие ф-и putchar(), getchar() в CV_AVR с интерфейсом RS485 (для тестирования функций получения/отправки символа с помощью терминала).
При переделке кода возможно потребуются:
- прерывание USART0_UDRE в добавок имеющимся USART0_RXC, USART0_TXC. (в коде уже присутствует функция обработчика в закомментированном виде).
- идентификаторы включения приема/передачи(TX() и RX() (уже описаны в коде)
- внесение паузы между приемом и передачей размером 1mc (2mc). //по совету Ю.Ревича t(сек)=1*10/9600, где 10 число бит в посылке, 9600 скорость обмена//
Столкнулся с трудностями при реализации. Буду признателен, кто поможет решить данную задачу.
1. trail777 - 28 Сентября, 2011 - 22:20:37 - перейти к сообщению
2. Роботов - 29 Сентября, 2011 - 11:54:55 - перейти к сообщению
trail777 пишет:
Задача: дополнить (видоизменить) код, чтобы получить работающие ф-и putchar(), getchar() в CV_AVR с интерфейсом RS485 (для тестирования функций получения/отправки символа с помощью терминала).
Приём ( getchar()) ни чем не отличается. А вот что бы передать символ с помощью putchar() надо
1. открыть передатчик,
2. передать данные,
3. дождаться конца передачи (по флагу),
4. закрыть передатчик.
5. сбросить флаг конца передачи.
6. можно осуществлять приём.
Я делаю так:
CODE:
PORTD.2=1; // открыть передатчик в вашем случае TX()
putchar(символ); // передать запрос
while(!UCSRA.6); // ждать конца передачи
PORTD.2=0; // закрыть передатчик в вашем случае RX()
UCSRA = (1<<6); // сбросить флаг конца передачи
PORTD.2=1; // открыть передатчик в вашем случае TX()
putchar(символ); // передать запрос
while(!UCSRA.6); // ждать конца передачи
PORTD.2=0; // закрыть передатчик в вашем случае RX()
UCSRA = (1<<6); // сбросить флаг конца передачи