Easyelectronics.ru

Электроника для всех
Текущее время: 27 фев 2017, 14:23

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 14 фев 2017, 16:42 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Доброго времени суток.
Наткнулся на неочевидный (по-крайней мере, для меня) косяк. По каким-то непонятным причинам внешний кварц на 16 МГц не может раскачаться до нормального уровня, все время возникает на выходе XOUT постоянное смещение в 400 мВ, а амплитуда самого синуса не превышает 100 мВ. Кроме того, возникает артефакт, похожий на сброс контроллера, причем периодический: каждый 2 - 3 мс и без того слабый сигнал резонатора падает до 100 мВ, затем вновь возвращается в исходное положение. Кто бы мог подсказать, в чем может быть проблема? Я в MSP430 совсем немного копаюсь, поэтому спрашиваю совета.
Чтобы телепатов не напрягать, опишу условия: контроллер MSP430F2410, к выводам XIN XOUT подключен кварц HC49U на 16 МГц с нагрузочными конденсаторами 12 пФ (вроде бы маловато, но коллеги ставят на своих платах с тем же камнем - и работает).

Код программы имеет следующий вид:
Show код

Программа написана в CodeBlocks с MSPGCC последней версии.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 14 фев 2017, 18:16 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3239
sdv_cyborg писал(а):
Код:
BCSCTL1 |= XT2OFF|XTS;           //высокочастотный режим
BCSCTL3 |= LFXT1S_2;      //источник - кварц 16 МГц

Зачем использовать Read-Modify-Write? Задай конфигурацию клока явно, тем более что XCAP по дефолту совсем не 0...

delay_simple(0x0FF); это сколько времени? Кварцу для старта надо время, попробуй увеличить задержку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 14 фев 2017, 18:44 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
яверт писал(а):
Зачем использовать Read-Modify-Write? Задай конфигурацию клока явно, тем более что XCAP по дефолту совсем не 0...

delay_simple(0x0FF); это сколько времени? Кварцу для старта надо время, попробуй увеличить задержку.


Действительо, может быть и в XCAP дело... Попробую сейчас сбросить его.
На счет времени - это получается при дефолтной частоте около десятка микросекунд. Конечно, в User's Guide почти такой код (только в асме) и предлагается, но попробую увеличить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 14 фев 2017, 19:00 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Вроде бы отчасти действительно помогло. Прекратились провалы тактирования.
Но все еще кварц находится в состоянии, хм... насыщения, если к нему этот термин применим. Частота стабильная есть, но со смещением примерно в полвольта. Соответственно, программа как будто бы далее не выполняется, или выполняется, но очень медленно, т.к. диод (повешенный к P4.3, который переключается в прерывании) не мигаецца.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 14 фев 2017, 19:09 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3239
Попробуй другой кварц, мк заточенные под низкое потребление довольно привередливые. Можно так же попробовать вывести клок (MCLK или SMCLK) на ногу и посмотреть осциллографом. Смотреть непосредственно на кварце нельзя, у щупа большая ёмкость.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 15 фев 2017, 11:36 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Посмотрел я на ногах MCLK, SMCLK ACLK осциллографом. Действительно, черти что творится: на всех трех ногах - иголки, с частотой около 3 Гц, при том, что настраивал я таким образом, что MCLK тактируется напрямую от кварца - 16 МГц, ACLK - оттуда же, но с делителем на 2 (8 МГц). MCLK вообще не настраивал, так что по дефолту должно было бы быть (если не изменяет память, то около 1 МГц).
Пока не могу понять, с чего бы так. Попробую кварц поменять, поставить с других плат и, может, еще уменьшить нагрузочные емкости.
А пока хотел бы узнать, сталкивался кто-нибудь с таким багом в тактировании?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 15 фев 2017, 13:48 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Похоже, что все-таки разобрался. Дело было в программе, но мне до конца не понятно, в чем именно. Почему-то MCLK и ACLK не желают запускаться от LFXT1 в режиме HF, пока не выставлены биты XTS1...0 вместе с битами LFXT1S1...0 (даром, что при этом XT2 выключен битом XT2OFF и на ногах XT2 вообще ничего не висит).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 15 фев 2017, 16:15 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Хм, недолгой радость была. Как ни странно, но точно та же самая программа, которая работала до обеда, после вновь стала давать те же самые косяки: иголки на выходах MCLK, SMCLK, ACLK, регулярные провалы в тактировании на кварце.
Кстати, что характерно, если присмотреться к сигналам ACLK и MCLK, они выглядят не совсем как иголки - если смотреть на периоде около 50нс, то видно, что на самом деле, эти "иголки" - это пачки прямоугольных импульсов, которые "живут" всего-навсего 500 - 600 нс, после чего сигнал пропадает и остается в течение 2 мс постоянное напряжение около 400 мВ (все тех же, да). Такое поведение очень похоже на reset, но с чего бы ему возникать? Watchdog, как видно из кода, отключен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 16:44 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
В общем, длительное копание показало, что дело отнюдь не в схемотехнике, а именно в программе.
Включил Mspdebug в режиме симулятора, загрузил в него полученный *.elf файл, начал его гонять и... заметил, что после первой сработки прерывания (на данный момент оно одно-единственное - таймер А по сравнению с TACCR0) и выполнения его обработчика случается совершенно внезапный прыжок в адрес 0xffff, на котором система глохнет. Очевидно, что в железе происходит тоже самое, после чего наступает reset и все начинается заново. И как раз-таки этот прыжок может случиться совершенно произвольно: сразу через две команды после reti первого прохода обработчика прерывания, либо через еще сотню-другую тактов... но так или иначе все заканчивается таким вот "вылетом" регистра PC в 0xffff, совершенно внезапным. При этом, если запретить прерывания вообще, то этого не случается, но это совсем не выход, тем более в требуемом приборе.
Я думал, что где-то стек срывает (хотя чем, казалось бы, всего одна глобальная uint16_t переменная), наблюдал за шагами стека и его содержимым, но нигде не замечал ни резкого изменения стека, ни единого случая, когда бы он указывал на ячейку с 0xffff. Сделал ради того, чтобы проверить, NMI прерывание, (т.к. это единственный объект, на который падала тень - по адресу его вектора лежал как раз адрес 0xffff), но как вылет был, так и остался - в обработчик прерывания NMI указатель не попал ни разу.
Кто-нибудь может подсказать, что за глюк такой может быть? Уже голову сломал, сроки идут, а тут запнулся на такой тупой ошибке, которую не могу отловить. Или это нормальное явление для MSPGCC, такие финты устраивать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 17:14 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3239
sdv_cyborg писал(а):
Кто-нибудь может подсказать, что за глюк такой может быть?

