|
Проблема с UART, выводит несуразицу |
|
|
|
Jul 25 2011, 18:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Эх-ма.  Основная проблема большинства начинающих в том, что они варятся внутри своей проблемы, не умея/на зная, как выйти и взглянуть на нее с другой высоты полета. А с другой высоты проблема выглядит немного иначе и попутно могут выявиться связи с другими объектами, которые незаметны изнутри проблемы. Вдобавок начинающие пренебрегают отвечать (хотя бы для самого себя) на наводящие вопросы, которые они не понимают или считают незначащими. Вот вы, Zelepuk, пишете сообщения не для публичного форума, а для себя. "Мысли вслух" т.с.. Нет, такой способ тоже бывает полезным! Но только в том случае, когда вы, не пренебрегая мелочами, описываете проблему и ее текущее состояние полностью, а не фрагментарно! Из последних ваших сообщений лично мне совершенно непонятно какую программу, с какими изменениями/дополнениями вы сейчас проверяете? С какой схемотехникой или на какой Eval Board? Ведь даже кусочек опубликованной вами схемы оказался неточным, а как там дело с остальной схемой? Проверяли вы или нет а) выходные сигналы осциллографом, б) преобразователь уровней отдельно от MSP430, в) работу связи с другой терминальной программой, г) работоспособность самого порта на компьютере, д) настройки COM-порта? Вы вообще используете нормальный аппаратный COM-порт или переходник USB-COM? Ответе хотя бы для себя на эти вопросы, чтобы локализовать место поиска проблемы.
|
|
|
|
|
Jul 25 2011, 19:08
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Схемотехника используется из slaa409 (апликейшн счётчика). Преобразователь уровней на MAX232 работает (проверялось отдельно). Используется COM-порт на материнке. Осцила нет  Код (это ваш последний вариант для меня - SMLK от XT2): CODE #include <stdint.h> #include <msp430x471x7.h>
#define FREQMCLK 2097152UL //MCLK #define FREQSMCLK 16000000UL //SMCLK #define FREQACLK 32768UL //ACLK #define BAUDRATE 9600UL //baudrate #define TICK_MS_ADDVAL 10U //инкремент таймера тиков [мс] #define BLINK_TM_MS 250U //полупериод мерцания LED [мс] #define LED_ON P5OUT&=~BIT7//включить LED #define LED_OFF P5OUT|=BIT7 //выключить LED #define LED_TOGGLE P5OUT^=BIT7 //переключить LED
int __low_level_init(void) { WDTCTL = WDTPW | WDTHOLD; //останов WDTimer return 1; }
volatile uint16_t tick_ms; //счетчик миллисекунд uint8_t uart_buf[]={'0','1','2','3','4','5','6','7','8','9','\n','\r'};//буфер UART
void main(void) { uint16_t tickStamp, idx, flag; uint32_t lTmp; //Инициализация системы тактирования FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=on FLL_CTL2 = XT2S1; //для работы XT2=16МГц FLL_CTL0 = XCAP11PF; //XT1=LF, DCO/D, XCAP=11пФ while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц SCFI0 = FLLD_2; //D=2, fDCOCLK = 0.65-6.1Mhz SCFQCTL = (32U-1U); //fDCOCLK=32768*(32)*2=2097152Гц, DCO=fDCOCLK/2 FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 do { IFG1 &= ~OFIFG; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования FLL_CTL1 |= SELS; //MCLK=fDCOCLK, SMCLK=XT2, ACLK=LFXT/1, XT2=on //Инициализация UART UCA1CTL1 |= UCSWRST; //Reset USCI UCA1CTL0 = 0; //Parity=disable, 8bit, 1stop-bit UCA1CTL1 = UCSSEL_2 | UCSWRST; //BRCLK=SMCLK lTmp=FREQSMCLK/BAUDRATE; UCA1BR1 = (uint8_t)(lTmp>>8UL); // UCA1BR0 = (uint8_t)(lTmp); //BITCLK=BRCLK/(UCAxBR1*256+UCAxBR0) UCA1MCTL = 0; //регистр модуляции UCA1STAT = 0; //сброс всех битов ощибок UCA1IRTCTL = 0; //IRDA disable UCA1CTL1 &= ~UCSWRST; P1SEL |= BIT6 | BIT7; //P1.6 = USCI TXD, P1.7 = USCI RXD UC1IE &= ~(UCA1TXIE | UCA1RXIE); //запретим прерывания USCI_A1 UC1IFG &= ~UCA1RXIFG; //сбросим флаг готовности буфера приемника UC1IFG |= UCA1TXIFG; //установим флаг готовность буфера передатчика //Иницализация TimerA TACTL = TASSEL_1 | TACLR; //TACLK=ACLK/1 TACCR0=(uint16_t)(FREQACLK*TICK_MS_ADDVAL/1000UL); //период около 10мс TACCTL0 = CCIE; //разр. прерывание от CCR0 TACCTL1 = 0; TACCTL2 = 0; TACTL |= MC_1; //запустить таймер в режиме CountUP //Инициализация LED P5DIR |= BIT7; P5SEL &= ~BIT7; LED_ON; //Настройка пинов чтобы посмотреть частоту SMCLK и ACLK P1DIR |= BIT4 | BIT5; P1SEL |= BIT4 | BIT5; //P1.4 = SMCLK, P1.5 = ACLK
idx=0; flag=0; tickStamp = tick_ms; //зафиксировать временную метку __enable_interrupt(); //разрешим прерывания for (;;) { if ((UC1IFG & UCA1TXIFG) != 0) //буфер передатчика готов? { UCA1TXBUF = uart_buf[idx]; //вывод текущего символа flag=1; //установим флаг готовности UART if (idx < (sizeof(uart_buf)-1))//увеличение индекса элемента буфера idx += 1; else idx = 0; } if ((tick_ms - tickStamp) >= BLINK_TM_MS)//полупериод мерцания закончился? { tickStamp = tick_ms; //запомним новое значение метки времени if (flag != 0) //проверка флага готовности UART { LED_TOGGLE; //включаем LED flag = 0; //сбросим флаг готовности UART } else LED_OFF; //выключаем LED } } }
#pragma vector=TIMERA0_VECTOR #pragma type_attribute=__interrupt void TimerA0_ISR (void) { tick_ms += TICK_MS_ADDVAL; //инкремент счтечика тиков [мс] } Код, судя по всему, верный и рабочий. Суть проблемы: Когда открываю порт в HyperTerminal то по экрану бегут иероглифы. Стоит только "закрыть-открыть" порт тут же всё идёт как надо (бегут цифры "0123456789" столбиком). Иногда "закрыть-открыть" нужно несколько раз тобы получить нужную картину. Сие чудо наблюдается в ЛЮБОЙ терминальной программе. Если бы просто не выводилось ничего я бы больше не стал писать (сколько можно уж). Но тут непонятное вовсе явление.
|
|
|
|
|
Jul 25 2011, 20:42
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
"Дьявол кроется в мелочах".  Не ссылайтесь на slaa409, опубликуйте свою схему. Если она на базе slaa409, то ничего секретного там нет, не так ли? Например, в схеме из slaa409 используется часовой кварц со встроенными нагрузочными конденсаторами, а у вас другой кварц с внешними конденсаторами. Притом, что имеются нюансы применения такого кварца, о чем отмечено в Errata. Преобразователь вы проверяли как? Пробовали проверить на "эхо" при подключенной плате? Т.е. все подключено штатно к ПК, но только в самом преобразователе TTL выход преобразователя подключен к TTL входу, который в свою очередь отключен от выхода MSP430. Отключив в программе-терминале локальное эхо, нужно получить такую же строку символов, которую вы вводите с клавиатуры в окне терминала. Handshake (аппаратное управление потоком) в настройках терминальной программы точно отключено? Br@y's Terminal ведет себя также как и Гипертерминал? Питание своей платы откуда получаете? Гальваническая изоляция от сети у этого БП имеется? Ваш ПК заземлен? Не могут ли токи от сетевого фильтра и/или от вашего БП мешать передаче (синфазная помеха)?
|
|
|
|
|
Jul 26 2011, 02:33
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Zelepuk @ Jul 25 2011, 22:08)  Код, судя по всему, верный и рабочий. Суть проблемы: Когда открываю порт в HyperTerminal то по экрану бегут иероглифы. Стоит только "закрыть-открыть" порт тут же всё идёт как надо (бегут цифры "0123456789" столбиком). Иногда "закрыть-открыть" нужно несколько раз тобы получить нужную картину. Сие чудо наблюдается в ЛЮБОЙ терминальной программе.
Если бы просто не выводилось ничего я бы больше не стал писать (сколько можно уж). Но тут непонятное вовсе явление. Код неверный и нерабочий, поскольку он постоянно, без интервалов больше стопового передает что-то. Принять такое, подключившись в произвольный момент времени, невозможно. Вы вообще про байтовую синхронизацию слышали?  Сделайте так: запустите терминал, откройте порт, ПОТОМ запустите устройство и отпишитесь о результатах.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jul 26 2011, 08:25
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(Dog Pawlowa @ Jul 26 2011, 06:33)  Код неверный и нерабочий, поскольку он постоянно, без интервалов больше стопового передает что-то. Принять такое, подключившись в произвольный момент времени, невозможно. Вы вообще про байтовую синхронизацию слышали?  Сделайте так: запустите терминал, откройте порт, ПОТОМ запустите устройство и отпишитесь о результатах. Да, так всё работает нормально. Выходит нужно задержку поставить в коде? Цитата(rezident @ Jul 26 2011, 00:42)  "Дьявол кроется в мелочах".  Не ссылайтесь на slaa409, опубликуйте свою схему. Если она на базе slaa409, то ничего секретного там нет, не так ли? Например, в схеме из slaa409 используется часовой кварц со встроенными нагрузочными конденсаторами, а у вас другой кварц с внешними конденсаторами. Притом, что имеются нюансы применения такого кварца, о чем отмечено в Errata. Преобразователь вы проверяли как? Пробовали проверить на "эхо" при подключенной плате? Т.е. все подключено штатно к ПК, но только в самом преобразователе TTL выход преобразователя подключен к TTL входу, который в свою очередь отключен от выхода MSP430. Отключив в программе-терминале локальное эхо, нужно получить такую же строку символов, которую вы вводите с клавиатуры в окне терминала. Handshake (аппаратное управление потоком) в настройках терминальной программы точно отключено? Br@y's Terminal ведет себя также как и Гипертерминал? Питание своей платы откуда получаете? Гальваническая изоляция от сети у этого БП имеется? Ваш ПК заземлен? Не могут ли токи от сетевого фильтра и/или от вашего БП мешать передаче (синфазная помеха)? Техасовцы вообще народ интересный. Выдают схему, а потом на фото платы у них же виден обычный кварц часовой и два кондёра. Преобразователь проверял путём подключения к другой плате (на другом микроконтроллере). ВСЕ терминалы ведут себя одинаково. Гальваническая развязка у БП есть. ПК не заземлён (обычный пк как у всех).
|
|
|
|
|
Jul 26 2011, 09:28
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Zelepuk @ Jul 26 2011, 11:25)  Да, так всё работает нормально. Выходит нужно задержку поставить в коде? Я же не знаю, какая цель этого проекта. Если убедиться в работоспособности преобразователя уровней RS232, то цель достигнута. Если передавать осмысленные данные, то одной задержки мало, обычно предпринимают какие-нибудь меры для контроля правильности приема. Правила, установленные для организации передачи данных, зовутся протоколом, и Вы должны его сформулировать, предусмотрев поведение для любой из сторон. Сейчас Вы не предусмотрели поведение приемника. Включившись в середине посылки, даже при наличии задержки, приемник получит неправильные данные и запустит стратегическую ракету, начав III WW.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jul 26 2011, 10:15
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Dog Pawlowa @ Jul 26 2011, 07:33)  Код неверный и нерабочий, поскольку он постоянно, без интервалов больше стопового передает что-то. Принять такое, подключившись в произвольный момент времени, невозможно. Да, этот момент я прохлопал, увлекшись проблемой ТС с тактированием UART.  Хотя в посте 23 у меня был пример в котором выдача байта в UART была синхронизирована с мерцанием светодиода и значительно превышала период его передачи. Цитата(Zelepuk @ Jul 26 2011, 13:25)  Да, так всё работает нормально. Выходит нужно задержку поставить в коде? Вам нужен какой-либо протокол передачи данных, который включает в себя контроль целостности данных. Кроме того, устройства чаще всего подразделяются на ведущие и ведомые. Соответственно передача данных строится как запрос (ведущего) - ответ (ведомого). Ваш электросчетчик будет ведомым, так что он должен "слушать" линию связи и по запросу выдавать требуемый ведущим блок данных. Цитата(Zelepuk @ Jul 26 2011, 13:25)  Техасовцы вообще народ интересный. Выдают схему, а потом на фото платы у них же виден обычный кварц часовой и два кондёра. Evalutation Board это не догма, а пример/образец, руководство к действию. Этот пример не для слепого клонирования, а как образец для разработки на его основе своего устройства. Разработка это работа инженера, который должен понимать нюансы применения компонентов.
|
|
|
|
|
Jul 26 2011, 12:52
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(Dog Pawlowa @ Jul 26 2011, 13:28)  Я же не знаю, какая цель этого проекта. Если убедиться в работоспособности преобразователя уровней RS232, то цель достигнута. Если передавать осмысленные данные, то одной задержки мало, обычно предпринимают какие-нибудь меры для контроля правильности приема. Правила, установленные для организации передачи данных, зовутся протоколом, и Вы должны его сформулировать, предусмотрев поведение для любой из сторон. Сейчас Вы не предусмотрели поведение приемника. Включившись в середине посылки, даже при наличии задержки, приемник получит неправильные данные и запустит стратегическую ракету, начав III WW. Цель? Напсиать свой putchar. Вот например когда я работал с ARM9, то в компиляторе был printf, который выводил данные в терминалку через DBGU (UART). Так вот там было всё просто и диалого между пользователем и камнем осуществлялся очень хорошо (и протоколов там небыло никаких).
Сообщение отредактировал Zelepuk - Jul 26 2011, 13:12
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|