Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Исходники программ и библиотек
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
HARMHARM
По аналогии с форумом AVR предлагаю выкладывать свои библиотеки для работы с периферией. Для начала выкладываю свою библиотеку для работы с I2C. Это софтверный I2C с возможностью использования с несколькими устройствами. Честно говоря, первое что я сам написал на С, да и то основанная на аналогичной библиотеке из AVRLIB, но сильно переработанная.
Буду благодарен за дополнения, исправления и просто слова smile.gif
Artem-1.6E-19
Цитата(HARMHARM @ Dec 28 2006, 04:03) *
По аналогии с форумом AVR предлагаю выкладывать свои библиотеки для работы с периферией.


Лучше сюда http://sourceforge.net/
HARMHARM
Лучше сюда http://sourceforge.net/
[/quote]
Безусловно, SourceForge хорошее место. Но там имеет смысл заводить проект когда наберется достаточное количество кода чтобы собрать достойную библиотеку. А пока этого нет - мертворожденные проекты плодить не хочу.
VAI
Я пару раз где-то здесь выкладывал исходники для работы с усарт...
Lucky:)
Цитата(HARMHARM @ Dec 28 2006, 05:03) *
По аналогии с форумом AVR предлагаю выкладывать свои библиотеки для работы с периферией. Для начала выкладываю свою библиотеку для работы с I2C. Это софтверный I2C с возможностью использования с несколькими устройствами. Честно говоря, первое что я сам написал на С, да и то основанная на аналогичной библиотеке из AVRLIB, но сильно переработанная.
Буду благодарен за дополнения, исправления и просто слова smile.gif


Думаю дело правильное. И лучше гдето в этом форуме выкладывать. Это будет даже как хорошее дополнение к FAQ.
IgorKossak
Зафиксировал тему вверху.
Надеюсь получит развитие.
AlHakim
Недавно создавал тему про работу с Uart-ом, Вот мои исходники для MSP430F149.
A R T
Доброго времени суток ВСЕМЪ!!!

Посчастливилось поработать с индикатором WH2004L. В прикрепленном файле протокол обмена по 4-х разрядной шине.

С уважением, ART.
Oleg Galizin
Библиотека 32 разрядной плавающей точки MSP430 для gcc без аппаратного умножителя.
Для работы нужно слинковаться с библиотекой.
Добавляет чуть больше 1к кода но это гораздо меньше чем стандартная библиотека gcc.
Переработанный пакет FPP из состава iar.
Внутри считается как и в оригинале. Перед и после работы каждая функция выполняет
преобразование к iee754.
Определены 2 набора функций - один описан в fpp.h.
Второй совпадает с набором названий gcc.

Нет проверки на ошибки.Нажмите для просмотра прикрепленного файла
bloodden
Цитата(urasinov @ Mar 24 2007, 21:47) *
есть ли у кого-нибудь библиотека delay.h как для AVR в CodeVision.


Код
#define CPU_CLK_Hz 1000000

#ifndef DELAY_H
#define DELAY_H

#define CPU_CLK_kHz (unsigned long)(CPU_CLK_Hz/1000)
#define delay_ns(x) __delay_cycles(x*CPU_CLK_kHz*0.000001)
#define delay_us(x) __delay_cycles(x*(CPU_CLK_Hz/1000000))
#define delay_ms(x) __delay_cycles(x*(CPU_CLK_Hz/1000))
#define delay_s(x) __delay_cycles(x*CPU_CLK_Hz)

#endif

В ИАРе работает. ВачДог НЕ сбрасывает.
#define CPU_CLK_Hz 1000000 - задаём тактовую в герцах
Код не мой. Где-то нашёл, правда не помню где. smile.gif
zltigo
Цитата(bloodden @ Feb 4 2008, 16:56) *
Код не мой. Где-то нашёл, правда не помню где. smile.gif

Ну так и не надо бросать сюда всякий мусор sad.gif
1. Ничего умного нет - все уже сделал IAR
2. Даже макросы нормально написать не смогли sad.gif
2.1 что будет с вызовом, например, delay_ms( 2+2 )?
2.2 А округление Автора в школе не учили правильно делать?
2.3 А то что арифметика препроцессора 16bit-овая обычно и без 'L' все очень забавно будет?
3. А причем тут MSP430?

Код
#define CPU_CLK_Hz 12345678UL
#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+500UL)/1000UL))
bloodden
Цитата(zltigo @ Feb 4 2008, 19:44) *
Ну так и не надо бросать сюда всякий мусор sad.gif
1. Ничего умного нет - все уже сделал IAR
2. Даже макросы нормально написать не смогли sad.gif
2.1 что будет с вызовом, например, delay_ms( 2+2 )?
2.2 А округление Автора в школе не учили правильно делать?
2.3 А то что арифметика препроцессора 16bit-овая обычно и без 'L' все очень забавно будет?
3. А причем тут MSP430?

Код
#define CPU_CLK_Hz 12345678UL
#define delay_ms(x) __delay_cycles( (x)*(((CPU_CLK_Hz)+500UL)/1000UL))

Человек попросил - я ответил. Я сомневаюсь, что это будут использовать в конечной прошивке. Применительно к МСП430 - тут спросили тут и ответили.
MrYuran
Вот, на днях состряпал.
модуль для вычисления и калибровки температуры с платиновых датчиков HEL-700 (701,702)
Пытался сделать универсальный модуль с прицелом на дальнейшую упаковку в либу.
Нажмите для просмотра прикрепленного файла
Кстати, опять же, к МСП никак не привязано, абсолютно абстрактный модуль.
Просто я на МСП работаю.. rolleyes.gif
hash20
Библиотека для работы с DS1302 ( без процедур чтения-записи встроенной в ней памяти, ибо нах надо....)
P.S. где-то у китайцев нашел, доработал, и портировал под MSP.
Евгенич
Внесу свою толику библиотек:
Работа с датчиком ds18b20
Подключение дисплея типа HD44780
Библиотека и часы реального времени на DS1394+

Вот ещё:
Библиотека для подключения индикаторов на tm1638 - драйвере светодиодных индикаторов

Исходники библиотек - на sourceforge, по ссылкам - архивы проектов на CCS 5.3 и Code::Blocks
BaN
Генерация псеводослучайных чисел, в качестве зерна используется сильная зависимость частоты генератора VLO от внешних воздействий. Запускается 2 таймера: первый отсчитывает N периодов VLO, второй инкрементирует на максимальной частоте (256МГц) регистр счета. После отсчета N тиков VLO в регистре счета будет случайное значение (диапазон изменения этого числа зависит от количества N тиков VLO), которое потом используется в качестве зерна в стандартной функции stdlib rand().
CODE
#include <stdlib.h>
#include "intrinsics.h"
#include "io430f5172.h"

void SetVcoreUp (unsigned int level)
{
// Open PMM registers for write
PMMCTL0_H = PMMPW_H;
// Set SVS/SVM high side new level
SVSMHCTL = SVSHE + SVSHRVL0 * level + SVMHE + SVSMHRRL0 * level;
// Set SVM low side to new level
SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 * level;
// Wait till SVM is settled
while ((PMMIFG & SVSMLDLYIFG) == 0);
// Clear already set flags
PMMIFG &= ~(SVMLVLRIFG + SVMLIFG);
// Set VCore to new level
PMMCTL0_L = PMMCOREV0 * level;
// Wait till new level reached
if ((PMMIFG & SVMLIFG))
while ((PMMIFG & SVMLVLRIFG) == 0);
// Set SVS/SVM low side to new level
SVSMLCTL = SVSLE + SVSLRVL0 * level + SVMLE + SVSMLRRL0 * level;
// Lock PMM registers for write access
PMMCTL0_H = 0x00;
}

