реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
Zelepuk
сообщение Jul 18 2011, 07:27
Сообщение #16


Знающий
****

Группа: Участник
Сообщений: 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 всё равно молчит.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 18 2011, 10:05
Сообщение #17


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Блин! В этой строке ошибка. Я забыл проинвертировать. Должно быть так
Код
IFG1 &= ~OFIFG;

или так
Код
IFG1 &= OFIFG ^ 0xFF;
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 18 2011, 14:47
Сообщение #18


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Да, теперь светодиод мигает с нужным интервалом... но UART молчит crying.gif
пробую такую конструкцию

CODE
while(!(UC1IFG&UCA1TXIFG)); //буфер передатчика готов?
P5OUT ^= BIT7;


Диод не мигает, что говорит о том что флаг готовности передающего буфера не устанавливается...

Сообщение отредактировал Zelepuk - Jul 18 2011, 15:25
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 18 2011, 19:09
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Zelepuk @ Jul 18 2011, 19:47) *
пробую такую конструкцию

Приводите полный код. Нам ведь не видно, что вы там еще намодифицировали в исходнике?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 18 2011, 19:56
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 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);//выход из режима энергосбережения при выходе из прерывания
}


Так вот, отсутствие мерцания светодиода даёт мне право полагать, что флаг готовности выходного буфера никогда не устанавливается в данном коде. crying.gif
В вашем коде светодиод мерцает, но UART не выдаёт ничего (стало быть кварц работает и он здесь непричём).... laughing.gif

Сообщение отредактировал Zelepuk - Jul 18 2011, 20:02
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 18 2011, 20:03
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 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. Вот блин, вслед за вами повелся и фигню написал. sad.gif Исправил while на if.

Сообщение отредактировал rezident - Jul 18 2011, 20:10
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 19 2011, 06:25
Сообщение #22


Знающий
****

Группа: Участник
Сообщений: 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;
}
}
}


думаю косяк в железе(может в в разводке). Но ведь первоначальный вариант (первый пост) выводил хоть что-то в порт (чупуху но всё же). Бывает ли такое? laughing.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 19 2011, 22:54
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 20 2011, 11:07
Сообщение #24


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



rezident
Попробовал последний вариант вашего кода (спасибо огромное вам).
Вот результаты: светодиод горит и тут же гаснет навсегда. В порт выводится бяка (очень медленно выводится) - см. фото.
smile3046.gif smile3046.gif smile3046.gif

Про резонатор: у меня резонатор 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 килобайт)
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 20 2011, 20:14
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 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; //инкремент счтечика тиков [мс]
}

Если и этот пример у вас не будет работать, то я уже теряюсь в догадках о причинах такого поведения вашего устройства. sad.gif На всякий случай попробуйте вместо виндусового Гипертерминала использовать программу Br@y's Terminal.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 21 2011, 14:25
Сообщение #26


Знающий
****

Группа: Участник
Сообщений: 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 килобайт)
 
Go to the top of the page
 
+Quote Post
rezident
сообщение Jul 21 2011, 15:20
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Zelepuk @ Jul 21 2011, 19:25) *
И ещё. Может дело и правда в железе? У меня физический уровень реализован на двух оптронах и используется сигнал DTR (около 10В). Когда порт открыт на DTR +10В. (см. фото схемы).
Я правильно разглядел, что R47 у вас 220кОм? wacko.gif А V+ это питание MSP430 около 3В? Нда уж. cranky.gif В таком случае понятно почему нет передачи. Номинал резистора нужно уменьшить примерно в 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), задав им предварительно требуемые значения.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 21 2011, 16:54
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



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


Простите что ввожу в заблуждение (всётаки некоторые вещи никто кроме меня знать не может). Резистор там 220 Ом (на схема ошибка - в железе правильно).
Вообще схема взята с апликухи счётчика от Texas Instruments. Но сама апликуха не работает(хотя должна была). Вот и решил написать программу простую для вывода в порт символов.
laughing.gif laughing.gif laughing.gif laughing.gif
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 23 2011, 15:20
Сообщение #29


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(rezident @ Jul 21 2011, 19:20) *
А лучше вообще изменить схемотехнику этого преобразователя уровней.


как бы вы посоветовали это сделать?
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jul 24 2011, 06:56
Сообщение #30


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Вот что получаю в окне терминала (см. фото). В терминале что-то появляется только в момент открытия порта... (ложу трубку, поднимаю - появляются цифры и дальше тишина, опять ложу трубку и поднимаю - цифры и тишина....)

Очень странное поведение.... хрень какая-то... smile3046.gif smile3046.gif smile3046.gif

Сообщение отредактировал Zelepuk - Jul 24 2011, 16:46
Эскизы прикрепленных изображений
 РЈРјРµРЅСЊС€РµРЅРѕ РґРѕ 80%
Прикрепленное изображение
858 x 573 (150.68 килобайт)
 
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 15:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.0144 секунд с 7
ELECTRONIX ©2004-2016