cornflyer
Mar 27 2008, 19:21
Надо сгенерить на выходе P1.2 частоту 38000 Гц
Кварц - внешний, 3.6 МГц
код:
// timer_A1
TACTL = 0 ; // stop
P1DIR |= BIT2 ; // output
P1SEL |= BIT2 ; // Bit = 1: Peripheral module function is selected for the pin
TACCR1 = 48 ; //
TACCTL1 = OUTMOD_4; // toggle
TACTL = BIT4 | BIT9 ;
rezident
Mar 27 2008, 20:46
Код
TACTL=TASSEL_2|ID_0|TACLR; //TACLK=SMCLK/1=3.6МГц
TACCR0=94; //период = (unsigned int)(3600000.0f/38000.0f+0.5f)-1
TACCR1=47; //полупериод = период / 2
TACCTL0=0;
TACCTL1=OUTMOD_3; //установка(EQU1)/сброс(EQU0)
P1DIR|=BIT2; //P1.2 выход
P1SEL|=BIT2; //P1.2 выход TA1
TACTL|=MC_1; //режим счета CountUp
Частота на выходе должна получится 37894,7Гц, отклонение от номинальной около -0,3%
Не забудьте правильно проинициализировать источники тактирования, чтобы частота SMCLK была именно от кварцевого генератора 3,6МГц.
cornflyer
Apr 1 2008, 08:35
мне нужно по нажатию кнопки включать/выключать генерацию частоты
как это сделать?
MrYuran
Apr 1 2008, 08:56
Цитата(cornflyer @ Apr 1 2008, 11:35)

мне нужно по нажатию кнопки включать/выключать генерацию частоты
как это сделать?
...
TACCTL1=OUTMOD_0; // STOP, вых=OUTx
...
TACCTL1=OUTMOD_3; // Поехали дальше
Либо по-другому:
TACCR1=0; //Stop, вых=0
...
TACCR1=OldValue; //Продолжаем генерить
Цитата(cornflyer @ Apr 1 2008, 11:35)

мне нужно по нажатию кнопки включать/выключать генерацию частоты
как это сделать?
Вероятно по прерыванию от кнопки включать/выключать таймер
MrYuran
Apr 1 2008, 09:02
Цитата(gotty @ Apr 1 2008, 11:58)