Может компилятор оптимизирует пустой обработчик прерывания АЦП? А без обработчика при включенном прерывании камню крышу сносит.


Последний раз редактировалось яверт 16 фев 2017, 17:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 17:32 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
яверт писал(а):
sdv_cyborg писал(а):
Кто-нибудь может подсказать, что за глюк такой может быть?

Может компилятор оптимизирует пустой обработчик прерывания АЦП?

Нет, не оптимизирует, в том и дело.
Вот как выглядит строка в дизассемблере:
Код:
225e:    00 13        reti

Я в симуляторе намеренно поставил брейкпоинт на этот адрес, но на него ни разу не попало. И в вектор прерывания АЦП (адрес 0xffea) - тоже.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 17:45 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Также, если это как-то может помочь - трассировщик mspdebug перед тем, как PC уходит в симуляторе по адресу 0xffff выдает следующее

Код:
2085442: irq handle 8

Что именно это за handle 8 - я ума не приложу, ни в одной доке по MSP430 не упоминаются irq handles, только Interrupt Vector address или Interrupt Number. Единственное, что у прерывания TimerA_0 тоже указывается irq handle, только под номером 9. Но мне это ни о чем не говорит, т.к. даже интуитивно представить трудно, какое это имеет отношение к таблице прерываний из даташита, в которой указаны лишь адреса и приоритеты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 18:00 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3239
TACCTL0 |= CCIE; // это прерывание имеет вектор TIMERA0_VECTOR (0xFFF2)
TACTL |=TASSEL0|ID_1|MC_1|TAIE; // это прерывание имеет вектор TIMERA1_VECTOR (0xFFF0)

Обработчика TIMERA1_VECTOR в коде нет?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 18:06 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
Блин! Точно! Дошло наконец.

Только что проверил. Убрал TAIE - перестал слетать.
Надо ж было так не сообразить, что будут два прерывания одновременно в таком случае...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 18:17 
Старожил

Зарегистрирован: 19 июн 2012, 14:17
Сообщения: 3239
TACCTL0 |= CCIE; это прерывание по совпадению канала 0
TAIE это прерывание по переполнению

Самое смешное, что только у канала 0 свой вектор, все остальные используют один вектор вместе с TAIE.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Косяки с тактированием от внешнего кварца
СообщениеДобавлено: 16 фев 2017, 18:20 
Свой человек

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 149
яверт писал(а):
TACCTL0 |= CCIE; это прерывание по совпадению канала 0
TAIE это прерывание по переполнению

Самое смешное, что только у канала 0 свой вектор, все остальные используют один вектор вместе с TAIE.

А я по невнимательности подумал, что надо оба флага включить, чтобы работал CCIE, т.е. по каналу 0.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB