Страница 1 из 1
UART MSP430 вопрос
Добавлено: Пн мар 20, 2017 20:45:08
ice126
Здравствуйте.
Не могу понять, почему не вызывается обработчик прерывания.
При том, что при передаче с COM Port Toolkit мигает светодиод RXD но в терминале ничего не отображается и прерывание не вызывается.
Порты создаю и связываю Virtual Serial Ports. Тестовое сообщение из кода выводит что попало в COM Port Toolkit.
Прерывание RX
Спойлер
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
char data;
data = UCA0RXBUF;
uart_puts(data);
}
Инициализация UART
Спойлер
BCSCTL1 = CALBC1_1MHZ; // Тактовая частота 1MHz
DCOCTL = CALDCO_1MHZ;
P3SEL = BIT5+ BIT4; // настраиваем линии порта
UCA0CTL1 |= UCSSEL_2; // Источник тактирования UART --- SMCLK
UCA0BR0 = 104; // Настраиваем скорость 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Модуляция UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // Инициализируем модуль USCI
IE2 |= UCA0RXIE; // Разрешаем прерывания от UART.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 07:08:48
JackSmith
Мне не удалось завести в Proteus UART на MSP430x2xx, пришлось использовать софтовый.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 12:23:05
ice126
JackSmith писал(а):Мне не удалось завести в Proteus UART на MSP430x2xx, пришлось использовать софтовый.
Я уже тоже решил плюнуть на это дело и в железе отладку делать.
Реально прикошмарило каждый раз после запуска дебагера перезагружаться - зависает COM-порт.
COM Port Toolkit хоть порты все видит, а Proteus на СОМ4 заканчивается. Делаю мосты СОМ2-СОМ5, СОМ3-СОМ6, СОМ4-СОМ7
И так вот 3 раза дебагер запустил и перезагрузка.
С I2C разобрался и все нормально работает. Вот думаю может и здесь я туплю, а не Proteus.
Может это из-за Windows 7 - не знаю.
У меня вообще проект на G2553, но его нет в Proteus.
Хотел отладить на F2132, а потом просто поменять линии порта и уже тестить в железе окончательно.
Добавлено after 15 minutes 57 seconds:
В то же время, когра вешаю на RXD осциллограф - сечет передачу по порту.
Мне кажется тут что-то с приемом на уровне МК, а вот что?..
Еще для G2553 линии порта указываются P1SEL и P1SEL2, а для F2132 - P3SEL.
Может здесь собака зарыта?
Хотя я пока еще думаю, что где-то я туплю - только изучаю данный МК.

Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 14:05:58
JackSmith
ice126 писал(а):
Я уже тоже решил плюнуть на это дело и в железе отладку делать.
Аналогично, АЦП я там тоже не поднял, вне зависимости от того, что кидаешь на него: землю или шину питания - всегда выдает 1023, хотя та же программа на железке вполне нормально работает. Про то что I2C там рабочий для меня новость, я даже пытаться не стал его поднять, сразу поставил совтовый, потом попробую аппаратный завести.
У меня вообще проект на G2553, но его нет в Proteus.
В Proteus 8.5 он уже есть.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 14:45:57
ice126
JackSmith писал(а):ice126 писал(а):
Я уже тоже решил плюнуть на это дело и в железе отладку делать.
Аналогично, АЦП я там тоже не поднял, вне зависимости от того, что кидаешь на него: землю или шину питания - всегда выдает 1023, хотя та же программа на железке вполне нормально работает. Про то что I2C там рабочий для меня новость, я даже пытаться не стал его поднять, сразу поставил совтовый, потом попробую аппаратный завести.
У меня вообще проект на G2553, но его нет в Proteus.
В Proteus 8.5 он уже есть.
АЦП и I2C у меня работает норм. Компаратор тоже работает. Правда, когда выставил регистры на внешнее опорное Proteus вылетал всегда в фатал эрор. С 0,25 и 0,5 питания компаратор работает без проблем.
Может все же кто-то запустил USCI в Proteus? Поделитесь кодом, пожалуйста.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 15:04:30
Ser60
Верно-ли я понимаю, что проблема только как работать с UART в Протеусе, а в железе все работает? Протеус я не использую, но если есть проблемы с функционированием модулей MSP430 в железе, мог-бы помочь.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 17:35:43
ice126
Ser60 писал(а):Верно-ли я понимаю, что проблема только как работать с UART в Протеусе, а в железе все работает? Протеус я не использую, но если есть проблемы с функционированием модулей MSP430 в железе, мог-бы помочь.
Здравствуйте.
В железе еще не реализовано - тестирую в Протеусе.
Если Вам не сложно - гляньте, правильно ли я инициализирую и прерывание прописал?
Добавлено after 13 minutes 8 seconds:
JackSmith писал(а):
У меня вообще проект на G2553, но его нет в Proteus.
В Proteus 8.5 он уже есть.
Типа есть. При создании проекта можно указать этот МК, но в наборе компонент его нет.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 19:09:04
Ser60
Вот Вам рабочий код, проверенный в железе под IAR. Он принимает символ из терминала по прерыванию и если это латинская буква, то инвертирует заглавные в строчные и наоборот, и отсылает символ обратно в терминал.
У Вас имеется внутрисхемный отладчик? Если ДА, никогда не понимал зачем нужен Протеус при наличии отладчика.
Спойлер
Код: Выделить всё
#include "io430.h"
#define RX P1 // UART pins on P1
#define TX P2
void Clock_config(); // function prototypes
void Ports_config();
void UART_config();
int main()
{
WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
Clock_config(); // set 8 MHz MSCK, 2 MHz SMCLK
Ports_config(); // set up ports for GPIO
UART_config(); // configure USCI A0 module for UART
__enable_interrupt(); // enable interrupts globally
__low_power_mode_0(); // wait for char receive
while(1)
{
__no_operation();
}
}
void Clock_config() // configure basic clock module
{
DCOCTL = CALDCO_1MHZ; // set 1 MHz MCLK
BCSCTL1 = CALBC1_1MHZ;
BCSCTL2 = 0; // SMCLK=MCLK
BCSCTL3 = LFXT1S1; // select VLO as ACLK
}
void Ports_config()
{
P1SEL = RX + TX; // assign P1.1 and P1.2 to UCA0
P1SEL2 = RX + TX;
}
void UART_config()
{
UCA0CTL1 = UCSSEL1 + UCSWRST; // SMCLK, keep module in RESET
UCA0BR1 = 0;
UCA0BR0 = 104; // set 9600 8N1 mode
UCA0MCTL = UCBRS1; // fractional part of freq. divider
UCA0CTL1 &= ~UCSWRST; // enable operation
IE2 = UCA0RXIE; // enable RX interrupt
}
#pragma vector=USCIAB0RX_VECTOR // USI UART handler
__interrupt void USCI_ISR(void)
{
char c = UCA0RXBUF; // get received character
if (('A' <= c && c <= 'Z') ||
('a' <= c <= 'z'))
c ^= 32; // flip case of letters
while(!IFG2 & UCA0TXIFG){} // wait for TX ready
UCA0TXBUF = c; // transmit character
}
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 19:52:05
ice126
Все же не во мне проблема.
Протеус уже 8.6 поставил - результат тот же.
К стати, G2553 тоже дает выбрать на стадии создания проекта, но компонента такого нет.
Жаль.
Сколько искал доп библиотеки - только за 600 баксов есть с этим МК.
Re: UART MSP430 вопрос
Добавлено: Вт мар 21, 2017 20:25:58
Ser60
Не понял какие доп. библиотеки искали. Для Протеуса что-ли? Мой Вам совет - забудьте о нём. Зачем Вам нужен инструмент, в котором баг на баге сидит, и который, к тому-же, не гарантирует, что после него будет работать в железе. Я код, выложенный выше только чтo лично проверит с G2553 и USB-UART конвертером на CP2104 и терминальной программой от Parallax и работоспособность его гарантирую.
Спойлер

Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 00:24:57
JackSmith
ice126 писал(а):К стати, G2553 тоже дает выбрать на стадии создания проекта, но компонента такого нет.
Жаль.
?
Ser60 писал(а):Верно-ли я понимаю, что проблема только как работать с UART в Протеусе, а в железе все работает? Протеус я не использую, но если есть проблемы с функционированием модулей MSP430 в железе, мог-бы помочь.
Не могу выставить тактирование через DCO
Вне зависимости от константы устанавливается одинаковая частота около 8MHz(судя по скорости мигания светодиода). В чем может быть причина? Чип: msp430g2453
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 01:05:42
Ser60
Не можете в Протеусе или в железе - с этого следует начинать вопрос. Если первое, то я бессилен. Строчки кода для установки частоты DCO правильные. Посмотрите отладчиком содержимое этих регистров (DCOCTL и BCSCTL1) и посчитайте какая должна быть частота. Или просто выведите SMCLK на P1.4 и измерьте. В общем, мало информации. Может у Вас в коде светодиод управляется таймером тактируемым от ACLK, или частотой независимой от DCO.
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 07:44:15
JackSmith
Ser60 писал(а):Не можете в Протеусе или в железе - с этого следует начинать вопрос. Если первое, то я бессилен. Строчки кода для установки частоты DCO правильные. Посмотрите отладчиком содержимое этих регистров (DCOCTL и BCSCTL1) и посчитайте какая должна быть частота. Или просто выведите SMCLK на P1.4 и измерьте. В общем, мало информации. Может у Вас в коде светодиод управляется таймером тактируемым от ACLK, или частотой независимой от DCO.
речь шла конечно же о реальном чипе. отладчика увы нет, есть только BSL программатор. теоретически можно было бы значения нужных регистров передать через UART, но чтобы выставить битрейт передатчика, нужно знать скорость работы микроконтроллера.
прошивка простейшая:
Код: Выделить всё
#include <msp430g2453.h>
#include <sys/types.h>
#define LED BIT0
int main (void)
{
WDTCTL=WDTPW | WDTHOLD; //turn off watchdog
P1DIR = LED;
P1OUT &=~LED;
// setup DCO
DCOCTL=CALDCO_1MHZ;
BCSCTL1=CALBC1_1MHZ;
int i=0;
while (1)
{
for(i=0;i<20;i++)
__delay_cycles(0xFFFF);
P1OUT ^= LED;
}
return 0;
}
здесь если суффиксы констант поменять на 16MHZ, то если судить по частоте мигания светодиода, эффекта никакого это не производит. причем, если вообще убрать это строки:
то микроконтроллер работает на частоте 1MHz если судить по коэффициенту UART.
Если сравнивать ассемблерный код для 16MHz варианта, то здесь все правильно:
Код: Выделить всё
0000e03e <main>:
e03e: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80
e042: 20 01
e044: d2 43 22 00 mov.b #1, &0x0022 ;r3 As==01
e048: f2 f0 fe ff and.b #-2, &0x0021 ;#0xfffe
e04c: 21 00
e04e: d2 42 f8 10 mov.b &0x10f8,&0x0056
e052: 56 00
e054: d2 42 f9 10 mov.b &0x10f9,&0x0057
e058: 57 00
e05a: 0e 43 clr r14
e05c: 06 3c jmp $+14 ;abs 0xe06a
e05e: 3f 40 54 55 mov #21844, r15 ;#0x5554
e062: 1f 83 dec r15
e064: fe 23 jnz $-2 ;abs 0xe062
e066: 03 43 nop
e068: 1e 53 inc r14
e06a: 3e 90 14 00 cmp #20, r14 ;#0x0014
e06e: f7 3b jl $-16 ;abs 0xe05e
e070: d2 e3 21 00 xor.b #1, &0x0021 ;r3 As==01
e074: 0e 43 clr r14
e076: f3 3f jmp $-24 ;abs 0xe05e
0000e078 <__stop_progExec__>:
e078: 32 d0 f0 00 bis #240, r2 ;#0x00f0
e07c: fd 3f jmp $-4 ;abs 0xe078
для 1MHz варианта:
Код: Выделить всё
0000e03e <main>:
e03e: b2 40 80 5a mov #23168, &0x0120 ;#0x5a80
e042: 20 01
e044: d2 43 22 00 mov.b #1, &0x0022 ;r3 As==01
e048: f2 f0 fe ff and.b #-2, &0x0021 ;#0xfffe
e04c: 21 00
e04e: d2 42 fe 10 mov.b &0x10fe,&0x0056
e052: 56 00
e054: d2 42 ff 10 mov.b &0x10ff,&0x0057
e058: 57 00
e05a: 0e 43 clr r14
e05c: 06 3c jmp $+14 ;abs 0xe06a
e05e: 3f 40 54 55 mov #21844, r15 ;#0x5554
e062: 1f 83 dec r15
e064: fe 23 jnz $-2 ;abs 0xe062
e066: 03 43 nop
e068: 1e 53 inc r14
e06a: 3e 90 14 00 cmp #20, r14 ;#0x0014
e06e: f7 3b jl $-16 ;abs 0xe05e
e070: d2 e3 21 00 xor.b #1, &0x0021 ;r3 As==01
e074: 0e 43 clr r14
e076: f3 3f jmp $-24 ;abs 0xe05e
0000e078 <__stop_progExec__>:
e078: 32 d0 f0 00 bis #240, r2 ;#0x00f0
e07c: fd 3f jmp $-4 ;abs 0xe078
что я делаю не так?
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 14:19:25
ice126
Ser60 писал(а):Не понял какие доп. библиотеки искали. Для Протеуса что-ли? Мой Вам совет - забудьте о нём. Зачем Вам нужен инструмент, в котором баг на баге сидит, и который, к тому-же, не гарантирует, что после него будет работать в железе. Я код, выложенный выше только чтo лично проверит с G2553 и USB-UART конвертером на CP2104 и терминальной программой от Parallax и работоспособность его гарантирую.
Спойлер

