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

|
Цитата(rezident @ Jul 18 2011, 01:16)  А какие конденсаторы у вас стоят? Если часовой кварц типовой (с нагрузочной емкостью 12,5пФ), то в обвязке его должны быть по 12пФ. С учетом предположения именно такой нагрузочной емкости выбраны установки битов XCAP11PF. В обвязке 16МГц-кварца должны быть по 15пФ. И, кстати, какой именно часовой кварц вы используете? Я недавно напоролся на проблемы с запуском LFXT на MSP430F2618TPW. Пробовал все что было под рукой: KX-327NHT, KX-327LT от Geyer и DT-38LT (noname) , но ни с одним из них запустить LF-генератор не получалось. Разбор полетов, чтение документации (включая Errata), запросы на форум выявили особенность этого генератора в серии 2xxx. Там очень жесткие требования к допустимому диапазону ESR кварца. Кое-как удалось запустить лишь на DT-26L неизвестного производителя. Коллеги рекомендовали использовать MS1V-T1K от швейцарской фирмы Micro Crystal. Якобы с ним проблем не бывает. Так что проверьте с помощью отладчика или трассировки с помощью того же светодиода, в каком именно месте циклится программа? Если я правильно догадываюсь, то зацикливание должно происходить на ожидании готовности LFXT - там, где проверяется бит LFOF. У меня стоит кварц KX-327S и 12пФ кондёры. На 16Мгц кварце стоят тоже 12пФ. Кстати, XCAP11PF - нету такого дефайна, конденсаторы выбираются из ряда 1, 6, 8, 10 пФ. И ещё, код из моего первого поста работает (хоть и выдаёт в порт несуразицу). Но если выставляю программно конденсатор 1пф - не работает. А тут ВООБЩЕ не работает, что примечательно, если закоментить вот это do { IFG1 &= OFIFG; } while ((IFG1&OFIFG) != 0); то начинает мигать светодиод, что говорит о работоспособности таймера, но UATR всё равно молчит.
|
|
|
|
|
Jul 18 2011, 10:05
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Блин! В этой строке ошибка. Я забыл проинвертировать. Должно быть так Код IFG1 &= ~OFIFG; или так Код IFG1 &= OFIFG ^ 0xFF;
|
|
|
|
|
Jul 18 2011, 14:47
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Да, теперь светодиод мигает с нужным интервалом... но UART молчит пробую такую конструкцию CODE while(!(UC1IFG&UCA1TXIFG)); //буфер передатчика готов? P5OUT ^= BIT7; Диод не мигает, что говорит о том что флаг готовности передающего буфера не устанавливается...
Сообщение отредактировал Zelepuk - Jul 18 2011, 15:25
|
|
|
|
|
Jul 18 2011, 19:56
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Да, простите, в основном цикле вообще не трогаю таймер, а просто пытаюсь что-то вывести через UART. CODE #include <msp430x471x7.h> #include <stdint.h>
#define FREQMCLK 9830400UL //MCLK #define FREQSMCLK 9830400UL //SMCLK //#define FREQSMCLK 16000000UL //SMCLK #define FREQACLK 32768UL //ACLK #define BAUDRATE 9600UL //baudrate #define TICK_MS_ADDVAL 100U //инкремент таймера тиков [мс] #define BLINK_TIME_MS 500U //полупериод мерцания LED [мс]
int __low_level_init(void) { WDTCTL = WDTPW | WDTHOLD; //останов WDTimer return 1; }
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; uint32_t lTmp; //Инициализация системы тактирования // FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1 FLL_CTL2 = XT2S1; //для работы XT2=16МГц FLL_CTL0 = XCAP6PF; //XT1=LF, DCO/D, XCAP=11пФ while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц // while ((FLL_CTL0 & XT2OF) != 0); //ждем готовности генератора 16МГц SCFI0 = FLLD_4 | FN_2; //D=4, fDCOCLK = 1.4-12MHz SCFQCTL = SCFQ_M + (75U-1U); //fDCOCLK=32768*(75)*4=9830400Гц, DCO=fDCOCLK/4 while ((FLL_CTL0 & DCOF) != 0); //ждем готовности FLL // FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 FLL_CTL1 |= SELS; //MCLK=DCO, SMCLK=XT2, ACLK=LFXT/1 do { IFG1 &= OFIFG; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования P5OUT ^= BIT7; //Инициализация 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/10UL); //период около 100мс TACCTL0 = CCIE; //разр. прерывание от CCR0 TACCTL1 = 0; TACCTL2 = 0; TACTL |= MC_1; //запустить таймер в режиме CountUP //Инициализация LED P5DIR |= BIT7; P5SEL &= ~BIT7; P5OUT &= ~BIT7; idx=0; tickStamp = tick_ms; //зафиксировать временную метку __enable_interrupt(); //разрешим прерывания for (;;) { while(!(UC1IFG&UCA1TXIFG)); //буфер передатчика готов? P5OUT ^= BIT7; UCA1TXBUF= 'Z'; //вывод текущего символа } // __bis_SR_register(LPM0_bits + GIE);//переход в режим энергосбережения LPM0 }
#pragma vector=TIMERA0_VECTOR #pragma type_attribute=__interrupt void TimerA0_ISR (void) { tick_ms += TICK_MS_ADDVAL; //инкремент счтечика тиков [мс] __bic_SR_register_on_exit(LPM0_bits);//выход из режима энергосбережения при выходе из прерывания } Так вот, отсутствие мерцания светодиода даёт мне право полагать, что флаг готовности выходного буфера никогда не устанавливается в данном коде. В вашем коде светодиод мерцает, но UART не выдаёт ничего (стало быть кварц работает и он здесь непричём)....
Сообщение отредактировал Zelepuk - Jul 18 2011, 20:02
|
|
|
|
|
Jul 18 2011, 20:03
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Ну вот, так сразу видно где у вас ошибки. Готовность буфера не наступает, потому что вы забыли скобки и пишете в буфер UART постоянно на каждом цикле for(;;). Должно быть так. Код if ((UC1IFG&UCA1TXIFG)!=0) //буфер передатчика готов? { P5OUT ^= BIT7; UCA1TXBUF = uart_buf[idx]; //вывод текущего символа } Кроме того, непонятно, вы собирались использовать XT2 или DCO в качестве SMCLK? Потому, что у вас часть строк раскомментирована, что неправильно. Нужно раскомментировать все и поменять дефайн с величиной частоты SMCLK. Ошибку мою так и не исправили? Код do { IFG1 &= ~OFIFG; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования Update. Вот блин, вслед за вами повелся и фигню написал.  Исправил while на if.
Сообщение отредактировал rezident - Jul 18 2011, 20:10
|
|
|
|
|
Jul 19 2011, 06:25
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Вот. исправил код. Светодиод горит всё время. В порт не выводится ничего( CODE #include <msp430x471x7.h> #include <stdint.h>
#define FREQMCLK 9830400UL //MCLK #define FREQSMCLK 9830400UL //SMCLK //#define FREQSMCLK 16000000UL //SMCLK #define FREQACLK 32768UL //ACLK #define BAUDRATE 9600UL //baudrate #define TICK_MS_ADDVAL 100U //инкремент таймера тиков [мс] #define BLINK_TIME_MS 500U //полупериод мерцания LED [мс]
int __low_level_init(void) { WDTCTL = WDTPW | WDTHOLD; //останов WDTimer return 1; }
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; uint32_t lTmp; //Инициализация системы тактирования FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off // FLL_CTL1 = 0; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1 FLL_CTL2 = XT2S1; //для работы XT2=16МГц FLL_CTL0 = XCAP8PF; //XT1=LF, DCO/D, XCAP=8пФ while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц // while ((FLL_CTL0 & XT2OF) != 0); //ждем готовности генератора 16МГц SCFI0 = FLLD_4 | FN_2; //D=4, fDCOCLK = 1.4-12MHz SCFQCTL = SCFQ_M + (75U-1U); //fDCOCLK=32768*(75)*4=9830400Гц, DCO=fDCOCLK/4 while ((FLL_CTL0 & DCOF) != 0); //ждем готовности FLL FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 // FLL_CTL1 |= SELS; //MCLK=DCO, SMCLK=XT2, ACLK=LFXT/1 do { IFG1 &= ~OFIFG; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования //Инициализация 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; //установим флаг готовность буфера передатчика //Инициализация LED P5DIR |= BIT7; P5SEL &= ~BIT7; P5OUT &= ~BIT7; idx=0; tickStamp = tick_ms; //зафиксировать временную метку __enable_interrupt(); //разрешим прерывания for (;;) { if ((UC1IFG & UCA1TXIFG) != 0) //буфер передатчика готов? { UCA1TXBUF='A'; //вывод символа 'A' P5OUT ^= BIT7; } } }
думаю косяк в железе(может в в разводке). Но ведь первоначальный вариант (первый пост) выводил хоть что-то в порт (чупуху но всё же). Бывает ли такое?
|
|
|
|
|
Jul 19 2011, 22:54
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Как вы определяете, что ничего не выводится? Осциллографом выход смотрели или в программе-терминале ничего не принимается? По свечению светодиода в данном случае вы ничего не поймете, т.к. темп вывода на скорости 9600 будет давать ему подсветку постоянно. В моем первоначальном примере вепеключение светодиода было синхронизирован по времени с таймаутом в 0,5с, что позволяло определить работоспособность. А у вас - нет. Я нашел еще одну свою ошибку в инициализации FLL. Битом SCFQ_M модуляция выключается. И-за этого частота DCO может отличаться от расчетной. Попробуйте еще раз вот такой пример. CODE #include <msp430x471x7.h> #include <stdint.h>
#define FREQMCLK 9830400UL //MCLK #define FREQSMCLK 9830400UL //SMCLK #define FREQACLK 32768UL //ACLK #define BAUDRATE 9600UL //baudrate #define TICK_MS_ADDVAL 100U //инкремент таймера тиков [мс] #define BLINK_TIME_MS 500U //полупериод мерцания LED [мс]
int __low_level_init(void) { WDTCTL = WDTPW | WDTHOLD; //останов WDTimer return 1; }
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; uint32_t lTmp; //Инициализация системы тактирования FLL_CTL1 = XT2OFF; //D=2, MCLK=fDCOCLK/D, SMCLK=fDCOCLK/D, ACLK=LFXT/1, XT2=off FLL_CTL2 = XT2S1; //для работы XT2=16МГц FLL_CTL0 = XCAP11PF; //XT1=LF, DCO/D, XCAP=11пФ while ((FLL_CTL0 & LFOF) != 0); //ждем готовности генератора 32768Гц SCFI0 = FLLD_4 | FN_3; //D=4, fDCOCLK = 2.2-17Mhz SCFQCTL = (75U-1U); //fDCOCLK=32768*(75)*4=9830400Гц, DCO=fDCOCLK/4 while ((FLL_CTL0 & DCOF) != 0); //ждем готовности FLL FLL_CTL0 |= DCOPLUS; //MCLK=DCO/1, SMCLK=DCO/1 do { IFG1 &= ~OFIFG; } while ((IFG1&OFIFG) != 0); //ждем готовности всей системы тактирования //Инициализация 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/10UL); //период около 100мс TACCTL0 = CCIE; //разр. прерывание от CCR0 TACCTL1 = 0; TACCTL2 = 0; TACTL |= MC_1; //запустить таймер в режиме CountUP //Инициализация LED P5DIR |= BIT7; P5SEL &= ~BIT7; P5OUT &= ~BIT7; idx=0; tickStamp = tick_ms; //зафиксировать временную метку __enable_interrupt(); //разрешим прерывания for (;;) { if ((tick_ms - tickStamp) >= BLINK_TIME_MS)//полупериод мерцания закончился? { tickStamp = tick_ms; //запомним новое значение метки времени if ((UC1IFG & UCA1TXIFG) != 0)//буфер передатчика готов? { UCA1TXBUF = uart_buf[idx]; //вывод текущего символа P5OUT |= BIT7; //включаем LED if (idx < (sizeof(uart_buf)-1))//увеличение индекса idx += 1; else idx = 0; } else P5OUT &= ~BIT7; //выключаем LED } } }
#pragma vector=TIMERA0_VECTOR #pragma type_attribute=__interrupt void TimerA0_ISR (void) { tick_ms += TICK_MS_ADDVAL; //инкремент счтечика тиков [мс] }
Кстати, насчет ESR часового кварца. В errata присутствует описание бага XOSC8, про который я упоминал выше. Цитата XOSC8 LFXT1 Module Function ACLK failure when crystal ESR is below 40 kΩ Description When ACLK is sourced by a low-frequency crystal with an ESR below 40 kΩ, the duty cycle of ACLK may fall below the specification; the OFIFG may become set or, in some instances, ACLK may stop completely. Workaround See the application report XOSC8 Guidance ( SLAA423) for information regarding working with this erratum.
|
|
|
|
|
Jul 20 2011, 11:07
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
rezident Попробовал последний вариант вашего кода (спасибо огромное вам). Вот результаты: светодиод горит и тут же гаснет навсегда. В порт выводится бяка (очень медленно выводится) - см. фото.  Про резонатор: у меня резонатор KX-327S. load capacitance CL = 12.5пФ. Резонатор подключен по такой схеме (см. второе фото).
Сообщение отредактировал Zelepuk - Jul 20 2011, 11:19
Эскизы прикрепленных изображений
 Уменьшено до 80%
862 x 578 (170.99 килобайт)
|
 Уменьшено до 55%
383 x 382 (46.08 килобайт)
|
|
|
|
|
|
Jul 20 2011, 20:14
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Я так и не понял, осциллограф у вас есть? Если есть, то посмотрите наличие и частоту сигналов SMCLK и ACLK. В примере который привожу ниже они выведены на P1.4 и P1.5 соответственно. Очередной пример, использующий XT2=16МГц в качестве частоты тактирования UART. Посредством UART должны непрерывно (без задержек) выводиться строки "0123456789" Поведение светодиода: после инициализации он светится. Если передача идет, то он мерцает с частотой 2Гц. Если же передачи нет, то он гаснет. Поскольку я не знаю как именно у вас светодиод подключен (между плюсом питания и P5.7 или между P5.7 и общим?), то переопределите уж сами макросы LED_OFF и LED_ON так, чтобы они соответствовали правильной полярности управляющего сигнала. 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; //инкремент счтечика тиков [мс] }
Если и этот пример у вас не будет работать, то я уже теряюсь в догадках о причинах такого поведения вашего устройства.  На всякий случай попробуйте вместо виндусового Гипертерминала использовать программу Br@y's Terminal.
|
|
|
|
|
Jul 21 2011, 14:25
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Пока осциллографа под рукой нет (завтра планирую получить). Но на выводы, на которые выводятся сигналы частоты подключены светодиоды, а они не горят. Светодиод, который сигнализирует о передаче данных - горит. Порт молчит. И ещё. Может дело и правда в железе? У меня физический уровень реализован на двух оптронах и используется сигнал DTR (около 10В). Когда порт открыт на DTR +10В. (см. фото схемы). ещё: вы используете XT2 в качестве источника тактирования USCI (последний вариант кода). Но регистры UCA1BR1, UCA1BR0 остаются неизменными (как и при тактировании от DCO) - как я понял скорость везде должна составить 9600. Это правильно?
Сообщение отредактировал Zelepuk - Jul 21 2011, 15:10
Эскизы прикрепленных изображений
 Уменьшено до 80%
866 x 527 (135.92 килобайт)
|
|
|
|
|
|
Jul 21 2011, 15:20
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(Zelepuk @ Jul 21 2011, 19:25)  И ещё. Может дело и правда в железе? У меня физический уровень реализован на двух оптронах и используется сигнал DTR (около 10В). Когда порт открыт на DTR +10В. (см. фото схемы). Я правильно разглядел, что R47 у вас 220 кОм?  А V+ это питание MSP430 около 3В? Нда уж.  В таком случае понятно почему нет передачи. Номинал резистора нужно уменьшить примерно в 2000 раз. До 100Ом. А лучше вообще изменить схемотехнику этого преобразователя уровней. Цитата(Zelepuk @ Jul 21 2011, 19:25)  ещё: вы используете XT2 в качестве источника тактирования USCI (последний вариант кода). Да, используется частота от XT2=16МГц. Цитата(Zelepuk @ Jul 21 2011, 19:25)  Но регистры UCA1BR1, UCA1BR0 остаются неизменными (как и при тактировании от DCO) - как я понял скорость везде должна составить 9600. Это правильно? Почему неизменными? Там происходит подстановка величин и расчет в препроцессоре при компиляции . Если вам нужно изменять baudrate в программе, то замените в формуле расчета символьные константы переменными типа uint32_t (unsigned long), задав им предварительно требуемые значения.
|
|
|
|
|
Jul 21 2011, 16:54
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(rezident @ Jul 21 2011, 19:20)  Я правильно разглядел, что R47 у вас 220 кОм?  А V+ это питание MSP430 около 3В? Нда уж.  В таком случае понятно почему нет передачи. Номинал резистора нужно уменьшить примерно в 2000 раз. До 100Ом. А лучше вообще изменить схемотехнику этого преобразователя уровней. Да, используется частота от XT2=16МГц. Почему неизменными? Там происходит подстановка величин и расчет в препроцессоре при компиляции . Если вам нужно изменять baudrate в программе, то замените в формуле расчета символьные константы переменными типа uint32_t (unsigned long), задав им предварительно требуемые значения. Простите что ввожу в заблуждение (всётаки некоторые вещи никто кроме меня знать не может). Резистор там 220 Ом (на схема ошибка - в железе правильно). Вообще схема взята с апликухи счётчика от Texas Instruments. Но сама апликуха не работает(хотя должна была). Вот и решил написать программу простую для вывода в порт символов.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|