|
Проблема с UART, выводит несуразицу |
|
|
|
Jul 13 2011, 05:34
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Вот код CODE #include "msp430x471x7.h"
void main(void) { volatile unsigned int i; P5DIR |= BIT7; WDTCTL = WDTPW+WDTHOLD; // Stop WDT FLL_CTL0 |= XCAP14PF; // Configure load caps
do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set?
P1SEL |= BIT6+BIT7; // P2.4,5 = USCI_A0 RXD/TXD UCA1CTL1 |= UCSSEL_1; // CLK = ACLK UCA1BR0 = 0x03; // 32k/9600 - 3.41 UCA1BR1 = 0x00; // UCA1MCTL = 0x06; // Modulation UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** // IE2 |= UCA1RXIE; // Enable USCI_A0 RX interrupt char c = 'A'; // _BIS_SR(LPM3_bits + GIE); // Enter LPM3, interrupts enabled while(1) { while(!(IFG2&UCA1TXIFG)); UCA1TXBUF = c; P5OUT ^= BIT7; for(i=2500;i>0;i--); } }
Пытаюсь просто выводить в терминал символ 'A' и зажигать светодиод. Светодиод горит, на терминал выводится сами видите что (см. приложенное фото). В чём может быть дело? Ещё когда пробую проект "эхо"(посылаем символ с клавиатуры компьютера - MSP430 принимает его и кидает в компорт компьютера), то он работает со сбоями (сначала всё хорошо, потом символы не передаются, потом передаётся чепуха...) Нужна помощь, всю голову сломал((
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
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 26 2011, 02:33
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(Zelepuk @ Jul 25 2011, 22:08)  Код, судя по всему, верный и рабочий. Суть проблемы: Когда открываю порт в HyperTerminal то по экрану бегут иероглифы. Стоит только "закрыть-открыть" порт тут же всё идёт как надо (бегут цифры "0123456789" столбиком). Иногда "закрыть-открыть" нужно несколько раз тобы получить нужную картину. Сие чудо наблюдается в ЛЮБОЙ терминальной программе.
Если бы просто не выводилось ничего я бы больше не стал писать (сколько можно уж). Но тут непонятное вовсе явление. Код неверный и нерабочий, поскольку он постоянно, без интервалов больше стопового передает что-то. Принять такое, подключившись в произвольный момент времени, невозможно. Вы вообще про байтовую синхронизацию слышали?  Сделайте так: запустите терминал, откройте порт, ПОТОМ запустите устройство и отпишитесь о результатах.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
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 это не догма, а пример/образец, руководство к действию. Этот пример не для слепого клонирования, а как образец для разработки на его основе своего устройства. Разработка это работа инженера, который должен понимать нюансы применения компонентов.
|
|
|
|
Сообщений в этой теме
Zelepuk Проблема с UART Jul 13 2011, 05:34 rezident Модуль тактирования проинициализируйте полностью... Jul 13 2011, 12:23 Zelepuk Цитата(rezident @ Jul 13 2011, 16:23) Мод... Jul 14 2011, 05:40  MrYuran Цитата(Zelepuk @ Jul 14 2011, 09:40) Кто ... Jul 14 2011, 07:40  rezident Цитата(Zelepuk @ Jul 14 2011, 10:40) Кто ... Jul 14 2011, 15:51   Zelepuk Цитата(rezident @ Jul 14 2011, 19:51) Я ж... Jul 14 2011, 17:12    rezident Цитата(Zelepuk @ Jul 14 2011, 22:12) нуже... Jul 14 2011, 18:50   Zelepuk Цитата(rezident @ Jul 14 2011, 19:51) Еще... Jul 15 2011, 14:17    rezident Цитата(Zelepuk @ Jul 15 2011, 19:10) Я по... Jul 15 2011, 14:20    zltigo QUOTE (Zelepuk @ Jul 15 2011, 16:17) полу... Jul 15 2011, 17:34 Zelepuk Цитата(rezident @ Jul 14 2011, 19:51) Я ж... Jul 16 2011, 12:22 Zelepuk Теперь пробую инициализировать явно все регистры м... Jul 16 2011, 13:36 rezident Есть несколько вариантов организации тактирования ... Jul 17 2011, 00:26 Zelepuk Цитата(rezident @ Jul 17 2011, 04:26) Ест... Jul 17 2011, 19:00  rezident Цитата(Zelepuk @ Jul 18 2011, 00:00) А мо... Jul 17 2011, 21:16 Zelepuk Цитата(rezident @ Jul 18 2011, 01:16) А к... Jul 18 2011, 07:27 rezident Блин! В этой строке ошибка. Я забыл проинверти... Jul 18 2011, 10:05 Zelepuk Да, теперь светодиод мигает с нужным интервалом...... Jul 18 2011, 14:47 rezident Цитата(Zelepuk @ Jul 18 2011, 19:47) проб... Jul 18 2011, 19:09 Zelepuk Да, простите, в основном цикле вообще не трогаю та... Jul 18 2011, 19:56 rezident Ну вот, так сразу видно где у вас ошибки. Готовнос... Jul 18 2011, 20:03 Zelepuk Вот. исправил код. Светодиод горит всё время. В по... Jul 19 2011, 06:25 rezident Как вы определяете, что ничего не выводится? Осцил... Jul 19 2011, 22:54 Zelepuk rezident
Попробовал последний вариант вашего кода ... Jul 20 2011, 11:07 rezident Я так и не понял, осциллограф у вас есть? Если ест... Jul 20 2011, 20:14 Zelepuk Пока осциллографа под рукой нет (завтра планирую п... Jul 21 2011, 14:25 rezident Цитата(Zelepuk @ Jul 21 2011, 19:25) И ещ... Jul 21 2011, 15:20  Zelepuk Цитата(rezident @ Jul 21 2011, 19:20) Я п... Jul 21 2011, 16:54  Zelepuk Цитата(rezident @ Jul 21 2011, 19:20) А л... Jul 23 2011, 15:20 Zelepuk Вот что получаю в окне терминала (см. фото). В тер... Jul 24 2011, 06:56 Zelepuk Что примечательно, заменив преобразователь уровней... Jul 25 2011, 08:49 rezident Эх-ма. Основная проблема большинства начинающих в... Jul 25 2011, 18:54  Zelepuk Цитата(Dog Pawlowa @ Jul 26 2011, 06:33) ... Jul 26 2011, 08:25   Dog Pawlowa Цитата(Zelepuk @ Jul 26 2011, 11:25) Да, ... Jul 26 2011, 09:28 rezident "Дьявол кроется в мелочах". Не ссылайт... Jul 25 2011, 20:42 Zelepuk Цитата(Dog Pawlowa @ Jul 26 2011, 13:28) ... Jul 26 2011, 12:52 Dog Pawlowa Цитата(Zelepuk @ Jul 26 2011, 15:52) Цель... Jul 26 2011, 20:31 Zelepuk Теперь можно и putchar писать, теперь видно что св... Jul 27 2011, 11:32 Zelepuk Всем спасибо! Тема закрыта! Jul 28 2011, 13:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|