Пока нет внутрисхемного. Максимум что есть отладочная платка за 4 бакса от TI и то как-то не пользуюсь ею - только для прошивки, как правило.
Протеус глючный и я в этом убедился, но все же некоторые вещи он помогает выполнить быстрее и проще. По крайней мере пока мне помогает.
Добавлено after 4 minutes 5 seconds:
JackSmith писал(а):ice126 писал(а):К стати, G2553 тоже дает выбрать на стадии создания проекта, но компонента такого нет.
Жаль.
?
Вы бы не могли выложить свои библиотеки где-то?
Добавлено after 3 hours 8 minutes 23 seconds:
Извините - протупил. Протеусов у меня два и, соответственно, 8.6 хватнул пути библиотек от 8.1
Разрулил. Спасибо.
Самое интересное, когда даешь список из двух путей то он берет не самую новую библиотеку, а первую по списку...
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 16:01:52
Ser60
JackSmith - всё правильно у Вас в коде. Сдаётся мне, что Вы затерли калибровочные константы в памяти МК. Они хоть и дефолтно защишены от записи после ресета, но ... всё бывает. Попробуйте згрузить непосредственно их значения для моего экземпляра 2553. Точных частот у себя вряд-ли получите, но разницу между 1 и 16 мгц ощутите:
CALDCO_16MHZ = 0x90
CALBC1_16MHZ = 0x8F
CALDCO_12MHZ = 0x9A
CALBC1_12MHZ = 0x8E
CALDCO_8MHZ = 0x8C
CALBC1_8MHZ = 0x8D
CALDCO_1MHZ = 0xCD
CALBC1_1MHZ = 0x86
ice126 - какая у Вас платка за $4?
Такая? Раньше она действительно $4 стоила, сейчас около $10.
Коты - купите себе хотя-бы такую по ссылке выше. На ней и программатор и внутрисхемный отладчик имеется. Без него будете тыркаться с МК как слепые котята. Начнёте пользоваться - сами поймёте, что никакой Протеус и не нужен будет.
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 17:55:25
ice126
Ser60 писал(а):
ice126 - какая у Вас платка за $4?
Такая? Раньше она действительно $4 стоила, сейчас около $10.
Коты - купите себе хотя-бы такую по ссылке выше. На ней и программатор и внутрисхемный отладчик имеется. Без него будете тыркаться с МК как слепые котята. Начнёте пользоваться - сами поймёте, что никакой Протеус и не нужен будет.
Да, такая. Но я ее брал на Али дешевле. Давно не паял и не програмил - со студенческих, по сути. Сейчас оброс и комплектухой и инструментами, осцилл купил, но всего сразу не купишь.
Чесно говоря, в сторону внутрисхемного даже не думал, но теперь подумаю. Поищу у китайцев.
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 18:05:01
Ser60
Вы на правильном пути

