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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

Начал осваивать прерывания в меге16.
Простейший проект - семисегментники ЖК без контроллера + регистры + DS18B20 +DS1307.
По прерыванию с частотой 50гц выводятся данные в регистры и далее на ЖК.
Соответственно читаю из RTC в переменные,а когда надо,по прерыванию, все это добро выводится на ЖК.
Так вот с DS18B20 такой трюк не проходит. Считывает лабуду какую-то. Без прерываний все работает в проекте с ЖКИ с контроллером.
В чем может быть проблема? не успевю считывать из термодатчика и мешают прерывания? Переменные глобальные все. Функции работы с RTC и термодатчиком стандартные кодвижновские.
Контактная информация:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев

Сообщение BCluster »

Верно мыслите, мешают прерывания. С 1wire вообще с прерываниями проблема - там все realtime, и задержки недопустимы. Поэтому отключайте прерываниея перед считыванием. Это ассемблерные команды cli и sei. Первая запрещает вторая разрешает. Если пишете на Си делате ассемблерную вставку. Если CodeVision #asm("cli");
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

BCluster писал(а):Верно мыслите, мешают прерывания. С 1wire вообще с прерываниями проблема - там все realtime, и задержки недопустимы. Поэтому отключайте прерываниея перед считыванием. Это ассемблерные команды cli и sei. Первая запрещает вторая разрешает. Если пишете на Си делате ассемблерную вставку. Если CodeVision #asm("cli");
Так это... а I2C прерывания не мешают,выходит?
И тогда еще вопрос в догонку, вот отключу я прерывания, а через них идет вывод на ЖК. Не будет на нем непойми что показываться пока читаю из термодатчика?Да к тому же он (ЖК) хитрый,его надо переменкой тактировать,т.к. он без контроллера. вобще надо попробовать отключить конечно.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

ARV писал(а):для работы с 1-wire главное обеспечить строгую дилтельность начала каждого тайм-слота - это примерно 15-17 микросекунд. напоминаю, если вы еще не читали статьи про 1-wire (в том числе и мою), что 1 тайм-слот равносилен чтению/записи одного бита по интерфейсу. именно на эти жалкие 15-17 микросекунд надо запрещать прерывания. думаю, вашему ЖК такие задержки не повредят. а вот I2C - интерфейс полностью синхронный, там нет никакого ограничения на длительности импульсов по шинам - хоть сутками пусть длятся, лишь бы фронты были крутыми. вот так.
Статью не читал,да. Спасибо за разъяснения.
Пользую стандартные процедуры чтения 1wire от кодвижн. Чтение из термодатчика длится даже при разрешении 9 бит уж никак не 17 микросекунд. Про прерывания я понял, но как поступить? Писать свои функции чтения? Вобщем попробую запретить,посмотрим что из этого выйдет)
Контактная информация:
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18785
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

adrenocrome
В процессоре Z80 была отличная команда HALT. Принцип её - остановка хода программы для ожидание окончания прерывания. Очень была полезная при синхронизации графики.
Используйте подобное. Сделайте глобальный бит/флаг окончания прерывания. В основной программе дождитесь его и обращайтесь к термометру. У вас есть 20мс чистого времени, чтобы не разрушить индикацию.
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 365
Зарегистрирован: Вт окт 21, 2008 15:03:06
Откуда: moscow

Сообщение adrenocrome »

Спасибо за наводки ;)
Я его победил.
Переделал функцию чтения температуры из кодевижна.

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

Работает отлично!
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»