|
Не Могу Настроить Uart->485 На Pic16F689 |
|
|
|
May 24 2013, 17:10
|

Участник

Группа: Участник
Сообщений: 24
Регистрация: 24-05-13
Пользователь №: 76 966

|
Здравствуйте! Такая проблема: мне нужно передавать данные на ПК. Использую драйвер 485 интерфейса ADM485ARZ и преобразователь интерфейсов Меркурий-221. Приём на ПК контролирую программой RS232 PRO v3.30. Обмен происходит на скорости 2400. Асинхронная передача, 8 бит данных, без чётности, один стоповый бит. Вот схема...
Вот код... Код /*-------------------------------------------------------------------------*/ //Head... /*-------------------------------------------------------------------------*/ #include <htc.h> #include <pic16f689.h>
#define _XTAL_FREQ 20000000
__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & IESO_ON & FCMEN_ON);
/*-------------------------------------------------------------------------*/
void main() { //Init hard... /*-------------------------------------------------------------------------*/ //UART...
TXSTA = 0b00000000; RCSTA = 0b10000000; SPBRG = 129; TXEN = 1; /*-------------------------------------------------------------------------*/ //INT...
INTCONbits.GIE = 0;
/*-------------------------------------------------------------------------*/ //Work cicle... START: /*-------------------------------------------------------------------------*/
if (TRMT == 1) {
TXREG = 0xAB; //Test TX!
};
__delay_ms(500);
/*-------------------------------------------------------------------------*/ //End work cicle. goto START; }; В результате отправляю "AB", а ПК принимает "F0F0F0F0"... Перепроверял... наверняка я что-то упускаю из вида или просто не знаю, т.к. я первый раз делаю такой обмен... Подскажите, в чём дело. Спасибо!
|
|
|
|
|
May 24 2013, 20:21
|

Участник

Группа: Участник
Сообщений: 24
Регистрация: 24-05-13
Пользователь №: 76 966

|
На 10-й ноге TX вижу такой кадр:
Если первый бит стартовый, то следующие восемь "11010101" похожи на данные. Учитывая, что данные передаются младшим битом вперёд, "10101011" - это и есть "AB". А вот как определить скорость... что-то не соображу... Один бит = 1 клетка, развёртка 2ms. Объясните пожалуйста как проверить. Спасибо.
|
|
|
|
|
May 24 2013, 21:36
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(Сергей Владимирович @ May 24 2013, 20:10)  Вот схема... Это точно полная схема? или та часть, которую Вы посчитали нужной показать? 1. Нет конденсаторов от кварца на землю. 2. Нет конденсатора по питанию на RS485 и на PIC18 Но это думаю не основное. По исходнику сказать что-то сложно, у меня, например, сейчас для PIC18 ничего не установлено. дайте хекс, тогда хоть правильность конфигурационных битов в симуляторе сразу видно будет, да и все прочее тоже. Про программу сходу вопрос: почему Вы не устанавливаете остальные относящиеся к USART регистр BAUDCTL в нужное состояние? ну ладно, пусть оно по ресету в нуле, тогда получается что BRGH == 0; BRG16 == 0; (иначе бы частота была еще больше, но не ниже как у Вас в реале) BR = 20e6/(64*130) = 2404 . похоже на то что нужно. Но осциллограф думает иначе. Значит несоответствие реальной частоты задающего генератора ожидаемой. Либо кварц и его обвязка виноваты, либо конфигурация неправильная. Очень может быть что просто кварц у вас гармониковый и заводится на своих 6.6 МГц. Или даже на 4 МГц. А не на 20. 1. обязательно поставьте конденсаторы от кварца в землю согласно даташиту. 2. Посмотрите осциллографом на 3-й ногеПИКа частоту, может и увидите на какой он заводится (обычно генерацию хорошо видно) 3. Попробуйте другой кварц, скажем на 4 МГц и сравните. 4. просто подадите извне частоту на 2-ю ногу заместо выпаянного кварца.
|
|
|
|
|
May 25 2013, 04:51
|

Участник

Группа: Участник
Сообщений: 24
Регистрация: 24-05-13
Пользователь №: 76 966

|
Нет, это полная схема, я откинул всё что можно... уже не знал на что думать, осталось только это... Вот HEX:
UART.production.rar ( 245 байт )
Кол-во скачиваний: 102Регистр BAUDCTL изначально установлен верно, я не стал ничего менять. Подскажите, а что это Вы посчитали BR = 20e6/(64*130) = 2404?? Я не понял. Далее выяснилось следующее: при помощи Terminal v1.9b установил скорость обмена 500, обмен пошел, "ABABAB...". Значит генератор не заводится на 20МГц... Что можно сделать?? Подскажите! По поводу "посмотрите осциллографом", у меня С1-55. На кварце генерации я не вижу, а обмен идёт... значит МК работает от внутреннего генератора... как это может быть???
Сообщение отредактировал Сергей Владимирович - May 25 2013, 04:52
|
|
|
|
|
May 25 2013, 07:46
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(Сергей Владимирович @ May 25 2013, 07:51)  Нет, это полная схема, я откинул всё что можно... уже не знал на что думать, осталось только это... Ну так конденсаторы на место поставьте от кварца на землю (15-20 pF). без них дальше и обсуждать нечего. раздел документации "3.4.3 LP, XT, HS MODES" Цитата(Сергей Владимирович @ May 25 2013, 07:51)  Вот HEX:
UART.production.rar ( 245 байт )
Кол-во скачиваний: 102Ну, что сказать: 1. конфигурационные биты нормально установлены. 2. Ваша задержка вместо 500 ms дает 10 ms. почему- уж сами с компилятором разбирайтесь, что у вас такое "__delay_ms(500);" 3. Согласно симулятору, байт передается 4160 us, это 2404 bps. Совершенно соответствует теории. Значит, программу не копайте, разбирайтесь с железом. Цитата(Сергей Владимирович @ May 25 2013, 07:51)  Подскажите, а что это Вы посчитали BR = 20e6/(64*130) = 2404?? Я не понял. ? Почитайте документацию на используемый микроконтроллер. раздел "12.0 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART)." Цитата(Сергей Владимирович @ May 25 2013, 07:51)  Значит генератор не заводится на 20МГц... Что можно сделать?? Подскажите! Вы мои пункты 1 2 3 4 читали? там есть план действий. И еще один пункт добавлю 5. запретить FCMEN в конфиге. тогда при неработающем внешнем кварце процессор не будет перескакивать на внутренний генератор. Это классическая ошибка программистов, добавляющая седых волос при тестировании и отладке. Особенно тяжело вылавливается, если внутренний генератор работает на частоте, очень близкой к частоте внешнего. Цитата(Сергей Владимирович @ May 25 2013, 07:51)  По поводу "посмотрите осциллографом", у меня С1-55. На кварце генерации я не вижу, а обмен идёт... значит МК работает от внутреннего генератора... как это может быть??? Если смотрели на третьей ноге (именно на 3й а не на 2й!) с делителем 1:10 (что-нибудь типа 10 МОМ 5 пФ) и ничего не видели (ну хоть пару десятков милливольт размах) - то 99% что генерации нет (1% оставляю на то, что генерация срывается в момент подключения щупа) Чудес не бывает, разберетесь, никуда не денетесь  тут главное- не вслепую тыкать авось заработает, а понимать что и зачем Вы делаете.
|
|
|
|
|
May 26 2013, 12:31
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(Сергей Владимирович @ May 26 2013, 15:10)  Вообщем проблема такая - нет генерации на внешнем кварце! Об UART-е уже и речи нет... Я недавно тоже плясал вокруг кварцевого генератора. Даже тема все-еще в топе висит. Не зная Вашего процессора, я порекомендовал бы такую последовательность - Найти рабочий (демо) борд, если такие существуют в природе и есть под рукой. На нем написать и отработать минимальный код для включения внешнего генератора. - Если на другом борде все работает, то начинать на своем заменять конденсаторы (Вы уверены что номиналы правильные?), затем кварц. Если и это не поможет - то заменить чип. В моем случае именно чип оказался неисправным. Но он вообще глючил сильно. В Вашем случае, скорее всего, чип нормальный.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|