Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

Закрытая тема
Опции темы
Непрочитано 13.12.2013, 22:14   #1
Janush
Частый гость
 
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Janush на пути к лучшему
По умолчанию Задержка и прерывания

Столкнулся с проблемой.


Есть вектор прерывания по таймеру без предделителя на меге8.


при включении прерывания следующее за ним игнорирование тактов не работает. В чем проблема?

__enable_interrupt();
__delay_cycles(8000000);

Секунда ожидания нужна для принятия решения(опрос порта).
Порт выдает число от 0-9.
В прерывании проверяется искомое число.

дак вот это число так и не доходит до прерывания.
Реклама:
Janush вне форума  
Непрочитано 13.12.2013, 22:56   #2
niXto
Почётный гражданин KAZUS.RU
 
Аватар для niXto
 
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,048
Сказал спасибо: 60
Сказали Спасибо 3,954 раз(а) в 2,309 сообщении(ях)
niXto на пути к лучшему
По умолчанию Re: Задержка и прерывания

Это весь код программы?
niXto вне форума  
Непрочитано 14.12.2013, 10:05   #3
Catcatcat1
Прописка
 
Регистрация: 05.05.2007
Сообщений: 116
Сказал спасибо: 10
Сказали Спасибо 58 раз(а) в 34 сообщении(ях)
Catcatcat1 на пути к лучшему
По умолчанию Re: Задержка и прерывания

Цитата:
__delay_cycles(8000000);
возможно компилятором эта величина некорректно воспринимается.

Но непонятно почему вы считаете, что после прерывания программа обязана вернуться и именно в это место!?
Catcatcat1 вне форума  
Непрочитано 14.12.2013, 14:12   #4
Janush
Частый гость
 
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Janush на пути к лучшему
По умолчанию 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();
}

В прерывании то таймеру я обрабатываю индикацию. Я включаю прерывания только в момент ожидания преобразования температуры в датчике. При этом никаких данных не приходит. Что за херня?
Janush вне форума  
Непрочитано 14.12.2013, 17:35   #5
Djakovskij
Вид на жительство
 
Регистрация: 14.06.2009
Адрес: Україна Київська обл. м.Буча
Сообщений: 327
Сказал спасибо: 104
Сказали Спасибо 105 раз(а) в 69 сообщении(ях)
Djakovskij на пути к лучшему
По умолчанию Re: Задержка и прерывания

А эти библиотечные функции не interrupt driven?
Djakovskij вне форума  
Непрочитано 14.12.2013, 17:59   #6
tsb
Прописка
 
Аватар для tsb
 
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
tsb на пути к лучшему
По умолчанию 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.
tsb вне форума  
Непрочитано 14.12.2013, 21:05   #7
hacker7
Вид на жительство
 
Регистрация: 07.01.2007
Адрес: Ленинградская обл
Сообщений: 428
Сказал спасибо: 147
Сказали Спасибо 71 раз(а) в 56 сообщении(ях)
hacker7 на пути к лучшему
По умолчанию 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.
hacker7 вне форума  
Непрочитано 14.12.2013, 22:01   #8
Janush
Частый гость
 
Регистрация: 09.11.2012
Сообщений: 46
Сказал спасибо: 5
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
Janush на пути к лучшему
По умолчанию 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_SCRATCHPADBUS);

    
scratchpad[0] = OWI_ReceiveByte(BUS);
    
scratchpad[1] = OWI_ReceiveByte(BUS);

    
__enable_interrupt();

// Вот тут еще несколько операций обычных присвоений по типу
переменная1=переменная3+переменная2//циклов на 300-400 и никак не 

//связанных ни с прерываниями ни с какими либо функциями.

Этого достаточно чтобы выйти в прерывание по таймеру и индикация обрабатывается как надо. Но происходит мерцание из-за того что в цикле есть задержка в 1 секунду.
Я решил разрешить прерывание на время задержки. Но данные перестали обновлятся в scratchpad. Соответственно индикация отображает одни и те же цифры.
Janush вне форума  
Непрочитано 15.12.2013, 00:37   #9
tsb
Прописка
 
Аватар для tsb
 
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
tsb на пути к лучшему
По умолчанию Re: Задержка и прерывания

Все таки, IMHO, не совсем логично организована обработка индикации. Если индикация статическая (а при двух разрядах это возможно), то нет смысла привязываться к таймеру. Просто после получения новых данных - вызвать процедуру вывода их на индикатор и не трогать до следующего измерения. Если же индикация динамическая, то, чтобы не было мерцания, обработка вывода на индикатор должна происходить с равномерным периодом, строго по таймерному прерыванию. Но при этом нельзя запрещать эти прерывания! Ну, если и запрещать, то только на очень короткое время в особо критичных местах программы. Но уж никак не на секунду!
tsb вне форума  
Непрочитано 15.12.2013, 01:11   #10
tsb
Прописка
 
Аватар для tsb
 
Регистрация: 25.11.2006
Адрес: Харьков
Сообщений: 295
Сказал спасибо: 25
Сказали Спасибо 71 раз(а) в 60 сообщении(ях)
tsb на пути к лучшему
По умолчанию Re: Задержка и прерывания

Сообщение от hacker7 Посмотреть сообщение
...
Букварь читайте
вот м б ВАм поможет вот эта выдержка из классич курса программирования
http://www.proza.ru/2010/11/10/1060
http://www.proza.ru/2010/11/24/931
http://www.proza.ru/2010/11/21/493
Из любопытства глянул по Вашим ссылкам и не удержался от комментария.
Какой же это "классический курс программирования"?
Это просто какие-то "мысли по поводу программирования" неизвестного автора. Очень краткие и имеющие весьма отдаленное отношение к практическому программированию, а особенно к микроконтроллерам. Чему можно научиться на данных статейках - не представляю!
tsb вне форума  
Закрытая тема

Закладки


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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AT89C5131 прием и передача данных по USB rihkov AVR 14 15.11.2012 08:16
PIC16 TMR0 и TMR2 Slava-martyn Микроконтроллеры, АЦП, память и т.д 10 06.12.2011 01:58
Прерывания PIC milssky Микроконтроллеры, АЦП, память и т.д 12 10.10.2010 13:31
Вход в прерывания для PIC микроконтроллеров dimmich Микроконтроллеры, АЦП, память и т.д 4 06.12.2009 17:17
LCD DEM 16261(4 bit mode) + AT89C51 ajborman Микроконтроллеры, АЦП, память и т.д 8 21.03.2007 15:26


Часовой пояс GMT +4, время: 23:18.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot