Перейти к содержанию
    

Мусор в таймере G2553

Процессор 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 года). Помогите идеями, пожалуйста, а то свои уже кончились :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы переключили режим таймера на счёт "вверх до переполнения" установив MC_2. После этого таймер начал считать импульсы от тактового сигнала SMCLK. Регистр TA1R показывает количество импульсов, поступивших на вход таймера после предделителя. Судя по настройке регистров TA1CCTLx, прерывания будут формироваться при равенстве значений TA1R и TA1CCRx.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, так и было задумано. Проблема в том, что при выполнении команды TA1CTL = TASSEL_2 + MC_2 + ID_3 + TACLR значение счетного регистра скачком меняется с 0x0000 на 0x0855 или какое-то другое. Пробовал переносить код в CCS v5.5, CCS v6.0, IAR - везде глюк.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, так и было задумано. Проблема в том, что при выполнении команды TA1CTL = TASSEL_2 + MC_2 + ID_3 + TACLR значение счетного регистра скачком меняется с 0x0000 на 0x0855 или какое-то другое. Пробовал переносить код в CCS v5.5, CCS v6.0, IAR - везде глюк.

Это не глюк. Это фича :) Периферия в MSP430 работает независимо от ядра. Поэтому между двумя шагами в отладчике вы наблюдаете естественное изменение значения счетчика таймера, которому в принципе наплевать на вашу отладку с большой колокольни. Если хотите зафиксировать явное значение 0x0000 в TA1R, то разделите вашу команду на две.

TA1CTL = TASSEL_2 | ID_3 | TACLR;
TA1CTL |= MC_2;

Первой командой устанавливается источник и частота тактирования таймера, а также сбрасывается значение TA1R. Второй командой выбирается режим счета и запускается счет.

Кстати, изменять программно значение непосредственно TA1R при работающем таймере крайне или даже категорически не рекомендуется. Счетчик должен считать непрерывно в установленном режиме. Все манипуляции со считыванием значения TAxR и отсчетом временных интервалов можно делать через регистры сравнения TAxCCRx - они для этого и предназначены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...