Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM4S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
zltigo
QUOTE (Грендайзер @ Aug 7 2015, 16:39) *
Частота работы ядра - 100 МГц, частота работы ЦАП - 50 МГц, прерывание возникает не ратьше чем в 25 циклов ЦАП. Ядро какбэ успеет ещё до Камчатки пешком дойти, пока процесс чухнётся.

Написаное Вами Выше ни о чем, кроме каши в голове не свидетельствует, что было ясно и раньше sad.gif. Абсолютное непонимание того, что сотворили. Читайте по буквам еще раз - "два асинхронных процесса что-то делают с одной переменной".
QUOTE
Такая программа и без for(;;) нормально работает.

Писать ГРАМОТНО нужно даже если "работает".
scifi
Цитата(Грендайзер @ Aug 7 2015, 16:47) *
Нет, не забыл! Volatile куда тока не писал....

Ну тогда не знаю, вы что-то недоговариваете. Ну и zltigo прав, конечно: не каждый раз оно сможет занулить эту переменную, даже если цикл успевает крутиться между прерываниями. Может, это вас и подкосило.
zltigo
QUOTE (Грендайзер @ Aug 7 2015, 16:47) *
Нет, не забыл! Volatile куда тока не писал....

Можете еще и в бубен постучать, свечку поставить. Только все работает у Вас правильно, в том смысле, как НАПИСАЛИ, так и "работает".

scifi
Кстати, а что надо-то? А то пока что и пила, которая не пила, и зануление, которое не зануляется (исключительно из-за каши в голове). Что на выходе получиться должно-то?
Грендайзер
Цитата
Что на выходе получиться должно-то?

Должно получится обнуление переменной n в цикле "while(1)" функции main.
Цитата
как НАПИСАЛИ, так и "работает".

Так подскажите, как написать, что б без бубна и свечек...
scifi
Цитата(Грендайзер @ Aug 7 2015, 17:11) *
Так подскажите, как написать, что б без бубна и свечек...

Легко. Запретить прерывания на время проверки и обнуления переменной.
Только зачем всё это? Что мешает обнулять в обработчике прерывания?
Грендайзер
Цитата
Легко. Запретить прерывания на время проверки и обнуления переменной.

Честно говоря звучит... странновато... но попробую! К сожалению плата на работе, так что придётся до пн. потерпеть.
Цитата
Только зачем всё это? Что мешает обнулять в обработчике прерывания?

Проблема в том, что у меня почему то не передаются даннные из main в подпрограмму прерывания. Обнулить n кончно можно и в обработчике, но вот если мне надо какой нить хитрый фильтр посчитать... Эдак я пока из обработчика выйду столько событий могу напропускать... Да и насколько я понимаю, прерывания не для того, что б в них что то считать, они лишь нужны для общения с переферией.
Цитата
не каждый раз оно сможет занулить эту переменную, даже если цикл успевает крутиться между прерываниями. Может, это вас и подкосило

Не вижу корелляции если честно... На том всё и основано...
scifi
Цитата(Грендайзер @ Aug 7 2015, 17:20) *
Проблема в том, что у меня почему то не передаются даннные из main в подпрограмму прерывания.

Всё передаётся. Просто передаётся оно не так, как вам кажется, а так, как написано в исходнике. То есть проблема в том, что ваше видение программы и её поведение в соответствии с исходником отличаются. Надо что-то подправить в консерватории laughing.gif

Цитата(Грендайзер @ Aug 7 2015, 17:20) *
Да и насколько я понимаю, прерывания не для того, что б в них что то считать, они лишь нужны для общения с переферией.

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

Цитата(Грендайзер @ Aug 7 2015, 17:20) *
Обнулить n кончно можно и в обработчике, но вот если мне надо какой нить хитрый фильтр посчитать... Эдак я пока из обработчика выйду столько событий могу напропускать...

Насколько я могу судить, затягивание обработки прерывания АЦП может привести к отложенной обработке прерывания ЦАР. А это, в свою очередь, может привести к чрезмерному джиттеру на выходе ЦАП (а может и не привести). Есть простое решение: дать прерыванию ЦАП более высокий приоритет.
Грендайзер
Имею некоторый негативный опыт запихивания изрядно куска кода в обработчик и с тех пор как то рефлектора стараюсь этого избегать, даже если надо обнулить переменную laughing.gif
scifi
Цитата(Грендайзер @ Aug 7 2015, 20:18) *
Имею некоторый негативный опыт запихивания изрядно куска кода в обработчик и с тех пор как то рефлектора стараюсь этого избегать, даже если надо обнулить переменную laughing.gif

