Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не Могу Настроить Uart->485 На Pic16F689
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Сергей Владимирович
Здравствуйте! Такая проблема: мне нужно передавать данные на ПК. Использую драйвер 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"...

Перепроверял... наверняка я что-то упускаю из вида или просто не знаю, т.к. я первый раз делаю такой обмен...

Подскажите, в чём дело. Спасибо!
igorle
Я бы начал с того, что посмотрел осциллографом десятую ножку PICа. Померил ширину одного бита, прочитал байт. Убедился что скорость 2400 и передается именно 0xAB.
Сергей Владимирович
На 10-й ноге TX вижу такой кадр:

Нажмите для просмотра прикрепленного файла

Если первый бит стартовый, то следующие восемь "11010101" похожи на данные. Учитывая, что данные передаются младшим битом вперёд, "10101011" - это и есть "AB".

А вот как определить скорость... что-то не соображу... Один бит = 1 клетка, развёртка 2ms. Объясните пожалуйста как проверить. Спасибо.
aaarrr
Цитата(Сергей Владимирович @ May 25 2013, 00:21) *
А вот как определить скорость... что-то не соображу... Один бит = 1 клетка, развёртка 2ms. Объясните пожалуйста как проверить. Спасибо.

Ну, если один бит равен одной клетке, а в клетке 2 ms, тогда битовая скорость получается примерно 1/0.002 = 500

Похоже, ваш процессор работает на 4MHz (например, запрограммирован на работу от внутреннего RC).
Сергей Владимирович
Это возможно, но как быть с этим...

#define _XTAL_FREQ 20000000

