TI MSP430 Launch Pad

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Ser60 писал(а):Использовать COM порт можно даже одновременно с работающим отладчиком. Я это делал для статьи
http://radiokot.ru/circuit/analog/receiv_transmit/33/
подскажите, а код вашей статьи тоже имеет такую особенность: пересылаемые пакеты не покажет программа portmon?

Я спрашиваю, потому что найденный в инете простой код для energia:
Спойлерvoid setup() {
// P1_0 - red LED
// P1_6 - green LED
pinMode(P1_0, OUTPUT);
pinMode(P1_6, OUTPUT);

Serial.begin(9600);
}

void loop() {
digitalWrite(P1_0, HIGH); // set the LED on
digitalWrite(P1_6, LOW); // set the LED off
Serial.println('H');
delay(1000); // wait for a second
digitalWrite(P1_6, HIGH); // set the LED on
digitalWrite(P1_0, LOW); // set the LED off
Serial.println('L');
delay(1000); // wait for a second
}
- от его работы тоже отображает пересылаемые данные только putty (или с monitor-ом, встроенный в energia), а portmon наотрез отказывается что-нибудь показывать. Терялся в догадках, - это ведь через com-порт кидается, а значит сканер com-порта portmon должен показывать хотя бы мусор. ..Или portmon не умеет сканировать :) или должен быть как-то хитро настроен (а при этом пакеты, которые я кидаю используя c# net, portmon прекрасно показывает). Просветите.
Реклама
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Просветите.
Тут проблема может быть в том, что, если использовать мост USB-UART, порт получается виртуальный. И кто знает, как там portmon на него реагирует...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

YS писал(а):
Просветите.
Тут проблема может быть в том, что, если использовать мост USB-UART, порт получается виртуальный. И кто знает, как там portmon на него реагирует...
хм... я полагал, что переходник usb-com, используемый для связи с приборами по com-порту (c# net, Win XP Home Edition SP3 лиц), предоставляет в систему такой же виртуальный com-порт, что и MSP430 LaunchPad (в смысле свободной доступности к нему всеми возможными программными средствами как к аппаратному com-порту).

Выходит, эти два com-порта для системы представлены по-разному?
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

в смысле свободной доступности к нему всеми возможными программными средствами
Вопрос как раз в том, как этот самый portmon осуществляет к нему доступ. Он же вроде как-то перехватывает поток данных, а не по-человечески открывает порт...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3795
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

VLeshka писал(а):пересылаемые пакеты не покажет программа portmon?
Никогда о такой не слышал, но LaunchPad предоставляет в систему стандартный COM порт. Скачайте одну из тех программ терминалок, что в статье упомянуты, и все будет работать. С Energia я тоже не балуюсь и Вам не советую.
Реклама
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Написал на c# net простенькую прогу, подключающаяся к com-порту и показывающая всё что оттуда идёт - так и есть, данные от MSP430 LaunchPad через com-порт идут! :music:
Вы были правы, portmon в данном случае просто не работает! :shock:
Реклама
Первый раз сказал Мяу!
Сообщения: 25
Зарегистрирован: Вс дек 02, 2012 21:11:30

Сообщение Unrealee »

Доброго времени суток. Имеется АЦП, реализованный на MSP430G2553, работают 4-е канала.
СпойлерADC10CTL0 &= ~ENC;//отключили преобразование (бит должен быть "0" чтобы не возникало проблем с конфигом АЦП,в данном случае смена канала)
ADC10CTL1 = INCH_0;//канал А0
ADC10CTL0 |= ENC + ADC10SC;// аля "конфиг принять" и Start Convertion
LPM0;
a = ADC10MEM;
ADC10CTL0 &= ~ENC;//отключили преобразование (бит должен быть "0" чтобы не возникало проблем с конфигом АЦП,в данном случае смена канала)
ADC10CTL1 = INCH_1;//канал А0
ADC10CTL0 |= ENC + ADC10SC;// аля "конфиг принять" и Start Convertion
LPM0;
b = ADC10MEM;
DC10CTL0 &= ~ENC;//отключили преобразование (бит должен быть "0" чтобы не возникало проблем с конфигом АЦП,в данном случае смена канала)
ADC10CTL1 = INCH_2;//канал А0
ADC10CTL0 |= ENC + ADC10SC;// аля "конфиг принять" и Start Convertion
LPM0;
c = ADC10MEM;
ADC10CTL0 &= ~ENC;//отключили преобразование (бит должен быть "0" чтобы не возникало проблем с конфигом АЦП,в данном случае смена канала)
ADC10CTL1 = INCH_3;//канал А0
ADC10CTL0 |= ENC + ADC10SC;// аля "конфиг принять" и Start Convertion
LPM0;
d = ADC10MEM;
Необходимо для каждой переменной, реализовать усреднение. По железной части вылизано все - фильтры НЧ на входе, соединение с датчиками витой парой и т.д. Наблюдается дребезг входного сигнала - на последнем разряде (принимаемое число 4-х разрядное).
Помогите с реализацией алгоритма на С.
Друг Кота
Аватара пользователя
Сообщения: 3795
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Поставьте весь код в цикл, выполняемый, например, 4 раза и суммируйте показания. Например,
a += ADC10MEM;
Перед входом в цикл значение а следует обнулить. По выходу из цикла разделите а на 4. Еще лучше сделать скользящее среднее, см. в Википедии.

А последний разряд всегда будет плавать даже с идеальным АЦП, т.к. в каждом сигнале есть шум.
Родился
Аватара пользователя
Сообщения: 2
Зарегистрирован: Вс июл 21, 2013 11:01:50

Сообщение avael »

Здравствуйте!
Купил на днях лаунчпад с целью научиться работать с микроконтроллерами, ну и в целом хотябы паять :D
До этого кодил на asm'e по мелочи.
Сделал, чтобы лампочка мигала, всё ок.
Решил потом по нажатию на кнопу включать и выключать лампочку(без мигания).
И тут что-то пошло не так! Сначала долго искал, как вообще обрабатывать прерывания(на С много примеров, на ASM'e, да еще и IAR'овском, примеров с этим маловато).
Потом вроде сел обрабатывать, но не тут то было! По нажатию на кнопу не происходит ровным счетом ничего, зато когда трогаю ногу P1.3, срабатывает и обрабатывается прерывание.
Внимание - вопрос: почему на кнопку то не реагирует?
И вдогонку еще один - когда трогаю контакт, прерывание срабатывает n раз, пока не отпущу, т.е. лампочка хаотично включается-выключается. Как бы заставить её независимо от длины нажатия срабатывать только один раз?

Немножко увлекательного кода:
Спойлер

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

#include "msp430.h"                     ; подключаем заголовочный файл

        NAME    main                    ; имя модуля
        PUBLIC  main                    ; установить видимость модуля из других

        ; Вектора прерываний
        RSEG    INTVEC
        ORG     RESET_VECTOR           ; вектор сброса
        DC16    init 
        ORG     PORT1_VECTOR
        DC16    P1_ISR

        RSEG    CSTACK                  ; объявление сегмента стека

        RSEG    CODE                    ; объявление сегмента кода

init:   
        MOV     #SFE(CSTACK), SP        ; инициализация регистра стека

main:                                   ; начало основной части
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL  ; запрет сторожевого таймера
        
        bis.b #BIT3, &P1IE
        bis.b #BIT3, &P1IES
        bic.b #BIT3, &P1IFG
        
        bis.w #GIE, SR
        
        MOV.b #40h, &P1DIR
        MOV.b #0, &P1OUT
        
        XOR.b #BIT6, &P1OUT
        JMP $                           ; jump to current location '$'

P1_ISR: 
        XOR.b #BIT6, &P1OUT
        bic.b #BIT3, &P1IFG            ; P1.3 IFG Cleared
        reti                            ; Return from ISR

        END
Друг Кота
Аватара пользователя
Сообщения: 3795
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

Vyvod knopki nado podtyanut' k pitaniyu I obrabatyvat' drebezg.
Po ostal"nym voprosam sm. knigu J. Davies "MSP430 basics...". Ona est' v seti dlya skachivaniya.
Родился
Аватара пользователя
Сообщения: 2
Зарегистрирован: Вс июл 21, 2013 11:01:50

Сообщение avael »

А что такое "подтянуть" и "дребезг" ?))
Друг Кота
Аватара пользователя
Сообщения: 3795
Зарегистрирован: Ср дек 24, 2008 09:58:58