Ну, лишний раз интимные подробности лучше не разглашать. Типа, в красных панталонах успех у женской части публики не поимел, с тех пор красное в одежде избегаю laughing.gif
Дьявол в деталях. Вообще-то надо понимать, как система работает. Иногда приходится понимать до последнего бита в регистре и милливольта в осциллограмме. Пардон, но вам до такого понимания как пешком до Луны. Могу только пожелать успехов в профессиональном росте.
Грендайзер
Цитата
Пардон, но вам до такого понимания как пешком до Луны

Ну видимо не мне одному... колдунство с отключением прерывания не сработало sad.gif
RabidRabbit
Цитата(Грендайзер @ Aug 7 2015, 16:39) *
Частота работы ядра - 100 МГц, частота работы ЦАП - 50 МГц, прерывание возникает не ратьше чем в 25 циклов ЦАП. Ядро какбэ успеет ещё до Камчатки пешком дойти, пока процесс чухнётся.

25 циклов на 50 МГц - это 50 циклов на 100 МГц, оно у Вас вообще из прерываний вылезает?
Грендайзер
Вылезает. При выходе из прерывания, я его отключаю. Тут дрогой интересный момент. Как я понял, некоторое время контроллер работает нормально, в ходе пошаговой отладки (с отключённым прерыванием) процессор некоторое время работает нормально, а потом вылетает в пустой цикл в функции
Код
void Dummy_Handler(void)
{
        while (1) {
        }
}

как будто поступило прерывание, обработчик для которого не указан. Хотя никаких других прерываний я не включал. Ничего не менял кроме программы внутри main и в обработчике. По традиуии приведу код.

Код
    while (1)
    {
        if(n == 7)
        {n = 0;}
        if(DACC -> DACC_IMR == 0) // если прерывание отключено
        {DACC -> DACC_IER = DACC_IER_TXRDY;} // включить прерывание
        
    }
    return 0;
}

void DACC_Handler( void )
{     
    DACC -> DACC_ISR;
    DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);
    n = n + 1;
    DACC -> DACC_IDR = DACC_IDR_TXRDY; // отключить прерывание
    return;
}


P.S.
Цитата
25 циклов на 50 МГц - это 50 циклов на 100 МГц

25 циклов на 50 это 25 циклов на 50. Частота работы ЦАП 50МГц
Грендайзер
Ну сейчас меня с гавн съедят, и всё же... Товарищ scifi Вы где? Вы были правы! Правда так я и не допетрил кой чего, а именно... Следующий код обработчика прерывания, как я уже писал результата не даёт:
Код
void DACC_Handler( void )
{
    DACC -> DACC_ISR; // читаем регистр что бы сбросить флаг прерывания
    DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]); //передаём данные в в цап
    {n = n + 1;} // увеличиваем индекс элемента массива
        DACC -> DACC_IDR = DACC_IDR_TXRDY; // отключаем прерывание в переферии
    return;
}

не зависимо от того какая строчка "n = n + 1" или "DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);" идёт раньше. Но стоит одну из этих строк (или их обе - не важно) поставить после строки "DACC -> DACC_IDR = DACC_IDR_TXRDY;" как всё чудным образом начинает работать. Т.е.
Код
void DACC_Handler( void )
{
    DACC -> DACC_ISR;
    DACC -> DACC_IDR = DACC_IDR_TXRDY;
    [u]DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);[/u]
    [u]{n = n + 1;}[/u]
    return;
}

или
Код
    DACC -> DACC_ISR;
        [u]{n = n + 1;}[/u]
    DACC -> DACC_IDR = DACC_IDR_TXRDY;
    [u]DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);[/u]
    return;

или
Код
    DACC -> DACC_ISR;
        [u]DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]);[/u]
    DACC -> DACC_IDR = DACC_IDR_TXRDY;
        [u]{n = n + 1;}[/u]
    return;

Из - за чего это происходит? smile3046.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.