__CONFIG(FOSC_HS...

...и кварцем на 20МГц??? Откуда взяться 4МГц???
aaarrr
Просто проверьте, что у Вас в слове конфигурации действительно записано то, что ожидается.
Ruslan1
Цитата(Сергей Владимирович @ 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-ю ногу заместо выпаянного кварца.
Сергей Владимирович
Нет, это полная схема, я откинул всё что можно... уже не знал на что думать, осталось только это...

Вот HEX: Нажмите для просмотра прикрепленного файла

Регистр BAUDCTL изначально установлен верно, я не стал ничего менять.

Подскажите, а что это Вы посчитали BR = 20e6/(64*130) = 2404?? Я не понял.

Далее выяснилось следующее: при помощи Terminal v1.9b установил скорость обмена 500, обмен пошел, "ABABAB...".

Значит генератор не заводится на 20МГц... Что можно сделать?? Подскажите!

По поводу "посмотрите осциллографом", у меня С1-55. На кварце генерации я не вижу, а обмен идёт... значит МК работает от внутреннего генератора... как это может быть???
Ruslan1
Цитата(Сергей Владимирович @ May 25 2013, 07:51) *
Нет, это полная схема, я откинул всё что можно... уже не знал на что думать, осталось только это...

Ну так конденсаторы на место поставьте от кварца на землю (15-20 pF). без них дальше и обсуждать нечего.
раздел документации "3.4.3 LP, XT, HS MODES"

Цитата(Сергей Владимирович @ May 25 2013, 07:51) *

Ну, что сказать:
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% оставляю на то, что генерация срывается в момент подключения щупа)

Чудес не бывает, разберетесь, никуда не денетесь sm.gif тут главное- не вслепую тыкать авось заработает, а понимать что и зачем Вы делаете.
Сергей Владимирович
1. Конденсаторы вернул;
2. Осликом генерацию не вижу;
3.,4. по поводу замены кварца и внешнего такта: выпаял кварц, а обмен продолжается на скорости 500!!! Значит я в своих настройках использую внутренний генератор! При всём этом FCMEN запретил!!!

Устал я, ничего не понимаю((( Как мне настроить МК на внешний кварц??? Отлажу до завтра, утро вечера мудренее...
Ruslan1
Цитата(Сергей Владимирович @ May 25 2013, 17:27) *
1. Конденсаторы вернул;
2. Осликом генерацию не вижу;
3.,4. по поводу замены кварца и внешнего такта: выпаял кварц, а обмен продолжается на скорости 500!!! Значит я в своих настройках использую внутренний генератор! При всём этом FCMEN запретил!!!

Устал я, ничего не понимаю((( Как мне настроить МК на внешний кварц??? Отлажу до завтра, утро вечера мудренее...

Чудес не бывает. Когда найдете причину- самому смешно станет, насколько все просто sm.gif

Попробуйте прочитать из МК то, что в него зашили и проверить биты конфигурации в этом прочитанном дампе. Может проблемы в программаторе или еще что не так (например, не тот тип МК выбран).
Сергей Владимирович
Вот тут-то как раз всё в порядке. Контрольная сумма и биты конфигурации совпадают.

Я не могу понять, что не верно в конфигурации???

__CONFIG(FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & IESO_ON & FCMEN_OFF);

Почему МК работает от внутреннего кварца???

Мне тут подсказали, что для внешнего кварца должно быть: IESO_OFF & FCMEN_OFF. С кварцами 12 и 20 МГц не работает, ровно как и перестало работать без кварца...

На 8 и 4МГц тоже не работает...
rx3apf
Может быть, используемый программатор не записывает фьюзы ? Или, чтобы записывал, надо где-то что-то выставить ?
Сергей Владимирович
Вряд ли! Я использую PICKit2, он показывает контрольную сумму прошивки и конфигурацию, после считывания они совпадают с загруженными.

Вообщем проблема такая - нет генерации на внешнем кварце! Об UART-е уже и речи нет...
igorle
Цитата(Сергей Владимирович @ May 26 2013, 15:10) *
Вообщем проблема такая - нет генерации на внешнем кварце! Об UART-е уже и речи нет...

Я недавно тоже плясал вокруг кварцевого генератора. Даже тема все-еще в топе висит. Не зная Вашего процессора, я порекомендовал бы такую последовательность
- Найти рабочий (демо) борд, если такие существуют в природе и есть под рукой. На нем написать и отработать минимальный код для включения внешнего генератора.
- Если на другом борде все работает, то начинать на своем заменять конденсаторы (Вы уверены что номиналы правильные?), затем кварц. Если и это не поможет - то заменить чип.

В моем случае именно чип оказался неисправным. Но он вообще глючил сильно. В Вашем случае, скорее всего, чип нормальный.
Сергей Владимирович
Да я с Вами согласен на 1000000%!!! Я всегда так и делал, но в нынешней ситуации всё нужно срочно и отладочную плату мне никто не купит!!! Кстати МК я менял, купил заранее несколько... результат "zero"!

Я сам не нанимался разработчиком! Меня брали в помощь главному инженеру проекта! Но он не оправдал надежд и его уволили. Концепция поменялась и всю работу повесили на меня, а я не обладаю достаточным опытом(((

Удалил всю программу. Пишу заново, параллельно читая документацию и определяя все регистры касательно тактовой частоты... если и так не выйдет... слов нет...
Tanya
Цитата(Сергей Владимирович @ May 25 2013, 19:24) *
Почему МК работает от внутреннего кварца???

Не читала про этот процессор, но некоторые другие ПИКи будут (должны) работать от внутреннего, если внешний не запускается. Попробуйте совсем убрать кварц и сконфигурировать работу от внутреннего генератора на 8 МГц. Если уж нужно именно кварц и именно 20 МГц, то ищите отдельный генератор на кварце. Только он потребляет больше...
Что-то у Вас с монтажом или платой. Что-то мне подсказывает.
Lagman
Я когда работал с PIC18 в MPLAB, то не указывал в исходнике _CONFIG параметры чипа а прописывал их отдельно в настройках программирования (за давностью уже не помню где точно, но помню не в исходнике точно).
Вот кусок из документации:
Код
MPLAB IDE recognizes configuration bits set in code with config directives or
commands. These values are displayed in the Configuration Bits window
(Configure>Configuration Bits). Values may be set in the Configuration Bits window as
well by deselecting ”Configuration Bits set in code”. Values set in the window override
code definitions in MPLAB IDE but do not change the source code. See
Section 9.2 ”Configuration Bits” for more information.
rx3apf
Цитата(Сергей Владимирович @ May 26 2013, 16:10) *
Вряд ли! Я использую PICKit2, он показывает контрольную сумму прошивки и конфигурацию, после считывания они совпадают с загруженными.

Вычитайте содержимое кристалла, а потом скажите, что конкретно программатор показывает в поле "Configuration" (шестнадцатиричное значение).
Сергей Владимирович
Настроил МК на внутренний генератор, 4 МГц. Всё работает, он у меня и меряет и данные ПК передаёт и индикацию обеспечивает. От внешнего кварца не работает! Что делать, ума не приложу. По поводу конфигурации... вот...

Нажмите для просмотра прикрепленного файла

Что же ещё нужно???
Tanya
Цитата(Сергей Владимирович @ May 27 2013, 19:30) *
Что же ещё нужно???

Рассказать про Вашу плату. Печатную?
Сергей Владимирович
Да там и рассказывать нечего: МК + кристалл 20МГц, 2 х 20пФ + 100нФ по питанию. Всё, больше ничего.
rx3apf
Попробуйте отключить бит FCMEN в конфигурации - может быть, генератор не успевает стартовать ? Определенное поле для экспериментов есть - отдельный внешний генератор 20 MHz на CMOS-инверторе и режим EC (работает/не работает), кварц на 4...8 MHz, XT - опять же, работает/не работает. Может быть избыточная емкость на выводах ? Плохо отмытый электропроводный флюс ? Еще "фантастическое" предположение - а, случаем, T1OSCEN не включен (случайно вдруг, при конфигурации промахнулись ?)
igorle
Кстати, да. Я тут полгода назад всех изводил вопросами - почему у меня оптрон не работает. А в конце концов оказалось - грязь проводящая между ножками. И фото борда с хорошим разрешением с обеих сторон тоже не повредит.
toweroff
Цитата(igorle @ May 27 2013, 22:48) *
И фото борда с хорошим разрешением с обеих сторон тоже не повредит.

кстати да! на фотографии все видно абсолютно не так, как глазами. Даже одним глазом. Даже с лупой
Сергей Владимирович
Я таймер ещё не использовал, собственно регистр не инициализировал. При сброс в симуляторе вижу что в нём все нули.

Фото сделаю вечером, дома. На работе нечем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.