реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> MSP-EXP430G2 и прерывания от Timer1
Darth_Vader
сообщение Nov 6 2014, 06:54
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 16-06-11
Пользователь №: 65 721



Добрый день!

Разбираюсь с MSP430 Launchpad с установленным G2553.
Подскажите, почему не происходит прерывание по Timer1?

CODE
#include <msp430.h>

/*
* main.c
*/
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
// Инициализация светодиодов
P1DIR = BIT0 + BIT6;
P1OUT = 0;
// Инициализация таймера Timer1
TA1CCR0 = 480; // период таймера
TA1CCR1 = 120; // яркость свечения LED1 (120/480)
TA1CCR2 = 360; // яркоcть свечения LED2 (360/480)
TA1CCTL0 = CCIE; // разрешаем прерывание от регистра TA1CCR0
TA1CCTL1 = CCIE; // разрешаем прерывание от регистра TA1CCR1
TA1CCTL2 = CCIE; // разрешаем прерывание от регистра TA1CCR2
TA1CTL = TASSEL_2 + ID_0 + MC_1; // Источник тактирования SMCLK (1 МГц), /1, считать до TA1CCR0
__enable_interrupt();
while(1);
}


#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1 (void)
{
P1OUT ^=BIT6;
}
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Nov 6 2014, 09:24
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



емнип, ещё общее разрешение IE всего таймера где-то в контролах

Соврал.

У вас, похоже, SMCLK нигде не инициализируется. Во всяком случае, не видно, откуда он 1МГц.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
_pv
сообщение Nov 6 2014, 09:36
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



.
Go to the top of the page
 
+Quote Post
Darth_Vader
сообщение Nov 6 2014, 09:37
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 74
Регистрация: 16-06-11
Пользователь №: 65 721



На сколько я помню, SMCLK по умолчанию 1 МГц.
Я уже разобрался, всё заработало.
Надо было вот так сделать:
CODE
#pragma vector=TIMER1_A0_VECTOR
__interrupt void Timer1_A0 (void)
{
P1OUT = BIT0 + BIT6;
TA1IV = 0;
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
switch(TA1IV){
case TA1IV_TACCR1:
P1OUT &= ~BIT0;
break;
case TA1IV_TACCR2:
P1OUT &= ~BIT6;
break;
default:
break;
}
TA1IV = 0;
}
Go to the top of the page
 
+Quote Post
Jack-S
сообщение Nov 6 2014, 16:42
Сообщение #5





Группа: Участник
Сообщений: 10
Регистрация: 1-11-14
Пользователь №: 83 477



Извиняюсь, посмотрел бегло.
А тот ли вектор прерывания? Там же 2 вектора и в основном мне приходилось работать со вторым.
Если вектор прерывания не обработан процессор пойдет через перезагрузку. Поставьте брекпоинт на начало main и увидите.
Этот МК и многие другие MSP я юзал, могу поделится опытом, только я не часто бываю сдесь.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th June 2025 - 12:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01376 секунд с 7
ELECTRONIX ©2004-2016