void MC_Init(void)
{
__bic_SR_register(GIE);

// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;

// Настраиваем рабочую частоту для генерирации зерна для гнератора псевдослучайных чисел.
// Генерировать будем путем подсчета числа тактов Hi-res таймера,
// работающего на частоте 256МГц от LFCLK кварца, за N периодов VCO генератора.
// Для этого нам нужно настроить тактовую частоту на 16МГц и потом воспользоваться умножителем Hi-res таймера TimerD.

// Increase Vcore setting to level2 to support fsystem=16MHz
// NOTE: Change core voltage one level at a time..
SetVcoreUp(0x01);
SetVcoreUp(0x02);

UCSCTL8 &= ~(ACLKREQEN | MCLKREQEN | SMCLKREQEN); // Если не сбросить эти биты, то (ACLKREQEN | MCLKREQEN | SMCLKREQEN)
// ACLK, SMCLK, MCLK могут останться активными в LPM3
// Настройка системы тактирования
PJSEL |= BIT4+BIT5; // Port select XT1

UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_1;
UCSCTL3 = 0; // FLL Reference Clock = XT1

// Loop until XT1 fault flag is cleared
do
{
UCSCTL7 &= ~XT1LFOFFG; // Clear XT1 fault flags
}while (UCSCTL7&XT1LFOFFG); // Test XT1 fault flag

// Initialize DCO to 16MHz
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_6; // Select DCO range 20MHz-40MHz operation
UCSCTL2 = FLLD_1 + 487; // Set DCO Multiplier for 16MHz
// (N + 1) * FLLRef = Fdco
// (487 + 1) * 32768 = 16MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // Enable the FLL control loop

// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 25 MHz / 32,768 Hz = 500000 = MCLK cycles for DCO to settle
__delay_cycles(500000);

// Loop until XT1 & DCO fault flag is cleared
do
{
UCSCTL7 &= ~(XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag

UCSCTL6 &= ~(XT1DRIVE_3); // Xtal is now stable, reduce drive strength

// Генерируем зерна для гнератора псевдослучайных чисел
UCSCTL4 &= ~(SELA2|SELA1|SELA0);
UCSCTL4 |= SELA__VLOCLK;

TD0R = 0;
TD1R = 0;
// Настраиваем счетчик SMCLK (DCO) with Hi-res mode it's 256MHz
// Configure TimerD in Hi-Res Regulated Mode
TD1CTL0 = TDSSEL_2; // TDCLK=SMCLK=16MHz=Hi-Res input clk select

TD1CTL1 |= TDCLKM_1; // Select Hi-res local clock
TD1HCTL0 = TDHM_1 + TDHCALEN + TDHEN; // Hi-res clock 16x TDCLK,
// Calibration and Hi-res mode enable
TD1CTL0 = TDSSEL_2 + CNTL_0 + MC_2 + ID_0; // SMCLK, Continous up, input divider /1

while((TD1HINT & TDHLKIFG) == 0); // Wait for Hi-res freq lock
TD1HINT |= TDHLKIFG; // Clear lock flag

// Настраиваем счетчик ACLK (VLO)
TD0CCR0 = 9; // Считаем 10 тиков VLO. При 1000 тиков в TD1R будет полностью случайное значение (все 16 бит).
//При 10/100 тиках значение будет изменяться в меньшем диапазоне бит.
TD0CTL0 = TDSSEL_1 + CNTL_0 + MC_2 + ID_0; // ACLK, count to TDCL0, input divider /1
//TD1CTL0 |= TDCLR; // Don't clear TD1 timer - it'll add additional random because of variable freq lock time
// Ожидаем, когда счетчик отсчитает заданное число тиков VLO
while((TD0CCTL0 & CCIFG) == 0);
srand(TD1R); // Устанавливаем зерно для генератора псевдослучайных чисел
TD1CTL0 = 0;
TD0CTL0 = 0;
TD0HCTL0 = 0;

UCSCTL4 &= ~(SELA2|SELA1|SELA0);
UCSCTL4 |= SELA__XT1CLK;

// Генерация зерна для генератора псевдослучайных чисел закончена, теперь можно настраивать рабочую частоту на необходимую

SetVcoreUp(0x00);

// Initialize DCO to 2.45MHz
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL0 = 0x0000; // Set lowest possible DCOx, MODx
UCSCTL1 = DCORSEL_3; // Set RSELx for DCO = 2.45 MHz
UCSCTL2 = FLLD_1 + 74; // Set DCO Multiplier for 2.45MHz
// (N + 1) * FLLRef = Fdco
// (74 + 1) * 32768 = 2.45MHz
// Set FLL Div = fDCOCLK/2
__bic_SR_register(SCG0); // re-enable the FLL control loop

// Worst-case settling time for the DCO when the DCO range bits have been
// changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
// UG for optimization.
// 32 x 32 x 2.45 MHz / 32,768 Hz = 76563 = MCLK cycles for DCO to settle
__delay_cycles(76563);

// Loop until DCO fault flag is cleared
do
{
UCSCTL7 &= ~(DCOFFG);
// Clear XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
}


void main( void )
{
int random_num;
MC_Init();
random_num = rand();
/*
// Измерение времени генерации случайного числа при помощи rand()
// При SMCLK = 2.45MHz время равно (78 * 1/2.45MHz) = 32мкс
TD0R = 0;
TD0CTL0 = TDSSEL_2 + CNTL_0 + MC_2 + ID_0 + TDCLR; // SMCLK, Continous up, input divider /1, clear TDR
rand_num = rand();
TD0CTL0 = 0;
rand_time = TD0R;
*/
while(1);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.