Вероятно по прерыванию от кнопки включать/выключать таймер
Не, некрасиво. Таймер может для полезных целей пригодиться, пусть себе считает.
Опять же, непонятно какое состояние будет на выходе после остановки таймера - 0 или 1
cornflyer
Apr 2 2008, 17:19
сделал включение )))))
выключение почему-то не работает!!!
после включения питания нажимаю кнопку - диод загораеца, т.е. частота начинает генерица
но когда я еще раз нажимаю на кнопочку - диод остаеца гореть!!!!
раньше я имел дело с ШИМ
но все работало!!!
процессор MSP430F2131
макетная плата Olimex
на выходе - быстрый вентиль, который управляет мощным полевиком
на выходе ШИМ подтяжка к земле 50k
компилятор - mspgcc
вот мой код:
#include "io.h"
#include "signal.h"
#define KEYB_TEST_QUAN 1000
unsigned int i = 0 ;
unsigned int j = 0 ;
unsigned char cur = 0 ;
unsigned char last = 0 ;
unsigned int key_cnt = 0 ;
unsigned char KeybState = 0 ;
////////////////////////////////////////////////////////////////////////////////
void sound_on ( void )
{
P1OUT |= BIT7 ;
}
/////////////////////////////////////////////////////
void sound_off ( void )
{
P1OUT &= ~BIT7 ;
}
/////////////////////////////////////////////////////
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
BCSCTL3 |= LFXT1S_2; // 3-16 MHz range
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
//BCSCTL2 |= SELM_3; // MCLK = LFXT1 (safe)
BCSCTL2 |= BIT7 | BIT6 | BIT3 ;
// button
P1REN |= BIT0 ; // pull-up/pull-down option enabled
P1OUT |= BIT0 ; // pull-up selected
P1IES |= BIT0 ; // high to low interrupt
P1IE |= BIT0 ; // enable interrupt
// test pin
P1DIR |= BIT7 ; // output
P1SEL &= ~BIT7 ; // port
P1OUT &= ~BIT7 ;
// GUN
//P1DIR |= BIT2 ; // output
//P1OUT &= ~BIT2 ;
// timer_A1
TACTL = 0 ; // stop
TACCTL0 = 0 ; // toggle
TACCTL1 = OUTMOD_3 ; // toggle
TACCR1 = 47 ;
TACCR0 = 94 ;
TACTL = BIT4 | BIT9 ;
//P1DIR |= BIT2 ;
P1DIR &= ~BIT2 ;
P1SEL |= BIT2 ; // Bit = 1: Peripheral module function is selected for the pin
_EINT () ;
for ( ;; )
{
for ( i = 0 ; i < 0xFFFF ; i ++ )
for ( j = 0 ; j < 0x30 ; j ++ ) ;
//P1OUT ^= BIT2 ;
//P1DIR ^= BIT2 ;
}
return 0 ;
}
/////////////////////////////////////////////////////
interrupt ( PORT1_VECTOR ) Keyboard_Handler_1 ( void )
{
P1IE &= ~BIT0 ;
// debounce
last = P1IN ;
key_cnt = KEYB_TEST_QUAN ;
while ( key_cnt )
{
if ( ( KeybState = P1IN ) == last )
{
-- key_cnt ;
}
else
{
key_cnt = KEYB_TEST_QUAN ;
last = KeybState;
}
}
// check key
if ( ! ( KeybState & BIT0 ) )
{
//P1OUT ^= BIT2 ;
P1DIR ^= BIT2 ;
if ( P1DIR & BIT2 )
{
TACCTL1 = OUTMOD_3 ;
}
else
{
TACCTL1 = OUTMOD_0 ;
P1OUT &= ~BIT2 ;
}
}
P1IE |= BIT0 ;
P1IFG = 0 ;
}
MrYuran
Apr 3 2008, 05:24
Цитата
но когда я еще раз нажимаю на кнопочку - диод остаеца гореть!!!!
А если осцилом ткнуть?
Скорее всего, там 1, а не частота
Цитата
TACCTL1 = OUTMOD_0 ;
P1OUT &= ~BIT2 ;
В денном случае надо опустить бит не в P1OUT, а бит OUT в регистре TACCTL1 (бит2).
Либо может, ещё проще не менять режим вывода, а занулять TACCR1, а для генерации восстанавливать исходное значение.
CAHTA_1939
Apr 4 2008, 16:57
у меня тут задачка, может подскажете как лучьше сделать...
нужно вывести сигнал, амплитуда 200мС, продолжительность импульса 2мкС.
я думаю использовать 1121а.
rezident
Apr 4 2008, 17:59
Лучше (проще) все же оперировать битом OUT в регистре TACCTL1
Включить генерацию
Код
TACCTL1=OUTMOD_3;
выключить
Код
TACCTL1=OUTMOD_0;
или
Код
TACCTL1=OUTMOD_0|OUT;
в зависимости от того лог.0 или лог.1 требуется установить на выходе.
CAHTA_1939
Apr 4 2008, 18:00
у меня тут задачка, может подскажете как лучьше сделать...
нужно вывести сигнал: ПЕРИОД 200мС, продолжительность импульса 2мкС.
я думаю использовать 1121а.
rezident
Apr 4 2008, 18:01
Цитата(CAHTA_1939 @ Apr 4 2008, 22:57)

нужно вывести сигнал, амплитуда 200мС, продолжительность импульса 2мкС.
А что такое "амплитуда 200мС"? "Вывести сигнал" это что: частоту получить или одиночный импульс с заданными параметрами (длительность)?
CAHTA_1939
Apr 4 2008, 18:04
Цитата(rezident @ Apr 4 2008, 21:01)

