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

Не Могу Настроить Uart->485 На Pic16F689

Здравствуйте! Такая проблема: мне нужно передавать данные на ПК. Использую драйвер 485 интерфейса ADM485ARZ и преобразователь интерфейсов Меркурий-221.

 

Приём на ПК контролирую программой RS232 PRO v3.30. Обмен происходит на скорости 2400. Асинхронная передача, 8 бит данных, без чётности, один стоповый бит.

 

Вот схема...

 

post-76966-1369415297_thumb.jpg

 

Вот код...

 

/*-------------------------------------------------------------------------*/
//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"...

 

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

 

Подскажите, в чём дело. Спасибо!

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


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

Я бы начал с того, что посмотрел осциллографом десятую ножку PICа. Померил ширину одного бита, прочитал байт. Убедился что скорость 2400 и передается именно 0xAB.

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


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

На 10-й ноге TX вижу такой кадр:

 

post-76966-1369426323_thumb.jpg

 

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

 

А вот как определить скорость... что-то не соображу... Один бит = 1 клетка, развёртка 2ms. Объясните пожалуйста как проверить. Спасибо.

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


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

А вот как определить скорость... что-то не соображу... Один бит = 1 клетка, развёртка 2ms. Объясните пожалуйста как проверить. Спасибо.

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

 

Похоже, ваш процессор работает на 4MHz (например, запрограммирован на работу от внутреннего RC).

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


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

Это возможно, но как быть с этим...

 

#define _XTAL_FREQ 20000000

 

__CONFIG(FOSC_HS...

 

...и кварцем на 20МГц??? Откуда взяться 4МГц???

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


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

Просто проверьте, что у Вас в слове конфигурации действительно записано то, что ожидается.

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


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

Вот схема...

 

Это точно полная схема? или та часть, которую Вы посчитали нужной показать?

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: UART.production.rar

 

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

 

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

 

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

 

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

 

По поводу "посмотрите осциллографом", у меня С1-55. На кварце генерации я не вижу, а обмен идёт... значит МК работает от внутреннего генератора... как это может быть???

Изменено пользователем Сергей Владимирович

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


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

Нет, это полная схема, я откинул всё что можно... уже не знал на что думать, осталось только это...

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

раздел документации "3.4.3 LP, XT, HS MODES"

 

Вот HEX: UART.production.rar

Ну, что сказать:

1. конфигурационные биты нормально установлены.

2. Ваша задержка вместо 500 ms дает 10 ms. почему- уж сами с компилятором разбирайтесь, что у вас такое "__delay_ms(500);"

3. Согласно симулятору, байт передается 4160 us, это 2404 bps. Совершенно соответствует теории. Значит, программу не копайте, разбирайтесь с железом.

 

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

?

Почитайте документацию на используемый микроконтроллер. раздел "12.0 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART)."

 

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

Вы мои пункты 1 2 3 4 читали? там есть план действий.

И еще один пункт добавлю

5. запретить FCMEN в конфиге. тогда при неработающем внешнем кварце процессор не будет перескакивать на внутренний генератор. Это классическая ошибка программистов, добавляющая седых волос при тестировании и отладке. Особенно тяжело вылавливается, если внутренний генератор работает на частоте, очень близкой к частоте внешнего.

 

По поводу "посмотрите осциллографом", у меня С1-55. На кварце генерации я не вижу, а обмен идёт... значит МК работает от внутреннего генератора... как это может быть???

Если смотрели на третьей ноге (именно на 3й а не на 2й!) с делителем 1:10 (что-нибудь типа 10 МОМ 5 пФ) и ничего не видели (ну хоть пару десятков милливольт размах) - то 99% что генерации нет (1% оставляю на то, что генерация срывается в момент подключения щупа)

 

Чудес не бывает, разберетесь, никуда не денетесь :) тут главное- не вслепую тыкать авось заработает, а понимать что и зачем Вы делаете.

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


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

1. Конденсаторы вернул;

2. Осликом генерацию не вижу;

3.,4. по поводу замены кварца и внешнего такта: выпаял кварц, а обмен продолжается на скорости 500!!! Значит я в своих настройках использую внутренний генератор! При всём этом FCMEN запретил!!!

 

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

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


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

1. Конденсаторы вернул;

2. Осликом генерацию не вижу;

3.,4. по поводу замены кварца и внешнего такта: выпаял кварц, а обмен продолжается на скорости 500!!! Значит я в своих настройках использую внутренний генератор! При всём этом FCMEN запретил!!!

 

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

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

 

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

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


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

Вот тут-то как раз всё в порядке. Контрольная сумма и биты конфигурации совпадают.

 

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

 

__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МГц тоже не работает...

 

Изменено пользователем Сергей Владимирович

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


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

Может быть, используемый программатор не записывает фьюзы ? Или, чтобы записывал, надо где-то что-то выставить ?

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


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

Вряд ли! Я использую PICKit2, он показывает контрольную сумму прошивки и конфигурацию, после считывания они совпадают с загруженными.

 

Вообщем проблема такая - нет генерации на внешнем кварце! Об UART-е уже и речи нет...

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


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

Вообщем проблема такая - нет генерации на внешнем кварце! Об UART-е уже и речи нет...

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

- Найти рабочий (демо) борд, если такие существуют в природе и есть под рукой. На нем написать и отработать минимальный код для включения внешнего генератора.

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

 

В моем случае именно чип оказался неисправным. Но он вообще глючил сильно. В Вашем случае, скорее всего, чип нормальный.

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


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

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

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

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

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

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

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

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

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

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