Сообщение Ser60 »

"подтянуть" = см. pull up resistor
mov #0x08, &P1OUT
mov #0x08, &P1OUT
"дребезг" = см. debouncing v wikipedia.com
http://processors.wiki.ti.com/index.php ... PushButton
А вообще, читайте книгу, что я рекомендовал выше. Там есть ответы на все заданные Вами выше вопросы.
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Подскажите, а приведённый мною код не работает потому что среди всевозможных тактовых сигналов для всего и вся можно поставить только один?
P.S. Не могу точно найти подтверждающую мою инфу (плохо ищу).
P.S.2 код [пока не] выводит сообщение в com-порт на PC, когда меняет состояние светодиодов.
Спойлер#include "io430g2553.h"

#include "string."

unsigned int sch=0, zaderzhka = 1; //счётчик, и "какждый какое по счёту" срабатываний прерывания таймера будут вкл/выкл светодиоды
string str = "ok";

char c='l';

void UARTWriteString(string str);

int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

//готовим порт1 с диодам
P1DIR = BIT0 + BIT6; //инициализируем выходы 0 и 6 (на 0 выведен красный светодиод, на 6 - зелёный)
P1OUT = BIT6; //ставим выход 6 в 1

//готовим таймер
CCTL0 = CCIE; //Capture/Compare разрешаем прерывание по переполнению счётчика-таймера
TACTL = TASSEL_2 + MC_2 + ID_3; //Timer_A Control, источник тактов на SMCLK (SubMainCLocK), и режим таймера - continuous, и (медленнее в 8 раз) делитель 8
__bis_SR_register(CPUOFF + GIE); //флаги в Status Register: экономичный режим CPUOFF и разрешаем глобально прерывания GIE

BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

UARTWriteString("---Привет, Хабр!---");
}

#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_PRE (void)
{
sch++;
if ((sch%zaderzhka)==0)
{
P1OUT ^= BIT0 + BIT6; //вкл и выкл диоды
UARTWriteString(str);
}

}

void UARTWriteString(string str)
{
//тестовый посыл в uart-порт
int strSize = str.length();
for(int i = 0; i < strSize; i++)
{
//WDTCTL = WDTPW + WDTCNTCL; // Сброс таймера watchdog в ноль.
while (!(IFG2&UCA0TXIFG))
; // Проверка готовности буфера отправки.
UCA0TXBUF = c;//str;
}
}
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Нет. Настройка не завершается.

После

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

__bis_SR_register(CPUOFF + GIE); //флаги в Status Register: экономичный режим CPUOFF и разрешаем глобально прерывания GIE
CPU сразу засыпает. И все это

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

BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 = BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 104; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt

UARTWriteString("---Привет, Хабр!---");
Не выполняется. Соответственно, UART не инициализируется.

P.S.

Казалось бы, причем тут Хабр? :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

YS писал(а):Не выполняется. Соответственно, UART не инициализируется.

P.S.

Казалось бы, причем тут Хабр? :)
а.. так это я уже кинулся копироввать справа и слева (т.е. с инета), лишь бы найти весточку-зацепку почему не работает. :)

Так моё предположение о том, что может быть только один источник тактовых сигналов, от которого всё и вся и работает, не верно?
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Понятно, что у одного конкретного модуля может быть только один источник тактирования. А дальше давайте обратимся к документации.

Стр. 274 User's Guide:

Изображение

Кстати, снизу этой страницы в документации есть важные замечания, которые не вошли в скриншот.

Видим, что на выходе модуля тактирования имеется три сигнала. И каждый из них может быть подключен только к одному генератору в один момент времени. Впрочем, ничто не мешает переключать их в рантайме.

Мораль: каждая из трех линий тактирования может быть подключена только к одному генератору из доступных и каждый модуль может быть подключен только к одной (произвольной) линии тактирования из этих трех. Что, в общем, естесственно.

Тактировать все модули от одной линии (если Вы об этом) необязательно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Да, я об этом! Спасибо! :))
YS
Друг Кота
Аватара пользователя
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05

Сообщение YS »

