На главную |  Проекты |  Гостевая книга |  Добавить в избранное |  Сделать стартовой |  Обратная связь

Автор: Дмитрий Богомолов mars@mit8.ru

Sanchos:

В исходнике я нашел ошибку:
НЕЛЬЗЯ настраивать ножки порта по отдельности (это подтверждено проведенным экспериментом). Фишка в том, что как только выставляешь регистр управления порта на настройку в автоинкриментном режиме ноги по умолчанию переходят на выход. Настраивать надо весь порт сразу, а если сначала одну ногу, а потом вторую, то настройки первой сбрасываются.
Вот такая вот фигня. :-(
А засуетился я потому, что сигнал с МОП на входную ножку проходить не хотел (я вместо транзисторной схемы использовал 176ла7 и резюк на входе), только с транзистора (как на схеме). При приеме данных ток потребления заметно возрастал. После внесения изменений в программу потребление тока стало стабильнее и сигнал с МОП стал проходить совершенно свободно. :-)
И еще: скорее всего именно с этой ошибкой было свызано то, что когда контроллер передавал на комп длинную последовательность байтов, а комп случайно, в это же время, пытался ему ответить, контроллер немного зависал и перезапускался только после выключения питания.
Если я не прав, напишите, будем проверять дальше.

Дмитрий:
Данная программа работает с компьютером по интерфейсу RS232, в полудуплексе на скорости 9600 бод при кварцевом резонаторе 1.843.200 питание 5 Вольт, потребление в режиме ожидания 3.7 ма. Входная часть взята из программатора Атмела avr910.pdf, питание от com-порта через линии RTS и DTR через диоды шотки и стабилизатор 78L05. Алгоритм работы взят Микрочиповский из AN555C, кому интересно, читайте в оригинале, коротко смысл такой.
Для детектирования старт бита таймер счётчик подключается к входной ножке, счёт идёт по спаду, в регистр интервала пишется 1. При появлении старт бита, перепад от 1 к 0, происходит переполнение счётчика и вырабатывается прерывание на процессор. Затем таймер переконфигурируется на счёт от кварца, без предделителя, и в регистр интервала пишется такое значение, чтобы прерывание пришлось на середину старт бита (длина бита на данной скорости делённая пополам). По прерыванию читается приёмная нога и её значение задвигается в буфер данных. Затем в регистр интервала пишется значение, равное длине принимаемого бита (1843200 / 9600 = 192, 0c0h) и по следующим прерываниям считывается весь байт, бит чётности и стоп бит.
Преимущество данного способа в том, что для работы необходимо только одно прерывание таймера. При передаче в таймер загружается длина бита и по прерываниям от таймера, циклически сдвигая регистр с данными, последовательно передается весь байт, со старт и стоп битами. При приёме возможна работа любой другой программы, при передаче нужно ждать пока не уйдёт весь байт.
При инициализации ножек RX и TX, функции остальных ног не меняются. - Это и есть ошибка, а жаль. В данном примере программа принимает байт с компьютера, добавляет к нему 1, и передаёт обратно.
Для теста устройства лучше использовать программу Term95, она идёт в комплекте к нортон-командеру, хотя можно использовать и другие, работающие с com-портами (датаскоп, дос-навигатор).
При этом необходимо, чтобы на линиях RTS и DTR были установлены логические 1 (+12 Вoльт) для питания микроконтроллера. Выставив номер порта и скорость передачи можно наблюдать, как в ответ на посланный байт приходит увеличенный на 1, особенно прикольно, когда посылаешь цифры :-)
Вот исходник:
uart1.mic - оригинал
Корректированный вариант положу попозже, сейчас времени нету.

Алгоритм UART:

на главную | проекты

Created by DAstudio
Hosted by uCoz