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

 
 
> Мусор в таймере G2553, Скачет значение счетного регистра
thrush007
сообщение Jun 1 2014, 18:38
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 51
Регистрация: 5-05-13
Из: Россия
Пользователь №: 76 733



Процессор MSP430G2553. Отмеряю временные интервалы с помощью таймера в режиме сравнения, использую три регистра сравнения: TA1CCR1 > TA1CCR0 > TA1CCR2.

#include "msp430G2553.h"

// присвоение имен выводам порта 2

#define KNOPKA 0x0004 // P2.2 - вход для принятия команд
#define REZERV 0x0010 // P2.4 - резервный вывод

// присвоение имен выводам порта 3

#define D4 0x0002 // P3.1 - сигнальный вывод дисплея D4 (вывод 8 МК)
#define VIKL 0x0004 // P3.2
#define RS 0x0008 // P3.3 - вывод сброса дисплея (вывод 14 МК)
#define E 0x0010 // P3.4 - вывод разрешения работы дисплея (вывод 15 МК)
#define D5 0x0020 // P3.5 - сигнальный вывод дисплея D5 (вывод 19 МК)
#define D6 0x0040 // P3.6 - сигнальный вывод дисплея D6 (вывод 20 МК)
#define D7 0x0080 // P3.7 - сигнальный вывод дисплея D7 (вывод 21 МК)

int main( void )

{

WDTCTL = WDTPW + WDTHOLD; // Отключение сторожевого таймера

// Тактирование микроконтроллера от встроенного
// генератора с калибровкой на 16 МГц
// основной тактовый сигнал MCLK от DCOCLK

BCSCTL1 = CALBC1_16MHZ; // basic clock system
BCSCTL2 = DIVS0; // тактирование MCLK без предделителя, тактирование SMCLK = 16/2 MHz
DCOCTL = CALDCO_16MHZ; // digital controlled oscillator

P1OUT = 0x00;
P2OUT = 0x00; // не сбрасываются после перезапуска
P3OUT = 0x00;

P1SEL = 0x00; // Все выводы портов 1,2,3 настроить как линии портов
P1SEL2 = 0x00;
P2SEL = 0x00; // ввода-вывода.
P2SEL2 = 0x00;
P3SEL = 0x00;
P3SEL2 = 0x00;

P1DIR = 0xFF; // All P1.x outputs
P1OUT = 0x00; // All P1.x reset
P1REN = 0x00; // отключение внутренних подтягивающих резисторов от всех выводов порта 1

P2DIR = 0xFF; // Все выводы порта 2 настроить как выходы
P2REN = 0x00; // отключение внутренних подтягивающих резисторов от всех выводов порта 2
P2REN = RS + E; // Подключение к выводам управления дисплеем RS и E подтягивающих резисторов

P3DIR = 0xFF; // All P3.x outputs
P3OUT = 0; // All P3.x reset
P3DIR &=~ (KNOPKA); // Вывод KNOPKA настроить как вход
P3REN = VIKL + D4 + D5 + D6 + D7; // Подключение к выводам подтягивающих резисторов

P1IE = 0x00; // Запрещение прерываний для порта 1
P2IE = 0x00; // Запрещение прерываний для порта 2

TA1CCR0 = 0x1B58; // 7000 мкс
TA1CCR1 = 0x36B0; // 14 мс
TA1CCR2 = 0x0DAC;

TA1CCTL0 = CCIE; // CCIE - разрешение прерываний захвата/сравнения
TA1CCTL1 = CCIE;
TA1CCTL2 = CCIE;

TA1CTL = TASSEL_2 + MC_2 + ID_3 + TACLR; // запуск таймера-счетчика 1, счет вверх до переполнения

// TASSEL_2 - тактирование таймера-счетчика от SMCLK (8 МГц)
// ID_3 - коэффициент предделителя для тактового сигнала таймера-счетчика равен 8
// MC_0 - таймер остановлен, MC_1 - вверх до TACCR0
// MC_2 - вверх до переполнения, MC_3 - счет вверх-вниз
// TAIE - разрешение прерывания от таймера - не устанавливаю.
// TACLR - сброс

// шагаю отладчиком (launchpad) и на этой команде значение счетного регистра меняется с 0 на 0x0855.

flag = 0x0000;
P1IFG = 0x00;
P2IFG = 0x00;

P3OUT |= VIKL;

__enable_interrupt(); // общее разрешение прерываний

while (1)
{ x=0x0000;}
}

Далее идут пустые обработчики прерываний от таймера.

Собственно, проблема в глюке счетного регистра TA1R при изменении регистра настроек TA1CTL. Вся проблема в том, что я собирался менять настройки таймера в прерываниях, но даже при первоначальной настройке слетает счетный регистр. Что будет в прерываниях страшно представить. Проверял на нескольких МК, вставленных в launchpad (выпущенных в разное время - 2012 и 2013 году), и на МК, запаянном в плату (TSSOP-28 2012 года). Помогите идеями, пожалуйста, а то свои уже кончились sm.gif
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 15:01
Рейтинг@Mail.ru


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