Но прежде чем покупать что-то более серьёзное, начните с той платки. С её помощью можно и внешние чипы отлаживать внутрисхемно. Их можно к ней подключить сняв джамперы, в мануале на плату все расписано.
Re: UART MSP430 вопрос
Добавлено: Ср мар 22, 2017 18:46:50
JackSmith
Ser60 писал(а):JackSmith - всё правильно у Вас в коде. Сдаётся мне, что Вы затерли калибровочные константы в памяти МК. Они хоть и дефолтно защишены от записи после ресета, но ... всё бывает. Попробуйте згрузить непосредственно их значения для моего экземпляра 2553. Точных частот у себя вряд-ли получите, но разницу между 1 и 16 мгц ощутите:
CALDCO_16MHZ = 0x90
CALBC1_16MHZ = 0x8F
CALDCO_12MHZ = 0x9A
CALBC1_12MHZ = 0x8E
CALDCO_8MHZ = 0x8C
CALBC1_8MHZ = 0x8D
CALDCO_1MHZ = 0xCD
CALBC1_1MHZ = 0x86
с этими константами вроде все заработало как надо, потом еще буду проверять с соответствующими UART коэффициентами. спасибо)
Re: UART MSP430 вопрос
Добавлено: Ср мар 29, 2017 19:11:55
ice126
К стати, USCI u I2C, которые работали на F2132, на G2553 в Proteus 8.6 не ожило. Причина не понятна. Ноги поменял, а все остальное оставил в прежнем виде.
Не работает. Ну и фиг с ним - буду в железе уже реализовывать.