Не за что. :)

Только надо иметь в виду, что, если модули подключены к физически разным генераторам, могут возникнуть проблемы с синхронизацией. Подробнее см. в мануале.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Контактная информация:
Открыл глаза
Сообщения: 43
Зарегистрирован: Чт июл 04, 2013 15:15:22

Сообщение VLeshka »

Приветствую всех ещё раз. :)
Теперь я написал программу, по нажатию кнопки меняющая скорость мигания светодиодам.
Работает так:
- нажал на кнопку - и мигание происходит в 2 раза быстрее.
- и так далее, пока мигание не станет максимально быстрым. Если мигание самое быстрое, то при очередном нажатии кнопки мигание светодиодами становится самым медленным.
При "нормальной" работе требуется 6 нажатий, для прохода от самого медленного мигания до самого медленного же, по кругу.

Работает.:) Проблема в том, что для прохода от самого медленного мигания до самого медленного же по кругу, проходит разное количество нажатий - то 6, то 5, а то и 4.
Никак не могу понять, в чём дело.
Пробовал сбрасывать таймер, останавливать вручную прерывания (при обработке прерываний) - нивкакую.

Подскажите, в чём проблема.
P.S.Код привёл. В нём то, что я добавил для отладки, я отметил пустым //.
Спойлер#include "io430g2553.h"

unsigned int maxPause=0x1F;//FFF;
unsigned int maxDelitel = 16;
unsigned int i_time = 0, i_delitel = 1;

void timer_run();

int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

//готовим порт с диодам
P1DIR = (BIT0 + BIT6); //инициализируем выходы 0 и 6
P1OUT = BIT6; //ставим выход 6 в 1

//готовим таймер
CCTL0 = CCIE; //разрешаем прерывание по переполнению счётчика-таймера
timer_run();
__enable_interrupt(); //глобально разрешаем прерывания в status register

//готовим кнопку
P1REN |= BIT3; //разрешаем подтяжку
P1OUT |= BIT3; //подтяжка вывода P1.3 вверх, иначе будет всегда срабатывать if ((P1IN & BIT3) == 0)

P1IFG &= ~BIT3; // Очистка флага прерываний для P1.3
// P1IES |= BIT3; // Прерывание происходит по 1/0 (отпусканию/нажатию)
P1IE |= BIT3; //разрешаем прерывание для P1.3

while(1);
}

//
void timer_run()
{
TACTL = 0; //останов таймера

//используются три системных тактовых сигнала: ACLK, MCLK и SMCLK и INCLK (INCLK is device-specific)
TACTL = (TASSEL_2 + MC_2 + ID_0); //ставим источник тактов на SMCLK, и режим таймера - continuous, и делитль =1 (1 2 4 8)
}

//прерывание по таймеру используем для вкл/выкл с/диодов
#pragma vector = TIMER0_A0_VECTOR //приоритет 0xFFF0
__interrupt void TIMER0_A0_PRE (void)
{
//
__disable_interrupt(); //глобально запрещаем прерывания в status register

i_time += i_delitel;
if (i_time >= maxPause)
{
P1OUT ^= (BIT0 + BIT6);
i_time = 0;
}

//
__enable_interrupt(); //глобально разрешаем прерывания в status register
}

//прерывание по кнопке используем для игр с паузой
#pragma vector = PORT1_VECTOR //приоритет 0xFFE4
__interrupt void PORT1_VECTOR_PRE (void)
{
//
__disable_interrupt(); //глобально запрещаем прерывания в status register

P1IE &= ~BIT3; // Запрет прерываний на P1.3
if (i_delitel<=maxDelitel) i_delitel *= 2;
else i_delitel = 1;
P1IFG &= ~BIT3; // Очистка флага прерываний для P1.3, т.к. это прерывание имеет несколько флагов
P1IE |= BIT3; // Разрешение прерываний на P1.3
timer_run();

//
__enable_interrupt(); //глобально разрешаем прерывания в status register
}
Опытный кот
Аватара пользователя
Сообщения: 848
Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа

Сообщение Psych »

Ну опять таки дребезг. Введите хотя бы паузу в PORT1_VECTOR
Ответить

Вернуться в «Разные вопросы по МК»