Jump to content

Search the Community

Showing results for tags 'MSP430'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Вопрос-Ответ. Для начинающих
    • Песочница (Q&A)
    • Дайте схему!
    • Школьникам и студентам
    • Начинающим
    • Паяльник TV
    • Обсуждение материалов с сайта
    • Competition 2019
  • Радиоэлектроника для профессионалов
    • Световые эффекты и LED
    • Роботы и модели на ДУ-управлении
    • Автоматика
    • Самодельные устройства к компьютеру
    • Программное обеспечение
    • Автомобильная электроника
    • Системы охраны и наблюдения. Личная безопасность
    • Питание
    • Электрика
    • Промышленная электроника
    • Ремонт
    • Металлоискатели
    • Измерительная техника
    • Мастерская радиолюбителя
    • Сотовая связь
    • Спутниковое ТВ
    • КВ и УКВ радиосвязь
    • Жучки
    • Телефония и фрикинг
    • Высокое напряжение
    • Идеи и технологии будущего
    • Справочная радиоэлементов
    • Литература
    • Разное
  • Аудио
    • FAQ, Технологии и компоненты
    • Для начинающих
    • Источники звука
    • Предусилители, темброблоки, фильтры
    • Питание аудио аппаратуры
    • Усилители мощности
    • Акустические системы
    • Авто-аудио
    • Ламповая техника
    • Гитарное оборудование
    • Прочее
  • Микроконтроллеры
  • Товары и услуги
  • Разное
  • Переделки's ATX->ЛБП
  • Переделки's разные темы
  • Киловольты юмора's Юмор в youtube
  • Радиолюбительская доска объявлений exDIY's Надежность и группы продавцов

Blogs

There are no results to display.

There are no results to display.

Marker Groups

  • Пользователи форума

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


ICQ


Skype


Интересы


Город


Сфера радиоэлектроники


Оборудование

