Страница 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

Код: Выделить всё

    DCOCTL=CALDCO_1MHZ;
    BCSCTL1=CALBC1_1MHZ;
Вне зависимости от константы устанавливается одинаковая частота около 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, то если судить по частоте мигания светодиода, эффекта никакого это не производит. причем, если вообще убрать это строки:

Код: Выделить всё

    DCOCTL=CALDCO_1MHZ;
    BCSCTL1=CALBC1_1MHZ;
то микроконтроллер работает на частоте 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
Вы на правильном пути :beer: Но прежде чем покупать что-то более серьёзное, начните с той платки. С её помощью можно и внешние чипы отлаживать внутрисхемно. Их можно к ней подключить сняв джамперы, в мануале на плату все расписано.

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 не ожило. Причина не понятна. Ноги поменял, а все остальное оставил в прежнем виде.
Не работает. Ну и фиг с ним - буду в железе уже реализовывать.