Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
13.12.2013, 22:14
|
|
Частый гость
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Задержка и прерывания
Столкнулся с проблемой.
Есть вектор прерывания по таймеру без предделителя на меге8.
при включении прерывания следующее за ним игнорирование тактов не работает. В чем проблема?
__enable_interrupt();
__delay_cycles(8000000);
Секунда ожидания нужна для принятия решения(опрос порта).
Порт выдает число от 0-9.
В прерывании проверяется искомое число.
дак вот это число так и не доходит до прерывания.
|
|
|
|
13.12.2013, 22:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
|
Re: Задержка и прерывания
Это весь код программы?
|
|
|
|
14.12.2013, 10:05
|
|
Прописка
Регистрация: 05.05.2007
Сообщений: 116
Сказал спасибо: 10
Сказали Спасибо 58 раз(а) в 34 сообщении(ях)
|
Re: Задержка и прерывания
Цитата:
|
__delay_cycles(8000000);
|
возможно компилятором эта величина некорректно воспринимается.
Но непонятно почему вы считаете, что после прерывания программа обязана вернуться и именно в это место!?
|
|
|
|
14.12.2013, 14:12
|
|
Частый гость
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Задержка и прерывания
while(1)
{
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_CONVERT_T ,BUS);
//__enable_interrupt();
__delay_cycles(9000000);
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
scratchpad[0] = OWI_ReceiveByte(BUS);
scratchpad[1] = OWI_ReceiveByte(BUS);
__enable_interrupt();
}
В прерывании то таймеру я обрабатываю индикацию. Я включаю прерывания только в момент ожидания преобразования температуры в датчике. При этом никаких данных не приходит. Что за херня?
|
|
|
|
14.12.2013, 17:35
|
|
Вид на жительство
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 327
Сказал спасибо: 104
Сказали Спасибо 105 раз(а) в 69 сообщении(ях)
|
Re: Задержка и прерывания
А эти библиотечные функции не interrupt driven?
|
|
|
|
14.12.2013, 17:59
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: Задержка и прерывания
Сообщение от Janush
|
... В прерывании то таймеру я обрабатываю индикацию. Я включаю прерывания только в момент ожидания преобразования температуры в датчике. При этом никаких данных не приходит. Что за херня?
|
Вы как то очень непонятно излагаете... Перечитал несколько раз и так и не понял суть проблемы... Ну да ладно попробуем разобраться.
Если должны прийти какие-то данные, но они якобы "не приходят", то может быть несколько причин:
1) Данные реально не поступают. Это проверить нужно подходящим прибором (вольтметром, осциллографом, логическим анализатором).
2) Данные поступают, но неправильно обрабатываются или неправильно сохраняется результат этой обработки. Чтобы это выяснить - нужно смотреть тот фрагмент программы, где происходит обработка. Но Вы нам его пока не показали.
3) Программа не попадает в то место, где происходит обработка данных, или попадает, но не в то время, когда данные поступали.
Из приведенных возможных причин, по Вашим сообщениям можно анализировать только последнюю, да и то частично. Если обработка поступающих данных должна происходить в прерывании. Чтобы произошел переход на обработчик прерывания должно выполниться три условия: общее разрешение прерываний, разрешение конкретного источника прерываний и возникновение условия (требования) этого прерывания. Из приведенного Вами фрагмента программы видно, что в самом начале цикла все прерывания запрещаются. Первое разрешение прерываний (перед __delay_) закомментировано, т.е. не выполняется. И только в самом конце цикла есть разрешение прерываний, но после этого происходит возврат на начало цикла, где прерывания опять запрещаются...
Сообщение от Janush
|
Код:
|
while(1)
{
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_CONVERT_T ,BUS);
//__enable_interrupt();
__delay_cycles(9000000);
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
scratchpad[0] = OWI_ReceiveByte(BUS);
scratchpad[1] = OWI_ReceiveByte(BUS);
__enable_interrupt();
} |
|
Есть ли смысл таким образом задействовать прерывания? Может лучше в нужный момент просто вызвать функцию обработки данных?
Чтобы получить более конкретную помощь по Вашей проблеме - попытайтесь осветить перечисленные выше причины возможного "отсутствия данных".
Последний раз редактировалось tsb; 14.12.2013 в 18:02.
|
|
|
|
14.12.2013, 21:05
|
|
Вид на жительство
Регистрация: 07.01.2007
Адрес: Ленинградская обл
Сообщений: 428
Сказал спасибо: 147
Сказали Спасибо 71 раз(а) в 56 сообщении(ях)
|
Re: Задержка и прерывания
Я вот не понял, каким боком вообще здесь прерывания.
Если что-то посылается в порт, то обычно посылается и без прерываний. Ну - опрашивайте тем или иным способом. Прерывания используют, если нужен немедленный критичный по времени ответ, либо чтобы В ОБРАБОТЧИКЕ прерываний сразу иметь факт события, без ожидания этого события опросом.
извините за прямоту.
Это каша макаронов
Где сам обработчик прерывания???
когда произошло прерывание, В ОБРАБОТЧИКЕ надо работать с устройством или сигнализировать пррограмме работы с устройством (т е с портом)
Притом если в обработчике Вы устроите задержку, то результат см. даташит что будет если при обработке прерывания вознокнет ещё одно
хорошенько смотрите!!!!
Эти подпрограммы:
1) энаблер-дизаблер
2) обработчик
3) работа с портом
- должны быть разделены явно, как положено
как положено, Вы, похоже, не знаете.
Далее. Ряд микрух ваще некорректно работает с прерываниями, даже если всё делать как положено.
На то есть технологии работы БЕЗ прерываний,
и КОНЕЧНО ЖЕ, без вот таких задержечек!!!
Букварь читайте
вот м б ВАм поможет вот эта выдержка из классич курса программирования
http://www.proza.ru/2010/11/10/1060
http://www.proza.ru/2010/11/24/931
http://www.proza.ru/2010/11/21/493
Последний раз редактировалось hacker7; 14.12.2013 в 21:49.
|
|
|
|
14.12.2013, 22:01
|
|
Частый гость
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Задержка и прерывания
Программа достаточна проста. В прерывании происходит переключение портов для управления двусегментным индикатором.
scratchpad --- является глобальным массивом. через него выбирается какая цифра будет отображена на индикаторе.
Все прекрасно работает, если конечно
PHP код:
|
Код:
while(1)
{
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_CONVERT_T ,BUS);
//__enable_interrupt();
__delay_cycles(9000000);
__disable_interrupt();
OWI_DetectPresence(BUS);
OWI_SkipRom(BUS);
OWI_SendByte(DS18B20_READ_SCRATCHPAD, BUS);
scratchpad[0] = OWI_ReceiveByte(BUS);
scratchpad[1] = OWI_ReceiveByte(BUS);
__enable_interrupt();
// Вот тут еще несколько операций обычных присвоений по типу
переменная1=переменная3+переменная2; //циклов на 300-400 и никак не
//связанных ни с прерываниями ни с какими либо функциями.
}
|
Этого достаточно чтобы выйти в прерывание по таймеру и индикация обрабатывается как надо. Но происходит мерцание из-за того что в цикле есть задержка в 1 секунду.
Я решил разрешить прерывание на время задержки. Но данные перестали обновлятся в scratchpad. Соответственно индикация отображает одни и те же цифры.
|
|
|
|
15.12.2013, 00:37
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: Задержка и прерывания
Все таки, IMHO, не совсем логично организована обработка индикации. Если индикация статическая (а при двух разрядах это возможно), то нет смысла привязываться к таймеру. Просто после получения новых данных - вызвать процедуру вывода их на индикатор и не трогать до следующего измерения. Если же индикация динамическая, то, чтобы не было мерцания, обработка вывода на индикатор должна происходить с равномерным периодом, строго по таймерному прерыванию. Но при этом нельзя запрещать эти прерывания! Ну, если и запрещать, то только на очень короткое время в особо критичных местах программы. Но уж никак не на секунду!
|
|
|
|
15.12.2013, 01:11
|
|
Прописка
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
|
Re: Задержка и прерывания
Из любопытства глянул по Вашим ссылкам и не удержался от комментария.
Какой же это "классический курс программирования"?
Это просто какие-то "мысли по поводу программирования" неизвестного автора. Очень краткие и имеющие весьма отдаленное отношение к практическому программированию, а особенно к микроконтроллерам. Чему можно научиться на данных статейках - не представляю!
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 07:53.
|
|