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

 
 
> АЦП MSP430F149, Чего я неправильно делаю?
Atridies
сообщение Jun 30 2009, 08:24
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 445
Регистрация: 7-02-05
Из: Зеленоград
Пользователь №: 2 468



Доброго времени суток!

Хочу измерить температуру. Инициализирую АЦП (в момент первоначальной настройки периферии):

ADC12CTL0 = 0x0000+REFON+REF2_5V+MSC+SHT01;
ADC12CTL1 = 0x0000+ADC12SSEL1+ADC12DIV0+SHP+CONSEQ0;

ADC12MCTL0 = 0x10; // SREF=001
ADC12MCTL1 = 0x11; // SREF=001
ADC12MCTL2 = 0x12; // SREF=001
ADC12MCTL3 = 0x13; // SREF=001
ADC12MCTL4 = 0x9B; // SREF=001
ADC12MCTL5 = 0x1A;
ADC12MCTL6 = 0x14; ADC12MCTL7 = 0x95;
ADC12IE = 0x00B0;

Потом запускаю преобразование следующим кодом:

ADC12CTL1 = 0x5000+SHP+ADC12SSEL1+ADC12DIV0;
ADC12CTL0 = 0x0900+REFON+REF2_5V+ADC12ON+ENC;
ADC12CTL0 |= 0x0001;

Прерывание:

#pragma vector=ADC12_VECTOR
__interrupt void ADC(void)
{
if(ADC12IV == 0x000E)
{
// Обработка
}
}

Проблема в том, что у меня при входе в прерывание регистры ADC12IV и ADC12IFG - уже в нулях (хотя до этого они устанавливались).
Работаю пошагово с кристаллом через JTAG: он даже не дает установить вручную ADC12IFG - сразу сбрасывает.
Что я делаю не так? Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Allregia
сообщение Aug 2 2009, 10:12
Сообщение #2


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Теперь я запутался.
Проц 169.
Задача:
а) оцифровать 3 канала по внешнему "пинку"
б) оцифровывать все время 3 канала по таймеру-В.

Инициализирую АЦП:
Код
      
             ADC12CTL0   = 0;
             ADC12CTL1   = SHP  + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1;  // start=SC, s/h=timer, clk from MCLK 1/2 = 4Mhz = 0.2uS, sequence.
           ADC12MCTL0  = SREF_1 + INCH_0;
           ADC12MCTL1  = SREF_1 + INCH_1;
           ADC12MCTL2  = SREF_1 + INCH_2 + EOS;
           ADC12IE   = 0;
           ADC12IFG  = 0;
           ADC12CTL0 = SHT0_1 + REF2_5V + REFON + ADC12ON  + ENC  + MSC;


Тестовый кусок кода:

Код
        
         ADC12CTL0 |= ADC12SC; // start single conversion
         while(1){
             LED_ON;
                 while((ADC12IFG & 0x07)!=0x07);
         LED_OFF;
                 ADC12IFG &=0x07;             // clear IRQ flags
                 DAC12_0DAT= ADC12MEM0; // вывожу оцифрованное для контроля в ЦАПы, жаль третьего нет:
                 DAC12_1DAT= ADC12MEM1;
    
         }


Таймер инициализировал так:
Код
        
              TBCTL   = TBSSEL_2 | TBCLR;   // XT2 Clock input (8Mhz)
              TBCCR0  = 500;                      // 16kHz output
              TBCCTL0 = CCIE;
              TBCTL   |= MC_1;


В таймере даю "пинок":
Код
#pragma vector=TIMERB0_VECTOR
     __interrupt void TIMERB0_interrupt(){
       LED2_TOGGLE;
       ADC12CTL0 |= ADC12SC;
     #endif


Все работает, но если в ините ADC12CTL0 я убираю MSC, то работать перестает. Я не понял, MSC это ведь только время S/H, без него по идее, должно быть просто меньше время общего преобразования?

Теперь вариант Б:
добавляю SHS_2 в АЦП:
Код
ADC12CTL1   = SHP  + ADC12DIV_1 + ADC12SSEL_2 + CONSEQ_1 + SHS_2;

таймер инициализирую так:
Код
        
              TBCTL   = TBSSEL_2 | TBCLR;   // XT2 Clock input (8Mhz)
              TBCCR0  = 500;                      // 16kHz output
              TBCCTL0 = OUTMOD_1;
              TBCTL   |= MC_1;



Получаю естессно фигвам.
Вопрос - чего я забыл еще включить ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 3 2009, 12:03
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Пробегаю по диагонали, потому как в отпуске:
1) ADC12IFG &=0x07; // clear IRQ flags
Сбрасывает все флаги, кроме трех младших. Если я правильно понял, вы хотели наоборот.
2)
Цитата(Allregia @ Aug 2 2009, 13:12) *
Я не понял, MSC это ведь только время S/H, без него по идее, должно быть просто меньше время общего преобразования?
Нет. Это значит, что один "пинок" будет запускать либо каждое преобразование, либо всю серию до ячейки с ENC(преобразование следующего канала начнется сразу после окончания преобразорвания предыдущего).

