Перейти к содержанию
    

[atmega16 UART] Помеха при работе

Всем добрый день,

 

Пытаюсь заставить корректно работать UART на меге для связи с компьютером, и вот что получается:

Исходные данные:

 

1. Схема по которой это все работает:

uart_810.gif

 

* Вот здесь брал описание: http://easyelectronics.ru/svyaz-mikrokontr...erez-rs232.html

 

2. Прошивка для мк:

* Она сгенерирована CodeWizard'ом в CVAVR на такие параметры:

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

 

Добавленная строчка в основном цикле:

UDR = 'R';

 

т.е - постоянно посылаем символ R

 

Вот что получаю на самом деле в терминале:

%%%%%%%%%%%ýIIIIIIIIIIIùRRRRRRRRRRRò***********ú•••••••••••õIIIIIIIIIIIùRRRRRRRRRRRò©©©©©©©©©©©é•••••••••••õ—%%%%%%%%%%åRRRRRRRRRRRò©©©©©©©©©©©ù•••••••••••õ%%%%%%%%%%%åíIIIIIIIIIIù©©©©©©©©©©©ù***********ú%%%%%%%%%%%ýIIIIIIIIIIIùRRRRRRRRRRRò***********ú%%%%%%%%%%%ýIIIIIIIIIIIùRRRRRRRRRRRò***********ú•••••••••••õIIIIIIIIIIIùRRRRRRRRRRRò©©©©©©©©©©©é•••••••••••õ%%%%%%%%%%%åRRRRRRRRRRRú©©©©©©©©©©©ùŸ**********ê%%%%%%%%%%%åíIIIIIIIIIIù©©©©©©©©©©©ù***********ú%%%%%%%%%%%ýIIIIIIIIIIIùRRRRRRRRRRR

 

Т.е. - как видно символ 'R' он таки передаёт, но помимо него шлется ещё куча всякого мусора. Откуда он берется и как главное с ним бороться?

 

Что уже попробывал:

 

1. Протестил саму прошивку в VMLAB - все четко, без ошибок, работает как часы.

 

2. Без контроллера, просто замкнул выводы TxD и RxD, и подал питание на схему - в терминале все тоже работает - переданные байты тутже возвращаются эхом назад.

 

3. Пробывал менять кварц 8мгц/4мгц, игрался с разными значениями бодрейта - не помогает.

 

Комбинация фьюзов что на меге сейчас (под кварцы 3-8мгц):

CKSEL0-3: 1111 SUT0-1: 11 CKOPT 1

(вообще, если это вдруг поможет - сейчас у меня все фьюзы выставлены в 1)

 

4. Монтаж проверял неоднократно - все в порядке

 

5. Пробывал также запускать UART использую бит паритета четный/нечетный - все равно мусор не уходит

 

Помогите пожалуйста побороть злостную помеху

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UDR = 'R';

 

И все?

 

Может надо подождать завершения передачи предыдущего символа (байта), перед отправкой нового?

Изменено пользователем Chameleon

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UDR = 'R';

 

И все?

 

Может надо подождать завершения передачи предыдущего символа (байта), перед отправкой нового?

всё просто. сбивается синхронизация по старт и стоп битам.

тестируйте так:

 

uart_putch(0x00);
uart_putch(0xff);
uart_putch('R');

тогда гарантированно войдёт в синхронизацию по "стопам" и "стартам".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

UDR = 'R';

 

И все?

 

Может надо подождать завершения передачи предыдущего символа (байта), перед отправкой нового?

 

Пробывал, также и с проверкой готовности регистра передачи:

while(!(UCSRA & (1<<UDRE)));
UDR = 'R';

 

результат тотже

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Судя по тому что вам выдается на ПК, у вас помеха с частотой около 100Гц. Смотрите осциллографом питание вашего МК.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробывал, как Вы сказали:

 

putchar(0x00);       
putchar(0xff); 
putchar(0x15);

 

Уже заметно лучше, но все же ещё кое где проскальзывает ошибочные данные (вот что в терминале [должно быть 00 FF 15 ]):

00 FF 15 00 FF [b]11 D0 15[/b] 00 FF 15 00 FF 15 [b]FF E8 15[/b] 00 FF 15 00 FF 15 00

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, какой конкретно мах232 у вас стоит, не к каждому можно конденсаторы по 0,1мк ставить, обычно там по 1мк ставят.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И схема настораживает - на участке от проца до макса Rx и Tx не перепутаны?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробуйте поставить значение UBRRL=25 (для 4МГц) или UBRRL=51 (для 8МГц)

смотреть стр. 169 описания.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробывал, также и с проверкой готовности регистра передачи:

while(!(UCSRA & (1<<UDRE)));
UDR = 'R';

 

результат тотже

Это неудивительно, поскольку у UART есть буферизация. Тогда уж стоило бы проверять не UDRE, а TXC. Но и то, скорее всего, эффект будет аналогичный. Чтобы гарантированно исключить вариант с ошибкой синхронизации, надо сделать задержку между посылкой байтов, хоть программную, на пару mS. Если и тогда будет мусор - разбираться с "землями" и наводками (а вообще-то обрыв проводника в соединительном кабеле - самое обычное дело).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не знаю как это получилось, но решил руководствуясь замечанием Dx! поменять местами RxD TxD (от max232 до меги) - и что самое интересное оно заработало! (Хотя я был уверен что при неправильном подключении просто ничего не будет происходить)

 

Как всегда - все оказалось банально до немогу. Постейшая невнимательность. Всем ОГРОМНОЕ спасибо.

Буду разбираться ещё немного и писать код под свою задачу - если что обязательно спрошу. Ещё раз всем спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если преобразователь RS232-TTL стоит возле компа, а TTL сигнал гоняется по длинным проводам, то не помешает экранированный провод.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обнаружилась следующая нехорошая вещь:

 

При таком соединении:

T2IN - TxD

R2OUT - RxD

 

UART работает как надо и нареканий нет, вот только на блоке питания спустя 1-2 минуты начинают жутко греться стабилизаторы (кренки)

Навряд ли там уарт такой большой ток кушает, начал искать кз. Схемы проверил, всё прозвонил - нигде нет.

 

Удалось установить, что:

Если я поменяю местами

T2IN - RxD

R2OUT - TxD

 

то перестает греться, но и уарт не работает как надо (куча мусора лезет - то что в начале было)

 

В каком направлении искать сие загадочную пакость?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот только на блоке питания спустя 1-2 минуты начинают жутко греться стабилизаторы (кренки)

Какое напряжение на входе кренки и какая кренка? (78L, 78F, 78C)?

Ток померять можете?

 

Первое включение - правильное. Второе - вход со входом, выход с выходом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...