А что такое "амплитуда 200мС"? "Вывести сигнал" это что: частоту получить или одиночный импульс с заданными параметрами (длительность)?
ошибся. изминить несмог. см. пост выше =)
rezident
Apr 4 2008, 18:23
Ну а в чем проблема-то? ТаймерА тактируется от 1-2-4-8МГц, генерируется одиночный импульс 2мкс, затем считается 3-6-12-24 с копейками переполнений таймера и опять генерируется одиночный импульс. ТаймерА все время работает в режиме Continuous mode.
cornflyer
Apr 5 2008, 10:25
Приведенный ниже код - работает!!!!
При нажатии кнопки генерация частоты ключаеца и выключаеца!
Только я вижу глазом моргание светодиода
Получилась какая-то низкая частота!
См. в конце кода продолжение экспериментов...
#include "io.h"
#include "signal.h"
#define KEYB_TEST_QUAN 1000
unsigned int i = 0 ;
unsigned int j = 0 ;
unsigned char cur = 0 ;
unsigned char last = 0 ;
unsigned int key_cnt = 0 ;
unsigned char KeybState = 0 ;
////////////////////////////////////////////////////////////////////////////////
void sound_on ( void )
{
P1OUT |= BIT7 ;
}
/////////////////////////////////////////////////////
void sound_off ( void )
{
P1OUT &= ~BIT7 ;
}
/////////////////////////////////////////////////////
int main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
BCSCTL3 |= LFXT1S_2; // 3-16 MHz range
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
//BCSCTL2 |= SELM_3; // MCLK = LFXT1 (safe)
BCSCTL2 |= BIT7 | BIT6 | BIT3 ;
// button
P1REN |= BIT0 ; // pull-up/pull-down option enabled
P1OUT |= BIT0 ; // pull-up selected
P1IES |= BIT0 ; // high to low interrupt
P1IE |= BIT0 ; // enable interrupt
// test pin
P1DIR |= BIT7 ; // output
P1SEL &= ~BIT7 ; // port
P1OUT &= ~BIT7 ;
// GUN
//P1DIR |= BIT2 ; // output
//P1OUT &= ~BIT2 ;
// timer_A1
TACTL = 0 ; // stop
TACCTL0 = 0 ; // toggle
TACCTL1 = BIT7 ; // toggle
TACCR1 = 0xFFFF ;
TACCR0 = 0xFFFF ;
TACTL = BIT4 | BIT9 ;
//P1DIR |= BIT2 ;
P1DIR &= ~BIT2 ;
P1SEL |= BIT2 ; // Bit = 1: Peripheral module function is selected for the pin
_EINT () ;
for ( ;; )
{
for ( i = 0 ; i < 0xFFFF ; i ++ )
for ( j = 0 ; j < 0x30 ; j ++ ) ;
//P1OUT ^= BIT2 ;
//P1DIR ^= BIT2 ;
}
return 0 ;
}
/////////////////////////////////////////////////////
interrupt ( PORT1_VECTOR ) Keyboard_Handler_1 ( void )
{
P1IE &= ~BIT0 ;
// debounce
last = P1IN ;
key_cnt = KEYB_TEST_QUAN ;
while ( key_cnt )
{
if ( ( KeybState = P1IN ) == last )
{
-- key_cnt ;
}
else
{
key_cnt = KEYB_TEST_QUAN ;
last = KeybState;
}
}
// check key
if ( ! ( KeybState & BIT0 ) )
{
//P1OUT ^= BIT2 ;
P1DIR ^= BIT2 ;
}
P1IE |= BIT0 ;
P1IFG = 0 ;
}
//////////////////////////////////////////////////////
но если я ставлю TACCR0 = 0x0064 ;
то работать перестает!
делаю так:
TACCTL0 = BIT7 ; // toggle
TACCTL1 = BIT7 ; // toggle
TACCR1 = 0x0032 ;
TACCR0 = 0x0064 ;
включаю питание - светодиод не горит
нажимаю кнопку - включился светодиод
нажимаю кнопку - продолжает гореть....
похоже проц перестает обрабатывать прерывание от кнопки....
cornflyer
Apr 5 2008, 11:54
разобрался...
прерывание кнопки висело на том же порту что и генератор ШИМ
это приводило к зависанию
т.е. после нажатия кнопки включался выход таймера ШИМ
и начинался генереж прерываний порта
что и подвешивало проц
повесил кнопку на порт 2 - проблема исчезла...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.