3) Для постоянной оцифровки трех каналов у вас должна быть инициализация с CONSEQ = 3 (Repeat-sequence-of-channels). В прерывании таймера надо CONSEQ поставить в 1 (Sequence-of-channels), переставить CSTARTADD на группу тех трех каналов, которые вам надо оцифровать по "пинку", для последнегно канала этой группы разрешить прерывание. В прерывании вернуть CONSEQ и CSTARTADD, а также дернуть ADC12SC.
В таком варианте (насколько я понимаю описание) после прерывания таймера АЦП закончит последовательность трех постоянных каналов и перейдет к оцифровке "пинаемых". Если же вам надо начать преобразование "пинаемых" немедленно, то в прерывании таймера надо несколько поколдовать с ENC и CONSEQ (см. раздел Stopping Conversions).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Allregia
сообщение Aug 3 2009, 14:16
Сообщение #4


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

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(Сергей Борщ @ Aug 3 2009, 15:03) *
Пробегаю по диагонали, потому как в отпуске:
1) ADC12IFG &=0x07; // clear IRQ flags
Сбрасывает все флаги, кроме трех младших. Если я правильно понял, вы хотели наоборот.



Да, конечно, я забыл испрвить - у меня там на самом деле стоит ADC12IFG =0;

Цитата
2)
Нет. Это значит, что один "пинок" будет запускать либо каждое преобразование, либо всю серию до ячейки с ENC(преобразование следующего канала начнется сразу после окончания преобразорвания предыдущего).

3) Для постоянной оцифровки трех каналов у вас должна быть инициализация с CONSEQ = 3 (Repeat-sequence-of-channels). В прерывании таймера надо CONSEQ поставить в 1 (Sequence-of-channels), переставить CSTARTADD на группу тех трех каналов, которые вам надо оцифровать по "пинку", для последнегно канала этой группы разрешить прерывание. В прерывании вернуть CONSEQ и CSTARTADD, а также дернуть ADC12SC.
В таком варианте (насколько я понимаю описание) после прерывания таймера АЦП закончит последовательность трех постоянных каналов и перейдет к оцифровке "пинаемых". Если же вам надо начать преобразование "пинаемых" немедленно, то в прерывании таймера надо несколько поколдовать с ENC и CONSEQ (см. раздел Stopping Conversions).


Я наверное не очень обьяснил, "пинок" - это было чисто для проверки, а мне надо постоянно оцифровывать только 3 канала 0-1-2, но запуск осуществлять по таймеру В (чтобы не получиь джиттер).

Так что, CONSEQ = 3 (Repeat-sequence-of-channels) не нужно совершено - оно запусукает непрерывный процесс без участия таймера, поэтому я и ставлю CONSEQ_1 - однократныую оцифровку последовательности каналов. Вот если я эту оцифровку запускаю в прерывании таймера, сигналом ADC12SC - все работает.
Далее я могу использовать прерывание от последнего канала, или просто читать ADC12MEMx из программы.

Но(!), я думал что есть возможность запускать преобразование без прерывания таймера а аппаратно (не хочется терять время на обработчик таймерного прерывания), и вот это-то у меня пока и не получилось.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Atridies   АЦП MSP430F149   Jun 30 2009, 08:24
- - jorikdima   в качестве совета. В IDE обычно всегда есть хедеры...   Jun 30 2009, 08:36
- - MrYuran   А без разных лазаний по регистрам житагами работае...   Jun 30 2009, 08:52
- - Atridies   Елы-палы. Взял запустил процессор вообще без JTAG ...   Jun 30 2009, 09:35
- - jorikdima   АЦП работает и с джитагом   Jun 30 2009, 11:04
|- - MrYuran   Цитата(jorikdima @ Jun 30 2009, 15:04) АЦ...   Jun 30 2009, 11:18
|- - Сергей Борщ   Цитата(MrYuran @ Jun 30 2009, 14:18) АЦП-...   Jun 30 2009, 11:32
|- - Atridies   Цитата(Сергей Борщ @ Jun 30 2009, 15:32) ...   Jul 1 2009, 17:32
- - rezident   Цитата(Allregia @ Aug 3 2009, 20:16) Я на...   Aug 3 2009, 14:39
- - Allregia   Цитата(rezident @ Aug 3 2009, 17:39) Оста...   Aug 3 2009, 15:10
- - rezident   Цитата(Allregia @ Aug 3 2009, 21:10) Попр...   Aug 3 2009, 15:54
- - Allregia   Цитата(rezident @ Aug 3 2009, 18:54) Т.е....   Aug 4 2009, 07:40
- - rezident   Цитата(Allregia @ Aug 4 2009, 13:40) Выбо...   Aug 4 2009, 10:03
- - Allregia   Цитата(rezident @ Aug 4 2009, 13:03) А ва...   Aug 4 2009, 12:03
- - rezident   Цитата(Allregia @ Aug 4 2009, 18:03) В см...   Aug 4 2009, 14:04
- - Allregia   Цитата(rezident @ Aug 4 2009, 17:04) Не ...   Aug 4 2009, 20:26


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

 


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


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