Found 18 results

  1. Как часто у вас бывало так, что необходимо хранить данные в ЭСППЗУ, но в текущем МК места не хватало? Приходится брать следующий по уровню МК, хотя во всем остальном он избыточен. В MSP430 на основе FRAM памяти это уже может быть вовсе и не проблемой. Изначально FRAM память поделена на сегменты. В старших моделях таких сегментов 3 с произвольной защитой каждого из них, а в кристалле 2433 всего два сегмента: под код программы и под информационный сегмент. Но вся прелесть в том, что мы можем сохранять свои данные не только в информационном сегменте (у нас он всего 512 байт), но и в сегменте программ. От слов к делу. Сколько будем хранить? У меня IAR с лицензионным ограничением линковщика на 8кБ. Вот давайте столько и запишем =) Подключаем обязательные файлы #include "io430.h" #include "stdint.h" Определяем константу с сохраняемым объемом: #define Write_Size 4000 Создадим массив с вышеприведенным количеством элементов. У нас же архитектура 16 бит? Вот столько и запишем в элемент массива: __persistent uint16_t EEPROM[Write_Size]; директива __persistent - это аналог __no_init с той разницей, что __no_init указывает компилятору не инициализировать переменную в области SRAM, а __persistent - во FRAM области. Инициализируем счетчик, отключаем вачдог и переводим пин со светодиодом (для визуального наблюдения) на выход и обнуляем регистр вывода: uint16_t count = 0; WDTCTL = WDTPW + WDTHOLD; P1DIR |= BIT0; P1OUT = 0; Далее идет очень хитрая штука. Называется она регистр PM5CTL0. В этом регистре есть бит LOCKLPM5, назначение которого блокировать регистры порта ввода-вывода. А такое необходимо, т.к. выход из режимов x.5 возможен только через ресет. По умолчанию этот бит установлен и вся работа с пинами заблокирована. Чтобы разблокировать, необходимо в него записать 0: PM5CTL0 &= ~LOCKLPM5; Дальше пишем цикл: while (1) { if (EEPROM[Write_Size - 1] == Write_Size - 1) { P1OUT |= BIT0; } else { SYSCFG0 = FRWPPW; for (uint16_t i = 0; i < Write_Size; i++) { EEPROM[i] = count++; } SYSCFG0 = FRWPPW | PFWP; } } Если в последнем элементе массива ожидаемое значение, то загорается светодиод, если нет, то уходим в подпрограмму записи элементов массива. Но прежде, чем его писать, необходимо разрешить запись в область FRAM памяти. Это делается с помощью записи разрешающей сигнатуры, которая определена в константе FRWPPW, в регистр SYSCFG0. По окончании записи и для защиты FRAM памяти от перезаписи необходимо поднять бит PFWP. В заголовочном файле вся эта кухня записана так: /* SYSCFG0 Control Bits */ #define PFWP_L (0x0001u) /* Program FRAM Write Protection */ #define DFWP_L (0x0002u) /* Data FRAM Write Protection */ #define FRWPPW (0xA500u) /* FRAM protection password */ Запускаем IAR, прошиваемся. Передергиваем питание и снова заходим в дебаггер с помощью кнопочки Запускаем окно Symbolic Memory, где переходим по адресу 0хС400 (можно подсмотреть в окне Watch по начальному адресу массива) или с помощью меню выбираем FRAM. Листаем область памяти до конца и видим такую картину Все наши 8000 байт записаны и лежат в недрах МК. Enjoy!
  2. Приехала ко мне прямо от ковбоев плата под звучным названием LAUNCHPAD. Что на ней имеется? Прежде всего, это целевой МК на основе FRAM памяти - MSP430FR2433. Также на плате присутствует программатор/отладчик. И самое вкусное - это аппаратная обвязка технологии EnergyTrace™ Technology. В какой среде писать программу? TI предлагает две "каропки" - это полностью бесплатная CCS на основе ECLIPSE, и второй вариант - IAR. Также присутствует онлайн-редактор с минимальными возможностями (необходим агент на компьютере и расширение в браузере). CCS - это крайне тормознутый монстр (по сравнению с MSVS), при этом в нем есть всё для комфортной работы, хотя несколько и непривычно после MSVS (необходимо нажимать Ctrl + Space, чтобы появились подсказки). Первая мысль после запуска IAR - да поотрубать всем головы, кто ЭТО придумал. Редактор кода убогий настолько, насколько это возможно в принципе. Это самый обыкновенный блокнот с минимальной подсветкой. Правда, можно прикрутить внешний редактор типа notepad++, но тогда все "фенечки" (которых и так нет) исчезнут (нельзя перейти к декларации переменной/функции, нет подсказок и прочее). Тем не менее, IAR очень быстро запускается и очень шустро работает. Лично я пока его и использую, несмотря на всю убогость редактора. Лицензионная политика у IAR такая - либо бесплатно всегда, но не более 8кБ, либо без ограничений, но 30 дней. MISRA в обоих случаях не доступна. Мало кто знает, но у MSP430 тоже есть свой фреймворк, который полностью повторяет "arduino". Называется он Energia. Но, т.к. я изучаю МК, а не фреймворки, пользоваться я ей не буду. Литература у TI для своих МК организована так (это не правило, но в большинстве случаев так) - есть даташит на целое семейство МК (в нашем случае это MSP430FR4xx and MSP430FR2xx family User's Guide) с общим описанием всевозможных модулей, а для отдельных МК из этого семейства прилагается ещё один даташит уже с подробным описанием (что есть и чего нет в МК описывается именно в этом даташите). Для MSP430FR2433 документ так и называется: MSP430FR2433 Mixed-Signal Microcontroller datasheet. Давайте уже поморгаем. Моргать в стиле "Hello, world" уже не интересно, поэтому будем моргать в стиле "Привет, ЗЕМЛЯНЕ!". Тем более, что у нас для этого есть аж пять таймеров со счетчиками в 16 бит. Первое, что делаем, выключаем вачдог (по-умолчанию он включен): WDTCTL = WDTPW | WDTHOLD; Затем необходимо определить как выход тот пин, который мы можем подключить к блоку сравнения таймера и на котором у нас сидит светодиод. Это первая нога первого порта: P1DIR |= BIT1; Бит BIT1 в заголовочнике определен как: #define BIT1 (0x0002) Затем нам необходимо подключить выход блока сравнения к пину, чтобы на нем генерировать ШИМ. MSP430FR2433 здесь особого простора не предоставляет - всё жестко привязано аппаратно внутри. Поэтому открываем даташит на МК и смотрим картинку: К пину 1 порта 1 (P1.1) можно подключить первый компаратор нулевого таймера А (TA0). Первое услови е мы уже выполнили - пин переключили на выход. Теперь необходимо определить альтернативную функцию для выбранного пина. Это делается с помощью пары регистров P1SEL0 и P1SEL1. В них, согласно таблицы, необходимо записать число 10 на то место в регистре, пин которого должен обладать альтернативной функцией (да, мозгодробительно))): P1SEL1 = BIT1; Если бы мы подключали выход второго компаратора таймера А к пину (а это второй пин первого порта), то писали бы так: P1SEL1 = BIT2; Теперь запускаем таймер. ШИМ-ить будем, как уже сказали, нулевым таймером Timer_A (это экземпляр типового таймера A3). Чтобы таймер заработал, ему необходимо подключить источник тактирования. Источников тактирования в MSP430 несколько: внутренние ACLK и MSCLK, а также внешние - TACLK и INCLK. Для разнообразия, мы будем использовать сразу два: ACLK и MSCLK. Первый генерирует частоту 32768 Гц, второй 1 МГц (по-умолчанию. Но возможно и перестроить). Для нулевого таймера Timer_A бы будем использовать частоту 1 МГц, поэтому подключим MSCLK. Счетчик в этом типе таймера может считать до определенного значения как вверх, так и вверх и вниз, а также только вверх до максимального совего значения (0xFFFFFFFF). Мы определим, что счетчик считает только вверх и сбрасывается при достижении значения 256. Также перед включением таймера необходимо сбросить его самого и его предделитель. За это отвечает бит TACLR. Теперь всё сказанное запишем в коде: TA0CCR0 = 256; TA0CTL = TASSEL__SMCLK | MC__UP | TACLR; Перед запуском таймера необходимо настроить компаратор. У компаратора есть несколько режимов работы. Их можно посмотреть в даташите на семейство: Среди них я выбрал режим Toggle/Reset. Это режим Mode2: TA0CCTL1 = OUTMOD_2; И определим значение регистра сравнения сразу после инициализации: TA0CCR1 = 255; Всё, таймер настроен и уже работает. Для модуляции ШИМ -а будем использовать другой таймер этого же типа - TA1. Чтобы промодулировать наш ШИМ генератор (создание эффекта плавного затухания и загорания светодиода), я буду использовать такую конструкцию, вызываемую в прерывании от первого таймера Timer_A: #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__) #pragma vector=TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR(void) { switch(__even_in_range(TA1IV, TA1IV_TAIFG)) { case TA1IV_TAIFG: if (dir) { TA0CCR1 = count; } else { TA0CCR1 = 256 - count; } if (!count) { dir = !dir; } count --; break; default: break; } } где: volatile uint8_t count; volatile uint8_t dir; Ну и запуск таймера TA1. Отличие здесь в разрешении прерывания, источнике тактирования и отсутствие работы компараторов: TA1CCR0 = 255; TA1CTL = TASSEL__ACLK | MC__UP | TACLR | TAIE; Чтобы зря не гонять процессор между прерываниями, я его буду останавливать. Исторически так сложилось, что MSP430 предлагает богатый набор режимов энергосбережения. Я буду использовать режим остановки процессора - LPM3: __bis_SR_register(LPM3_bits | GIE); __no_operation(); // Для внутрисхемной отладки Выход из режима энергосбережения или его смена в МК MSP430 устроено несколько иначе, чем в Atmel. Суть в том, что периферийное устройство будит процессор, запускает необходимый осциллятор для своей работы, после завершения своей работы останавливается осциллятор (если он больше никому не нужен), а процессор уходит в тот режим, из которого его разбудили. И здесь каких-то телодвижений со стороны программиста совершать не требуется. Другое дело, если мы хотим совершить какие-то действия вне прерывания после пробуждения. Тогда в обработчике прерывания нам необходимо вручную сменить режим работы. Ну и вишенка: EnergyTrace™ Technology. На плате установлен ШИМ стабилизатор на основе МК из семейства MSP430. Как оно устроено и как работает - всё есть в документах от TI. Суть в том, что такая технология позволяет измерять токи вплоть до сотни наноампер с приемлемой точностью. Из минусов - работает только в режиме дебага. Впрочем, запускаем наш код и смотрим на токопотребление: Мы видим, что с ростом скважности ток падает и наоборот. Ну оно и логично. Enjoy!
  3. Приветствую всех. Подскажите не совсем программисту (или совсем не программисту) как грамотно реализовать программный SPI. МК CC430F5137 + OLED дисплей WEH000802A от Winstar. Данные 10 бит. Аппаратный в контроллере позволяет только 8, выход свой написать. Написал, но мне это не нравиться, знаю что можно намного проще, но не нахожу решения. Да и как то странно с портами в этом контроллере работается, нельзя (или не знаю как) данные напрямую в порт кидать, типа P1.0 = 1; А только BITами оперировать??? Вот что у меня получилось, смеяться разрешается )) // Обработчик дисплея // // Маразм для програмного SPI void SCL(uchar b) { if (b==1) (P1OUT |= BIT7); else P1OUT &= ~BIT7; } //Строб void CSB(uchar b) { if (b==1) (P1OUT |= BIT4); else P1OUT &= ~BIT4; } //Выбор чипа void SDI(uchar b) { if (b==1) (P1OUT |= BIT6); else P1OUT &= ~BIT6; } //Передаваемые данные void SDO(uchar b) { if (b==1) (P1OUT |= BIT5); else P1OUT &= ~BIT5; } //Принимаемые данные // Вывод управляющей команды для дисплея void WriteCMD(uchar CMD) { uchar i; CSB(0); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); for(i=0;i<8;i++) { uchar t = ((CMD>>(7-i)) & 0x01); // Как уйти от переменной t ????? SDI(t); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); } CSB(1); } /*============================================ Вывод одиночного символа на дисплей ============================================*/ void WriteOneDAT(uchar DAT) { uchar i;; CSB(0); SDI(1); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); SDI(0); _delay_cycles(100); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); for(i=0;i<8;i++) { uchar t =((DAT>>(7-i)) & 0x01); SDI(t); SCL(0); _delay_cycles(100); SCL(1); _delay_cycles(100); } CSB(1); } Технически разница между Командой и Данными в первом бите SDI и объединить эти две функции наверно не проблема, но я уверен что это можно написать как то грамотнее ... Как в этом контроллере с портами работать кроме как P1OUT |= BIT1 ??? Нельзя как то типа P1OUT_1 = 1; ?? Где то в буржуйской литературе мапинг какой то проскакивал, но там я вообще не вьехал про что это, для чего это.... Заранее Всем Благодарен.
  4. Здравствуйте. Я год работал с AVR намучался сильно и купил себе LaunchPad и начал работать с MSP430. На простых примерах всё супер но хочется большего. Когда читал статьи в нете 'испугался' ничего не понимал из слов Регистр,Таймер,Прерывания..... Посоветуйте пожалуйста курс (не книгу) но МК этого типа. Можно и на английском.
  5. Наткнулся на библиотеку hal_xxx.c от TI для MSP430. Ни как не могу найти, где взять взять полное семейство этих библиотек. Поделитесь ссылочной hal_UCS.c
  6. Доброго времени суток всем! Недавно возникла потребность передачи данных из микроконтроллера в ПК. Написал код на ассемблере, опираясь на Code_examples от TI, и то, что получилось, приведено ниже: #include "msp430F1232.h" RSEG CSTACK DS16 0 RSEG CODE ;--------------------------------------------------------------------- ; Установка тактирования от кварца ;--------------------------------------------------------------------- RESET mov #SFE(CSTACK),SP mov #WDTPW+WDTHOLD,&WDTCTL ;OSTANOVKA WDT BIC #OSCOFF, SR ; tAKTIROVANIE OT KVARCA BIS.B #XTS, BCSCTL1 L1 BIC.B #OFIFG, &IFG1 MOV #0FFh, R15 L2 DEC R15 JNZ L2 BIT.B #OFIFG, &IFG1 JNZ L1 BIS.B #SELM_3, &BCSCTL2 ;-------------------------------------------------------------------- ; Инициализация USART ;-------------------------------------------------------------------- mov.b #200,R7 bis.b #SWRST,&UCTL0; bis.b #030h,&P3SEL; P3.4,5 - USART bis.b #UTXE0+URXE0,&ME2; Включение передачи и приема bis.b #CHAR, &UCTL0; Формат данных 8-разрядный mov.b #SSEL0, &UTCTL0; UCLK=ACLK mov.b #0100b,&UBR00; 5MHz/19200 = 260.4 = 100000100b mov.b #0001b,&UBR10; mov.b #0000, &UMCTL0; Без модуляции bic.b #SWRST,&UCTL0; Сброс USART не включен bis.b #URXIE0+UTXIE0,&IE2 bis.b #UTXIFG0,&IFG2; Флаг гтовности к прерыванию Loop bis.w #LPM3+GIE,SR nop jmp Loop ;------------------------------------------------------------------- USART0TX_ISR; ;------------------------------------------------------------------- mov.b R7, &TXBUF0; reti ;-------------------------------------------------------------------- ; Векторы прерываний ;-------------------------------------------------------------------- COMMON INTVEC ORG RESET_VECTOR DW RESET ORG USART0TX_VECTOR DW USART0TX_ISR END. Из программы видно, что я просто хочу передать содержимое R7 в ПК. Трудность заключается в том, что это значение передается не всегда. Запускаю программу, которая считывает информацию с com порта (программа работает 100% правильно), она в тестовый файл записывает значение 200(правильное значение). В следующий раз, после перезапуска программы, в текстовый файл она записывает величину 14. Потом снова 200. И я не пойму, что с ней происходит! Кто знает, отзовитесь пожалуйста
  7. I am Chinese student, now studying in St. Petersburg. I'm here one year, so i am not very good in Russian,written in English. I would like to know some new friends like programming and design, I want to participate in some professional game in Russia or complete some projects with my friends. If you need, I can help you buy some cheap things in China.If you have spare time or want to learn Chinese, hope you can help me learn the Russian language.This is part of my profile.
  8. Стоит изучать MSP430? Как я понимаю cortex-m он превосходит только энергоэффективностью? Или уже нет?
  9. Доброе утро. Продолжаю осваивать MSP430 и в данный момент столкнулся с проблемой. Не знаю как осуществить получение данных со встроенного температурного датчика. Честно говоря даже не знаю с чего начать. Так что решил спросить у пользователей данного форума, как сделать и с чего начать. С уважением, Владимир.
  10. Я совсем новичок в МК, столкнулся с проблемой при подключении msp430 к bluetooth модулю. Модуль раньше работал на ардуине но с этой платой ни как не заводится. Подключить модуль к планшету получается (в терминале на планшете приходят обратно вводимые символы если замкнуть на модуле RX и TX). Но как дальше его подключить к msp430 я не понял. Пробовал так: P1.1 -> TX, p1.2 -> RX , пробовал менять комбинацию перемычек SW uart \ HW uart. Прошивка: void setup() { Serial.begin(9600); } void loop() { Serial.println("Test"); delay(100); } Возможно ли их вообще подключить?
  11. Требуеться отсылать данные по UART-у с большой точностью, делаю как по примеру. Схема аналогична примеру //****************************************************************************** // MSP430x47xx Demo - USCI_A0, 115200 UART Echo ISR, DCO SMCLK // // Description: Echo a received character, RX ISR used. Normal mode is LPM0. // USCI_A0 RX interrupt triggers TX Echo. // Baud rate divider with 1048576hz = 1048576/115200 = ~9.1 (009h|01h) // ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK = 1048576Hz // //* An external watch crystal between XIN & XOUT is required for ACLK *// // // MSP430x47xx // ----------------- // /|\| XIN|- // | | | 32kHz // --|RST XOUT|- // | | // | P2.4/UCA0TXD|------------> // | | 115200 - 8N1 // | P2.5/UCA0RXD|<------------ // // P. Thanigai / K.Venkat // Texas Instruments Inc. // November 2007 // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A //****************************************************************************** #include "msp430x47x4.h" void main(void) { volatile unsigned int i; WDTCTL = WDTPW+WDTHOLD; // Stop WDT FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? P2SEL |= BIT4+BIT5; // P2.4,5 = USCI_A0 RXD/TXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 0x09; // 1MHz 115200 UCA0BR1 = 0x00; // 1MHz 115200 UCA0MCTL = 0x02; // Modulation UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt _BIS_SR(LPM0_bits + GIE); // Enter LPM0, interrupts enabled } // Echo back RXed character, confirm TX buffer is ready first #pragma vector=USCIAB0RX_VECTOR __interrupt void USCIA0RX_ISR (void) { while(!(IFG2&UCA0TXIFG)); UCA0TXBUF = UCA0RXBUF; // TX -> RXed character } #include "msp430x47x4.h" #include "main.h" extern char Hello_World[] = {"Hello, World!\n\r"}; //Current RSSI as ASCII. void main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT // ================[ Crystal Oscillator ]=============== FLL_CTL0 |= XCAP14PF; // Configure load caps do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0x47FF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? // ===================================================== // ====================[ UART config ]================== //UART1: P4SEL |= BIT0+BIT1; UCA1CTL1 |= UCSSEL_2; UCA1BR0 = 0x09; UCA1BR1 = 0x00; UCA1MCTL = 0x02; UCA1CTL1 &= ~UCSWRST; // UC1IE |= UCA1RXIE; // ===================================================== CCTL0 = CCIE; // CCR0 interrupt enabled TimerChacker = 0; TACCR0 = 62500 - 1; TACTL = TASSEL_2 + ID_3 + MC_1 + TACLR; // SMCLK, up mode _BIS_SR(LPM0_bits + GIE); // Enter LPM3 } // =============== [ Timer actions ] ================== #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) { if (++TimerChacker == 3) { sendToWizFi(Hello_World); TimerChacker = 0; } } // ===================================================== int getLength(unsigned char mess[]){ int j; for (j=0; j<MAX_BUFF; j++){ if ((mess[j] == '\r')) break; } return j; } void sendToUART(unsigned char mess[]){ int maxLen = getLength(mess); for (int j=0; j<=maxLen; j++){ while(!(UC1IFG&UCA1TXIFG)); UCA1TXBUF = mess[j]; } } Что странно, первые пару секунд все без ошибок, а потом начинается этот адок
  12. Работаю с микроконтроллером msp430f4784 и LCD экранчиком SBLCDA4. В микроконтроллере встроен драйвер LCD, поэтому разобраться в его работе было не сложно. Составил табличку, набросал программу. Результат, как всегда, не оправдал ожиданий. Изображение мерцало. Такое чувство, что динамическая индикация происходит очень медленно, Но часовой кварц стоит, и указан номинал конденсаторов на нем. UART же как то работал. Эмпирическим путем было выяснено, что мерцание иногда пропадает если взяться за землю на программаторе. Пробовали питать всю схему от источника питания, без участия программатора, все равно все так же мерцает. Перепаял кварц максимально близко к микроконтроллеру, а так же заземлил его корпус. Это тоже не помогло. Идеи уже кончились.. Прикладываю с программой пару гифок, как все это происходит на деле #include "msp430.h" void main(void) { int i; WDTCTL = WDTPW + WDTHOLD; FLL_CTL0 |= XCAP10PF; LCDACTL = LCDON + LCD4MUX + LCDFREQ_128; LCDAPCTL0 = LCDS0+LCDS4+LCDS8+LCDS12+LCDS16+LCDS20; P5SEL = BIT2+BIT3+BIT4; for( i = 0; i < 11; i ++) { LCDMEM[i] = 0xFF; } _BIS_SR(LPM3_bits); }
  13. Здравствуйте! Вопрос: как сигнал (такты с определенной частотой) с одного порта определенной ножки МК подавать на другую этого же порта?? сама задача заключается в том, что бы по нажатию разных кнопок, с помощью прерываний включать разные "штуки", но это все не важно я это могу сделать)) Мне надо, что бы при лог. 1 на ножке P2.2 сигнал со входа P2.3 поступал на P2.4, наверно, это делается как-то просто, но я не могу понять как. Обьясните как это сделать на C или дайте, что-нибудь где можно прочитать про это
  14. Вчера вот получил долгожданную покупку, поигрался с демкой на установленном МК. Скачал Energia, попробовал ее демки, но теперь надо уже этого мало и хочется сделать что-то свое поэтому надо толково учить мат.часть. Посоветуйте книги по МК без определенного концентрирования автора на какой-то один МК,а чтобы было описано основные параметры любого МК. И посоветуйте литературу именно моему МК. Даташит и некоторые другие файлы с оф. сайта я скачал,но для начало это немного круто, хотелось бы что-то освоить на русском сначала. Заранее спасибо за помощь. С уважением, Владимир.
  15. Пытаюсь приспособить следующий пример и скетч с него для MSP430g2553. Однако, при компилировании при помощи Energia получаю следующую ошибку sketch_oct10a.cpp: In function 'void pulseGSCLK()': sketch_oct10a.cpp:208:3: error: 'PORTB' was not declared in this scope Как я понимаю PORTB не был объявлен как переменная, как это корректно можно сделать? /* TLC5940 16-port LED driver = Paden Hogeland - Adjusted for use of 4 RGB LED's * Peter Mackey June 2007 Pratt Digital Arts pmackey@pratt.edu * direct adressing to PORTB, smooth flickerless fading (thanks to Amp on the Arduino forum) * additional logic from David Cuartielles's & Marcus Hannerstig's LEDdriver demo = see the TLC5940 data sheet for the logic behind these pulse sequences */ // Name the Arduino pins to the TLC5940 pin names #define VPRG 2 #define SIN 5 #define SCLK 6 #define XLAT 7 #define BLANK 8 #define DCPRG 9 #define GSCLK 10 //note: but using PORTB method #define MSINTRVL 0 // could be used to delay updating of incrementFades() #define FADEMIN 0 // lowest fade level LEDs will reach (min would be 0, max 4065) #define FADEINCR 64 // determines how many steps it takes to run the desired range (lower=longer) // Array to hold the port values 0 min - 4095 max int port[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; int faderNdx = 0; //counter used in this fading sequence int fadeState[] = { 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; //stores the direction of fading for each port 1,0,-1 //start with first port int next; //used for limit checking in fading function float prevMillis; //used for a timing delay int myword[] = {0,0,0,0,0,0,0,0,0,0,0,0}; //temp storage for reversing bits in a word (for greyscale setting) // Declare the RGB varables double red,green,blue; // Set up void setup() { // Assign the output pins pinMode(VPRG, OUTPUT); pinMode(SIN, OUTPUT); pinMode(SCLK, OUTPUT); pinMode(XLAT, OUTPUT); pinMode(BLANK, OUTPUT); pinMode(DCPRG, OUTPUT); pinMode(GSCLK, OUTPUT); // Could also set DDRB directly // Initalize Serial Connection Serial.begin(9600); // Initalize unused TLC5940 pins port[13] = 0; port[14] = 0; port[15] = 0; port[0] = 0; preset(); //input �Dot Correction� data } // Main Loop void loop () { setGreys(); feedPorts(); // If have passed the interval if (millis() > (prevMillis+MSINTRVL)){ // Set the RGB values setRGB(); // Set new previous time prevMillis=millis(); } } // Set the RGB values void setRGB() { // If correct amount of serial is avaiable if(Serial.available() >= 13 ){ // If we are at the first chunk of data if(Serial.read() == 0xff){ // Set the Left Side red = Serial.read(); blue = Serial.read(); green = Serial.read(); // Get the percentage of each value then update port accordinly port[10] = (4095)*(red/255); port[11] = (4095)*(blue/255); port[12] = (4095)*(green/255); // Set the Top Left Side red = Serial.read(); blue = Serial.read(); green = Serial.read(); // Get the percentage of each value then update port accordinly port[7] = (4095)*(red/255); port[9] = (4095)*(green/255); port[8] = (4095)*(blue/255); // Set the Top Right Side red = Serial.read(); blue = Serial.read(); green = Serial.read(); // Get the percentage of each value then update port accordinly port[4] = (4095)*(red/255); port[6] = (4095)*(green/255); port[5] = (4095)*(blue/255); // Set the Right Side red = Serial.read(); blue = Serial.read(); green = Serial.read(); // Get the percentage of each value then update port accordinly port[1] = (4095)*(red/255); port[2] = (4095)*(blue/255); port[3] = (4095)*(green/255); } } } //=======5940 control====================================== void setGreys() { // For the each port (12 bit word * 16 ports =192 bits in this loop)... for (int i=15; i>=0; i--) { // Initalize the data int datb = port[i]; // Load fade level bits into the temp array BACKWARDS for (int j=11; j>=0; j--) { myword[j]=(datb & 1); //& bitwise AND datb >>= 1; //shift right and assign // (maybe there's a slicker way to do this!? but this works...) } // Send the data to the 5940 for (int j=0; j<12; j++) { digitalWrite(SIN,myword[j]); pulseSCLK(); } } digitalWrite(XLAT, HIGH); digitalWrite(XLAT, LOW); } void feedPorts() { // The actual sequencing of the PWM data into the LEDs, must do constantly... digitalWrite(BLANK, HIGH); digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle for (int i=0; i<4096; i++) { pulseGSCLK(); } } //DOT CORRECTION...do once void preset() { //Input �DotCorrex� Data //16 outputs, 64 posssible levels of adjustment, 6 bits/chan = 96 bits total //[use if any LEDs in array are physically too bright] digitalWrite(DCPRG, HIGH); //leaving it H is my arbitrary choice (="write to register not EEPROM") digitalWrite(VPRG, HIGH); //=inputting data into dot correx register digitalWrite(BLANK, HIGH); //=all outputs off, when this goes high it resets the greyscale counter digitalWrite(SIN, LOW); //to start dot correction digitalWrite(XLAT, LOW); //begin loading in the dot correx data, most significant bit first... //but here we are not correcting anything, so LSB is going first! for (int i=0; i<16; i++) { //16 ports for (int j=0; j<6; j++) { //6 bits of data for each port digitalWrite(SIN, HIGH); //for now, 111111 for everybody pulseSCLK(); digitalWrite(SIN, LOW); } } //----doing the FIRST GREYSCALE SETTING here becuz of the unique 193rd clock pulse digitalWrite(XLAT, HIGH); //latch the dot data into the dot correx register digitalWrite(XLAT, LOW); digitalWrite(VPRG, LOW); //entering greyscale mode for (int i=0; i<16; i++) { //16 ports int datb = 4095; //using same fade level for all ports this first time for (int j=0; j<12; j++) { //data for each port, all the same value to start digitalWrite(SIN, datb & 01); pulseSCLK(); datb>>=1; } } digitalWrite(XLAT, HIGH); //latch the greyscale data digitalWrite(XLAT, LOW); pulseSCLK(); //193rd clock pulse only need to do the FIRST time after dot correx digitalWrite(BLANK, LOW); //=all outputs ON, start PWM cycle... moved here } //SCLK used in dot correx and greyscale setting void pulseSCLK() { digitalWrite(SCLK, HIGH); digitalWrite(SCLK, LOW); } void pulseGSCLK() { //ultra fast pulse trick, using digitalWrite caused flickering PORTB=0x01; //bring PORTB0 high (pin 8), other ports go low [0x01 does only pin 8, 0x21 also lifts pin 13] //16nanosecs is the min pulse width for the 5940, but no pause seems needed here PORTB=0x20; //keep pin13 high [0x00 would be all low] }
  16. Прощу помощи, т.к. уже весь мозг себе взорвал. Пытаюсь сделать кодовый замок на клавиатуре, состоящей из 3 кнопок. Все примеры в сети только для клавиатур 4х4 или 3х4. Нашёл неплохой пример кода под авр на сайте http://datagor.ru/mi...yjj-zamok..html Хочу попробовать портировать его под msp430, но никак не могу понять функцию опроса клавиатуры. char key_press() // функция опроса клавиатуры { while(1) { while((~PIND & 0b01111000)!=0); // ничего не делать, пока не отпустят кнопку for(i=0;i<3;i++) // перебор столбцов { PORTD=0xff & ~(0x01 << i); for(j=3;j<7;j++) // пребор строк { if((PIND & (0x01 << j))==0) // проверка нажатия на кнопу { delay_ms(100); // пауза для исключения дребезга контактов if(buttons[i][j-3]=='*') // дополнительная проверка для кнопки смены пароля { for(k=0;((PIND & (0x01 << j))==0 && k<100);k++) { delay_ms(50); } if((PIND & (0x01 << j))==0) // если удерживаем кнопку смены пароля больше 5 сек { state=1; // то устанавливаем состояние 1 (смена пароля) return 0; // и выходим из функции, возвращая вместо символа ноль } else return buttons[i][j-3]; // если меньше 5 сек, то возвращаем символ } if((PIND & (0x01 << j))==0) return buttons[i][j-3]; // возвращаем символ } } } } } Буду очень благодарен, если кто-нибудь сможет объяснить как переделать это под мою задачу. Смена пароля в моём случае не требуется.
  17. Есть MSP430 Launchpad и шаговый двигатель (стоял в сканнере) MITSUMI m42sp-4np (5 выводов), едет ULN2003, нужно ли еще что-то чтобы реализовать управление движком? Сначала хочу сделать управление с помощью потенциометра, потом с помощью программы? Что можно почтитать? Еще есть движок с 11 выводами из Cd-Rom, что нужно чтобы управлять им? Спасибо
  18. У меня имеется МК msp430f425 и WiFi модуль SPB-106. Вафлю я пока не трогал, а только припаял проводки синхроимпульса и MISO к MISO; MOSI к MOSI. Так же припаял к CS вафли к I/O порту МК и запилил туда единичку нолик. И наваял такой нехитрый код. #include "msp430.h" #define MAX_BUF 250 void main( void ) { WDTCTL = WDTPW + WDTHOLD; //Выключаю Watch Dog Timer //ACLK = 32768 Гц while(FLL_CTL0 & 3 ); // ======= Инициализация SPI ======= P1SEL = BIT6 + BIT7; P2SEL = BIT1; P2DIR |= BIT2; P1DIR |= BIT4; // CS от Вай фая P1OUT &= ~BIT4; // U0CTL = CHAR+SYNC+MM+SWRST; // 8-bit SPI Master **SWRST** U0TCTL = CKPH+SSEL1+STC; // SMCLK, 3-pin mode +SSEL0 U0BR0 = 0x002; // SPICLK = SMCLK/2 U0BR1 = 0x000; U0MCTL = 0x000; ME1 = USPIE0; // Module enable U0CTL &= ~SWRST; // SPI enable IE1 |= URXIE0; // Receive interrupt enable _EINT(); // Enable interrupts // ================================= unsigned char trn_word[6] = "Hello!"; while (1) { for (int i=0; i<6; i++) { while (!(IFG1 & UTXIFG0)); TXBUF0 = trn_word[i]; } } } В теории должно передаваться Hello, но на осциллографе я наблюдаю вот это: P.S. Извините за качество фото. Я пока так и не научился пользовать .res файликами на компе... Если кто подскажет чем открыть их, буду благодарен
×
×
  • Create New...