MSP430 LaunchPad вопрос по программированию
MSP430 LaunchPad вопрос по программированию
Собственно программирую таймер А на микроконтроллере MSP430F2012.
Хочу создать ШИМ с периодом 100 Гц, при нажатии кнопки шаг увеличивается, в начале шаг 10% и так при каждом нажатии увеличивается.
Собственно все не проблема, кроме одного, запутался, как сделать период 100 Гц? Т.е. хочу видеть на осциллографе период в 100 Гц.
Хочу создать ШИМ с периодом 100 Гц, при нажатии кнопки шаг увеличивается, в начале шаг 10% и так при каждом нажатии увеличивается.
Собственно все не проблема, кроме одного, запутался, как сделать период 100 Гц? Т.е. хочу видеть на осциллографе период в 100 Гц.
- Реклама
- Pavel V.
- Мявтор!
- Сообщения: 384
- Зарегистрирован: Ср май 17, 2006 18:39:01
- Откуда: Москва
- Контактная информация:
Re: MSP430 LaunchPad вопрос по программированию
Допустим, таймер тактируется частотой 1.000.000 Гц, т.е. за 1 секунду он щёлкнет 1.000.000 раз. Чтобы получить 100 Гц (1/100 с), таймер должен прощёлкать до 10.000 (1.000.000\100). Вот и весь расчет 
Re: MSP430 LaunchPad вопрос по программированию
Вам бы руководство почитать. Там используются два регистра сравнения таймера и аппаратный выход TA0 (допустим). Соответственно прерывание от таймера не требуется. Частота какая у вас будет? Мб помогу регистры таймера расписать.
PS Тоже взял се чудо дешёвую штуковину--хочу сделать на ёе основе полноценный программатор MSP-FET430UIF.
PS Тоже взял се чудо дешёвую штуковину--хочу сделать на ёе основе полноценный программатор MSP-FET430UIF.
Re: MSP430 LaunchPad вопрос по программированию
Есть кодPsych писал(а):Вам бы руководство почитать. Там используются два регистра сравнения таймера и аппаратный выход TA0 (допустим). Соответственно прерывание от таймера не требуется. Частота какая у вас будет? Мб помогу регистры таймера расписать.
PS Тоже взял се чудо дешёвую штуковину--хочу сделать на ёе основе полноценный программатор MSP-FET430UIF.
Код: Выделить всё
#include <msp430f2012.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= 0x06; //P1.1 = CCR0, P1.2 = CCR1
P1DIR |= 0x0E;
TACTL = TASSEL_2 + MC_1;
CCTL0 = OUTMOD_3;
CCTL1 = OUTMOD_3;
CCR0 = 11480;
CCR1 = 11280;
_BIS_SR(LPM0_bits + GIE);
for(;;)
{
if (!(0x08 & P1IN))
{
TACTL = MC_0;
CCR1 -= 200;
}
else
CCR1 += 0;
}
}Мне бы принцип понять, а уже сколько будут регистры и тд, тогда пойму.
Т.к. тут подгонять не получается.
Хотел бы чтобы было в Регистре CCR0=1000, CCR1=800 и частота периода 100 Гц.
Re: MSP430 LaunchPad вопрос по программированию
Ну тык вы же его тактируете от DCO. Он по дефолту 1 Мгц, но естественно у него своя погрешность. Можно вывести на ножку МК сигнал SMCLK и посмотреть частоту. Поэтому у вас и в регистрах не 10000.
Можно подогнать CCR0 под 100 гц--он отвечает за частоту. CCR1 отвечает за скважиность...в вашем случае она равна 1,75%.
Можно распаять на плате часовой кварц (что я и сделал) и тактировать таймер от ACLK. С ним у вас частота будет примерно 100,2 гц.
Можно подогнать CCR0 под 100 гц--он отвечает за частоту. CCR1 отвечает за скважиность...в вашем случае она равна 1,75%.
Можно распаять на плате часовой кварц (что я и сделал) и тактировать таймер от ACLK. С ним у вас частота будет примерно 100,2 гц.
- Реклама
Re: MSP430 LaunchPad вопрос по программированию
В итоге что в программном коде изменить? CCR0 уж больно долго подгонять придетсяэPsych писал(а):Ну тык вы же его тактируете от DCO. Он по дефолту 1 Мгц, но естественно у него своя погрешность. Можно вывести на ножку МК сигнал SMCLK и посмотреть частоту. Поэтому у вас и в регистрах не 10000.
Можно подогнать CCR0 под 100 гц--он отвечает за частоту. CCR1 отвечает за скважиность...в вашем случае она равна 1,75%.
Можно распаять на плате часовой кварц (что я и сделал) и тактировать таймер от ACLK. С ним у вас частота будет примерно 100,2 гц.
Сделал 100 Гц) это безумие) 12к надо)
Re: MSP430 LaunchPad вопрос по программированию
Ну вот значит DCO у вас 1.2 Мгц. 1200000/12к=100
Re: MSP430 LaunchPad вопрос по программированию
Спасибо) теперь осталось разобраться с кнопкой, т.к. изменение регистров разрешено только если таймер остановлен.Psych писал(а):Ну вот значит DCO у вас 1.2 Мгц. 1200000/12к=100
Re: MSP430 LaunchPad вопрос по программированию
Необязательно. Можете не останавливать, просто в момент изменения регистров(нажатия кнопки) у вас может произойти один неверный импульс---не думаю что это критично.
Re: MSP430 LaunchPad вопрос по программированию
Ситуация в том, что когда кнопка нажимается не происходит ничего)) Т.е. убавления содержимого регистра не происходит, а просто проседает сигнал на 0,2 В.Psych писал(а):Необязательно. Можете не останавливать, просто в момент изменения регистров(нажатия кнопки) у вас может произойти один неверный импульс---не думаю что это критично.
А по идее при нажатии должно происходить следующее:
Период остается таким же, но импульс становится шире.
Re: MSP430 LaunchPad вопрос по программированию
А дребезг контактов кто устранять будет?
И во- вторых: Вы его остановили, а запускать по новой кто будет?
И во- вторых: Вы его остановили, а запускать по новой кто будет?
Re: MSP430 LaunchPad вопрос по программированию
Конечный код такой на данный момент.Psych писал(а):А дребезг контактов кто устранять будет?
И во- вторых: Вы его остановили, а запускать по новой кто будет?
Код: Выделить всё
#include <msp430f2012.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= 0x06; //P1.1 = CCR0, P1.2 = CCR1
P1DIR |= 0x0E;
TACTL = TASSEL_2 + MC_1;
CCTL0 = OUTMOD_3;
CCTL1 = OUTMOD_3;
CCR0 = 12000;
CCR1 = 11800;
_BIS_SR(LPM0_bits + GIE);
for(;;)
{
if (!(0x08 & P1IN))
{
TACTL = MC_0; //остановка
CCR1 -= 1200; //изменение регистра
TACTL = TASSEL_2 + MC_1; // снова запуск
}
for( unsigned int s = 0; s< 20000; s++); //задержка, чтобы кнопка при нажатом состоянии выполнила изменение 1 раз
}
}
Re: MSP430 LaunchPad вопрос по программированию
А ну дребезг теперь я вижу что устранили. В начале CCR1 сделайте 10800, а не 11800. Да и условие чтоб CCR1 нулём не стал.
Re: MSP430 LaunchPad вопрос по программированию
Psych писал(а):А ну дребезг теперь я вижу что устранили. В начале CCR1 сделайте 10800, а не 11800. Да и условие чтоб CCR1 нулём не стал.
Код: Выделить всё
#include <msp430f2012.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= 0x06; //P1.1 = CCR0, P1.2 = CCR1
P1DIR |= 0x0E;
TACTL = TASSEL_2 + MC_1;
CCTL0 = OUTMOD_3;
CCTL1 = OUTMOD_3;
CCR0 = 12000;
CCR1 = 10800;
_BIS_SR(LPM0_bits + GIE);
for(;;)
{
if (!(0x08 & P1IN ))
{
if (CCR0!= 0)
{
TACTL = MC_0;
CCR1 -= 1200;
TACTL = TASSEL_2 + MC_1;
}
}
for( unsigned int s = 0; s< 20000; s++);
}
}
Re: MSP430 LaunchPad вопрос по программированию
У вас ножка на которой кнопка настроена на выход.
Re: MSP430 LaunchPad вопрос по программированию
Суть в том, что данное условие, что кнопка нажата, работает в моем прошлом программировании. Не думаю, что в этом ошибка..Psych писал(а):У вас ножка на которой кнопка настроена на выход.
Вот пример с чем баловался и где все работало нормально
Код: Выделить всё
#include <msp430g2231.h>
int main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1DIR = 0x41;
P1OUT = 0x00;
unsigned char i=0;
for(;;)
{
if (!(0x08 & P1IN))
{
if (i++ % 2)
P1OUT = 0x01;
else
P1OUT = 0x40;
}
for( unsigned int s = 0; s< 20000; s++);
}
}Re: MSP430 LaunchPad вопрос по программированию
P1REN|=0x08
P1OUT|=0x08
Re: MSP430 LaunchPad вопрос по программированию
Елы палы у вас там как вход настроен.hotkey писал(а):
Вот пример с чем баловался и где все работало нормально
Re: MSP430 LaunchPad вопрос по программированию
Psych писал(а):Может че то путаете? но P1DIR=0x0E не даст использовать P1.3 в качестве входа. Вбейте P1DIR|=0x06
P1REN|=0x08
P1OUT|=0x08
Код: Выделить всё
#include <msp430f2012.h>
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL |= 0x06; //P1.1 = CCR0, P1.2 = CCR1
P1DIR |= 0x06;
P1REN |= 0x08;
P1OUT |= 0x08;
TACTL = TASSEL_2 + MC_1;
CCTL0 = OUTMOD_3;
CCTL1 = OUTMOD_3;
CCR0 = 12100;
CCR1 = 10800;
_BIS_SR(LPM0_bits + GIE);
for(;;)
{
if (!(0x08 & P1IN ))
{
if (CCR0!= 0)
{
TACTL = MC_0;
CCR1 -= 1200;
TACTL = TASSEL_2 + MC_1;
}
}
for( unsigned int s = 0; s< 20000; s++);
}
}А 12100, потому что оказалось немного не докрутил) там был период 101 Гц, вот изменил поэтому
Re: MSP430 LaunchPad вопрос по программированию
Хм.... ну уберите P1REN и P1OUT


