|
SAM4S, Ничего не выходит |
|
|
|
 |
Ответов
(45 - 59)
|
Aug 7 2015, 13:20
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Ну началось... Бог с ней с пилой... Мне не важно, что там будит формироваться, мне важно что б там хоть что то формироалось. Я пробовал обнулять в основной программе номера элементов буфера. Т.е. так Код while (1) { if (n == 8) {n = 0;} } return 0; }
void DACC_Handler( void ) { volatile int IRQ_sense = 0; IRQ_sense = DACC -> DACC_ISR; DACC -> DACC_CDR = DACC_CDR_DATA(dout[n]); n = n + 1; return; } Так вот команда "n + 1" исправно выполняется, а вот обнуление в цикле "while(1)" т.е. "n = 0" не происходит. Почему? Может кто нибудь предложить программку, что б данные из "main" передать в "void DACC_Handler( void )"? P.S. int dout[8] = {300, 800, 1300, 1800, 2300, 2800, 3200, 100};
Сообщение отредактировал Грендайзер - Aug 7 2015, 13:24
|
|
|
|
|
Aug 7 2015, 13:31
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Грендайзер @ Aug 7 2015, 16:20)  а вот обнуление в цикле "while(1)" т.е. "n = 0" не происходит. Ну почему-же не происходит? Иногда может быть и происходит - как звезды на небе станут. Что написали, то и получили - два асинхронных процесса что-то делают с одной переменной. QUOTE Может кто нибудь предложить программку, что б данные из "main" передать в "void DACC_Handler( void )"? Вы свое 'n' и 'dout' как-бы передаете, только делаете с ним хрен знает что. Повторяю - думайте над АЛГОРИТМОМ. Над его реализацией будете думать ПОТОМ. while (1)for(;; ) { if (n == 8) {n = 0;} } void DACC_Handler( void ) { volatile int IRQ_sense = 0; IRQ_sense = DACC -> DACC_ISR; // (полагаю, что дефайн для DACC структуры писал не индийский недоучка и не Грендайзер) DACC -> DACC_CDR = DACC_CDR_DATA( dout[n] ); n = n + 1; if( ++n > 7 ) n = 0; return; }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 7 2015, 13:39
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Вы свое 'n' и 'dout' как-бы передаете, только делаете с ним хрен знает что Частота работы ядра - 100 МГц, частота работы ЦАП - 50 МГц, прерывание возникает не ратьше чем в 25 циклов ЦАП. Ядро какбэ успеет ещё до Камчатки пешком дойти, пока процесс чухнётся. Такая программа и без for(;;) нормально работает. Как n в main передать?
Сообщение отредактировал Грендайзер - Aug 7 2015, 13:45
|
|
|
|
|
Aug 7 2015, 13:47
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Ну тогда так: не забыли приписать volatile к переменной n? Нет, не забыл! Volatile куда тока не писал....
|
|
|
|
|
Aug 7 2015, 13:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Грендайзер @ Aug 7 2015, 16:39)  Частота работы ядра - 100 МГц, частота работы ЦАП - 50 МГц, прерывание возникает не ратьше чем в 25 циклов ЦАП. Ядро какбэ успеет ещё до Камчатки пешком дойти, пока процесс чухнётся. Написаное Вами Выше ни о чем, кроме каши в голове не свидетельствует, что было ясно и раньше  . Абсолютное непонимание того, что сотворили. Читайте по буквам еще раз - "два асинхронных процесса что-то делают с одной переменной". QUOTE Такая программа и без for(;;) нормально работает. Писать ГРАМОТНО нужно даже если "работает".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 7 2015, 13:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Грендайзер @ Aug 7 2015, 16:47)  Нет, не забыл! Volatile куда тока не писал.... Можете еще и в бубен постучать, свечку поставить. Только все работает у Вас правильно, в том смысле, как НАПИСАЛИ, так и "работает".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 7 2015, 14:11
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Что на выходе получиться должно-то? Должно получится обнуление переменной n в цикле "while(1)" функции main. Цитата как НАПИСАЛИ, так и "работает". Так подскажите, как написать, что б без бубна и свечек...
|
|
|
|
|
Aug 7 2015, 14:20
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Легко. Запретить прерывания на время проверки и обнуления переменной. Честно говоря звучит... странновато... но попробую! К сожалению плата на работе, так что придётся до пн. потерпеть. Цитата Только зачем всё это? Что мешает обнулять в обработчике прерывания? Проблема в том, что у меня почему то не передаются даннные из main в подпрограмму прерывания. Обнулить n кончно можно и в обработчике, но вот если мне надо какой нить хитрый фильтр посчитать... Эдак я пока из обработчика выйду столько событий могу напропускать... Да и насколько я понимаю, прерывания не для того, что б в них что то считать, они лишь нужны для общения с переферией. Цитата не каждый раз оно сможет занулить эту переменную, даже если цикл успевает крутиться между прерываниями. Может, это вас и подкосило Не вижу корелляции если честно... На том всё и основано...
Сообщение отредактировал Грендайзер - Aug 7 2015, 14:30
|
|
|
|
|
Aug 7 2015, 15:46
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Грендайзер @ Aug 7 2015, 17:20)  Проблема в том, что у меня почему то не передаются даннные из main в подпрограмму прерывания. Всё передаётся. Просто передаётся оно не так, как вам кажется, а так, как написано в исходнике. То есть проблема в том, что ваше видение программы и её поведение в соответствии с исходником отличаются. Надо что-то подправить в консерватории Цитата(Грендайзер @ Aug 7 2015, 17:20)  Да и насколько я понимаю, прерывания не для того, что б в них что то считать, они лишь нужны для общения с переферией. Это предрассудок. В общем случае обычно так оно и есть, но здравый смысл никто не отменял, и часто оправданно отклонение от этого правила. Цитата(Грендайзер @ Aug 7 2015, 17:20)  Обнулить n кончно можно и в обработчике, но вот если мне надо какой нить хитрый фильтр посчитать... Эдак я пока из обработчика выйду столько событий могу напропускать... Насколько я могу судить, затягивание обработки прерывания АЦП может привести к отложенной обработке прерывания ЦАР. А это, в свою очередь, может привести к чрезмерному джиттеру на выходе ЦАП (а может и не привести). Есть простое решение: дать прерыванию ЦАП более высокий приоритет.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|