Страница 1 из 1

вопросик по прерываниям

Добавлено: Ср апр 29, 2009 19:27:57
adrenocrome
Начал осваивать прерывания в меге16.
Простейший проект - семисегментники ЖК без контроллера + регистры + DS18B20 +DS1307.
По прерыванию с частотой 50гц выводятся данные в регистры и далее на ЖК.
Соответственно читаю из RTC в переменные,а когда надо,по прерыванию, все это добро выводится на ЖК.
Так вот с DS18B20 такой трюк не проходит. Считывает лабуду какую-то. Без прерываний все работает в проекте с ЖКИ с контроллером.
В чем может быть проблема? не успевю считывать из термодатчика и мешают прерывания? Переменные глобальные все. Функции работы с RTC и термодатчиком стандартные кодвижновские.

Добавлено: Ср апр 29, 2009 20:00:46
BCluster
Верно мыслите, мешают прерывания. С 1wire вообще с прерываниями проблема - там все realtime, и задержки недопустимы. Поэтому отключайте прерываниея перед считыванием. Это ассемблерные команды cli и sei. Первая запрещает вторая разрешает. Если пишете на Си делате ассемблерную вставку. Если CodeVision #asm("cli");

Добавлено: Ср апр 29, 2009 20:08:13
adrenocrome
BCluster писал(а):Верно мыслите, мешают прерывания. С 1wire вообще с прерываниями проблема - там все realtime, и задержки недопустимы. Поэтому отключайте прерываниея перед считыванием. Это ассемблерные команды cli и sei. Первая запрещает вторая разрешает. Если пишете на Си делате ассемблерную вставку. Если CodeVision #asm("cli");
Так это... а I2C прерывания не мешают,выходит?
И тогда еще вопрос в догонку, вот отключу я прерывания, а через них идет вывод на ЖК. Не будет на нем непойми что показываться пока читаю из термодатчика?Да к тому же он (ЖК) хитрый,его надо переменкой тактировать,т.к. он без контроллера. вобще надо попробовать отключить конечно.

Добавлено: Ср апр 29, 2009 20:27:45
ARV
для работы с 1-wire главное обеспечить строгую дилтельность начала каждого тайм-слота - это примерно 15-17 микросекунд. напоминаю, если вы еще не читали статьи про 1-wire (в том числе и мою), что 1 тайм-слот равносилен чтению/записи одного бита по интерфейсу. именно на эти жалкие 15-17 микросекунд надо запрещать прерывания. думаю, вашему ЖК такие задержки не повредят. а вот I2C - интерфейс полностью синхронный, там нет никакого ограничения на длительности импульсов по шинам - хоть сутками пусть длятся, лишь бы фронты были крутыми. вот так.

Добавлено: Ср апр 29, 2009 20:35:14
adrenocrome
ARV писал(а):для работы с 1-wire главное обеспечить строгую дилтельность начала каждого тайм-слота - это примерно 15-17 микросекунд. напоминаю, если вы еще не читали статьи про 1-wire (в том числе и мою), что 1 тайм-слот равносилен чтению/записи одного бита по интерфейсу. именно на эти жалкие 15-17 микросекунд надо запрещать прерывания. думаю, вашему ЖК такие задержки не повредят. а вот I2C - интерфейс полностью синхронный, там нет никакого ограничения на длительности импульсов по шинам - хоть сутками пусть длятся, лишь бы фронты были крутыми. вот так.
Статью не читал,да. Спасибо за разъяснения.
Пользую стандартные процедуры чтения 1wire от кодвижн. Чтение из термодатчика длится даже при разрешении 9 бит уж никак не 17 микросекунд. Про прерывания я понял, но как поступить? Писать свои функции чтения? Вобщем попробую запретить,посмотрим что из этого выйдет)

Добавлено: Ср апр 29, 2009 20:58:56
ARV
adrenocrome писал(а):Пользую стандартные процедуры чтения 1wire от кодвижн. Чтение из термодатчика длится даже при разрешении 9 бит уж никак не 17 микросекунд. Про прерывания я понял, но как поступить? Писать свои функции чтения? Вобщем попробую запретить,посмотрим что из этого выйдет)
писать свои. запрет на все время обращения "стандартными" функциями однозначно приведет к мерцанию индикатора.

Добавлено: Ср апр 29, 2009 21:37:21
asteroid7
adrenocrome
В процессоре Z80 была отличная команда HALT. Принцип её - остановка хода программы для ожидание окончания прерывания. Очень была полезная при синхронизации графики.
Используйте подобное. Сделайте глобальный бит/флаг окончания прерывания. В основной программе дождитесь его и обращайтесь к термометру. У вас есть 20мс чистого времени, чтобы не разрушить индикацию.

Добавлено: Чт апр 30, 2009 09:55:17
adrenocrome
Спасибо за наводки ;)
Я его победил.
Переделал функцию чтения температуры из кодевижна.

Запрещаю прерывания
Запускаю процесс конвертации температуры в датчике
Разрешаю прерывания
Жду пока программа пройдет несколько циклов
запрещаю прерывания
читаю температуру
разрешаю прерывания

Работает отлично!