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

 
 
> Подружить ADC12 и TimerB
Salazar
сообщение Jul 11 2007, 08:09
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 30-06-07
Пользователь №: 28 801



Здравствуйте. Я пишу программу, которая должна периодически просыпаться и передавать по UART значения с ADC с метками времени от TimerB.

По отдельности всё работает, но как только всё собирается воедино...
Сразу после включения ADC12 у меня перестаёт прерываться таймерБ.
Как быть?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VAI
сообщение Jul 12 2007, 09:45
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Вот так я вызываю Преобразования с определенным периодом по таймеру.
Если нужна еще и передача оцифрованых значений по UART, то можно еще и это добавить, важно, чтоб успело передаться до следующего вызова.
Код
// --- Определения ---------------------------------------------------------------------------------------- **
#define Start_conversion()        { ADC12CTL0 |= ADC12SC; }
#define Enable_conversions()      { ADC12CTL0 |= ENC; }
#define Disable_conversions()     { ADC12CTL0 &= ~ENC; }
#define ADC_SUM                   4     // сколько преобразований суммируем и принимаем за 1 отсчет
#define ADC_MAX                   ( 4095 * ADC_SUM )
#define ADC_NORMA                 ( 3500 * ADC_SUM )


/* --- adc_ini() ------------------------------------------------------------------------------------------ **
*  Инициализация каналов АЦП
* -------------------------------------------------------------------------------------------------------- */
static void adc_ini( void )
{
  P6SEL = BINARY( 11111111 );                                     // весь порт используется, как входы АЦП
  P6DIR = BINARY( 00000000 );

  ADC12CTL0 = ADC12ON                                             // АЦП включено
            | SHT0_2                                              // время установленияния для ADC12MEM0…ADC12MEM7, tsample >= 2 us, сделаем 16/4us
            | SHT1_3                                              // время установленияния для ADC12MEM8…ADC12MEM15 сделаем 32/4us (tsample > 5us)
            | MSC                                                 // обрабатываем последовательность каналов
            | REFON + REF2_5V                                     // опорное напряжение 2.5В включено
          ;

  ADC12CTL1 = CSTARTADD_0                                         // данные будем помещать начиная с ADC12MEM0
            | SHP                                                 // Сигнал SAMPCON берется с таймера защёлки. Передний фронт сигнала Sample-input запускает таймер.
            | ADC12SSEL_2                                         // тактовая частота для ядра АЦП (ADC12CLK) - MCLK
            | ADC12DIV_1                                          // деленая на 2 - итого 4 МГц, время преобразования (13 * 1/4 + tsample)us
            | CONSEQ_1                                            // один цикл измерения последовательности каналов
          ;

// При перестановке каналов при инициализации АЦП не забыть переставить enum variable_resistor
  ADC12MCTL0 = INCH_2  + SREF_1;                                  // канал = A2,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL1 = INCH_0  + SREF_1;                                  // канал = A0,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL2 = INCH_3  + SREF_1;                                  // канал = A3,              Vr+=Vref+, Vr-=AVSS
  ADC12MCTL3 = INCH_1  + SREF_1;                                  // канал = A1,              Vr+=Vref+, Vr-=AVSS

  ADC12MCTL4 = INCH_4  + SREF_1;                                  // канал = A4,               Vr+=Vref+, Vr-=AVSS
  ADC12MCTL5 = INCH_6  + SREF_1;                                  // канал = A6,              Vr+=Vref+, Vr-=AVSS
  ADC12MCTL6 = INCH_5  + SREF_1;                                  // канал = A5,              Vr+=Vref+, Vr-=AVSS
  ADC12MCTL7 = INCH_7  + SREF_1 + EOS;                        // канал = A7, Vr+=Vref+, Vr-=AVSS + EOS

// -----------------------------------------------------------------------------------------------------------------
  ADC12IE = 1 << ( adc_cnt - 1 );                                 // Enable ADC12IFG.x - разрешим прерывание от последнего оцифровываемого канала
  Enable_conversions();
}

/* --- Timer_A_isr() -------------------------------------------------------------------------------------- **
*
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A_isr( void )
{

  tick_ms++;
  Start_conversion();
......
......
}

/* --- ADC12_isr() ---------------------------------------------------------------------------------------- **
*  Конец преобразования АЦП, вызывается по таймеру А с частотой 1000 Гц
* Накапливаем сигнал за ADC_SUM преобразований
* -------------------------------------------------------------------------------------------------------- */
#pragma vector=ADC_VECTOR
__interrupt void ADC12_isr( void )
{
unsigned short *adc_mem_ptr;
static int a_cnt;
int a;

  adc_mem_ptr = (unsigned short *)&ADC12MEM0;
  for ( a = 0; a < adc_cnt; a++ )                                 // остальные из ADC_SUM
    x_adc_t[a] += *adc_mem_ptr++;                                 // сохраним результаты АЦП во временный массив
  if ( ++a_cnt < ADC_SUM )
    return;
// Сюда попадает с частотой ( 1000 / ADC_SUM ) = 250 Гц
  for ( a_cnt = a = 0; a < adc_cnt; a++ )                         // сумма ADC_SUM отсчетов готова, перенесем "куда нада"
  { x_adc[a] = x_adc_t[a];
    x_adc_t[a] = 0;
  }
// Дальше не критично ко времени, лишь бы до следующего прерывания выполнилось, поэтому разрешим прерывания
  __enable_interrupt();
  if ( flag.channel_REF == OFF )                                  // Опорнай канал игнорируется
    x_adc[X_REF] = ADC_NORMA;
  ADC12_isr_add();  // Дальнейшая обработка, должна успеть закончится до следующего вызова
}


первый пробел съедается при форматировании....


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Salazar   Подружить ADC12 и TimerB   Jul 11 2007, 08:09
- - VAI   ЦитатаКак быть? Понять, что здесь не общество теле...   Jul 11 2007, 09:06
- - jorikdima   меня тоже это все очень интересует Как раз сейча...   Jul 11 2007, 10:21
- - Salazar   Вот так я инициализирую АЦП: Код... ADC12CTL0 = SH...   Jul 12 2007, 06:29
|- - jorikdima   Цитата(Salazar @ Jul 12 2007, 10:29) Вот ...   Jul 12 2007, 06:46
- - Salazar   Например: (ACLK = 32768) TimerB срабатывает 100 ...   Jul 12 2007, 07:35
- - jorikdima   Если через ADC12SC то периода нету как такового - ...   Jul 12 2007, 09:07
- - Salazar   Всем спасибо. То что я хотел решилось стартом прер...   Jul 13 2007, 20:28
- - aag   2 Salazar: Напишите, плиз, итоговый код прерывани...   Jul 17 2007, 09:44
- - VAI   2 aag А чем мой код не нравится?   Jul 17 2007, 09:54
- - aag   Ваш код нравится. только я не все в нем понимаю: ...   Jul 17 2007, 11:47
|- - jorikdima   Цитата(aag @ Jul 17 2007, 15:47) Ваш код ...   Jul 17 2007, 11:49
- - aag   В принципе, да. У мне как раз и хотелось по тайме...   Jul 17 2007, 12:15
- - jorikdima   ADC12_isr_add() его "личная" функция и с...   Jul 17 2007, 12:44
- - aag   считывание значения заменил такой строкой: Кодadc_...   Jul 18 2007, 03:23
|- - jorikdima   Цитата(aag @ Jul 18 2007, 07:23) считыван...   Jul 18 2007, 05:29
- - aag   Цитата2. Читайте в самом верху на регистры ADC12CT...   Jul 18 2007, 06:21
- - jorikdima   Цитата(aag @ Jul 18 2007, 10:21) теперь п...   Jul 18 2007, 07:10


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 13:51
Рейтинг@Mail.ru


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