Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Одновременная работа DS1820 и кнопок
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
zheka
Доброго времени суток и с наступаюищм всех новым годом!

Собрал я платку, подключил 5 кнопочек, реализовал их обработку в цикле. Потом прикрутил датчик DS1820, помучился 3 дня - работает! Запускаю все вместе - фиг там. Дело в том, что измерение температуры я тоже запихал в цикл. ИЗмерение длится 200 мс, анализ состояния кнопок - мизер. Далее начинается следующий цикл. В итоге, вероятность того, что программ в момент нажатия кнопки будет в месте определения состояиня кнопок крайне мала. Как сделать?

Подозреваю, что как-то надо прерывание организовать от кнопок, и черт, с ним, жертвовать данными измерения температуры в момент нажатия. Но как это практически? Помогите советом и кодом.

Пишу в CodeVision. У меня это примерно так:

Код
void main()
{
DisplayInit();
devices=w1_search(0xf0,rom_code);

while (1)
      {
        temp=ds1820_temperature_101(&rom_code[0][0]);
       Display(temp>>1,(temp&0x01)*50);
      

// Анализируем кнопки

if (PINB.0==0)
{
   delay_ms(20);
    if (PINB.0==1)  HeaterOn=1;    

  }

if (PINB.0==1)
  {
  if (HeaterOn==1)  
  {
    HeaterIn=0;
    HeaterState=~HeaterState;
  }

}

}
WHALE
Как-то у вас непонятно обработка клавиатуры сделана.Приведите,пожалуйста,схему включения.
zheka
Все кнопки одной ногой к пинам, другие ноги на минус питания. Включены внутренние pullup резисторы. Т.е. если на пине - 0, значит кнопка нажата, если 1, значит кнопка отпущена (работае pullup)

С внешними прерываниями уже не получится... У меня плата собрана - все кнопки на PORTB, а прерывания у mega16 на PORTD.
Ну может хитрость какая есть в программировании?



WHALE, и еще - у меня обработка калвиши по приципу флажка - нажал однократно - включил, еще раз нажал - выключил.
SasaVitebsk
Цитата(zheka @ Dec 30 2006, 22:28) *
Все кнопки одной ногой к пинам, другие ноги на минус питания. Включены внутренние pullup резисторы. Т.е. если на пине - 0, значит кнопка нажата, если 1, значит кнопка отпущена (работае pullup)

С внешними прерываниями уже не получится... У меня плата собрана - все кнопки на PORTB, а прерывания у mega16 на PORTD.
Ну может хитрость какая есть в программировании?



WHALE, и еще - у меня обработка калвиши по приципу флажка - нажал однократно - включил, еще раз нажал - выключил.




Путь 1. (Найболее простой)
Прерывание не по кнопке делается, а по таймеру. С определённой периодичностью опрашивается клавиатура.
DS1820 позволяет увеличить времянки в 2 раза. Прерывание от таймера не должно превышать критическое время (то есть не должно серьёзно увеличивать формируемые задержки для DS). Либо задержки должны формироваться в том же прерывании. В местах, где принципиально не допустимы задержки - их запрещают.

Путь 2.
Что-то типо микроOS. (Саму OS наверное не удастся прикрутить, так как слишком задержки малы для нормального функционирования)
Формируются временные метки. Управление попеременно передаётся, то на одну, то на другую задачу. Каждая задача разбивается на фазы. Каждая фаза выполняется за одну метку.

Написал, а потом задумался ( smile.gif )

Вообще-то Вам всё это ни к чему. Съём с одного датчика занимает максимум 13мс (согласно документу). С одним датчиком меньше 10мс. Нормальный период опроса для клавиш от 20 до 100мс. Так, что у Вас просто хомут какой-то.
zheka
Цитата
13мс (согласно документу).


Вообще-то - 200 мс. В принципе, я уже придумал как сделать.. Уже делаю. Выложу.

хм... вот оригинальный код от CodeVision:

Код
int ds1820_temperature_101(unsigned char *addr)
{
if (ds1820_select(addr)==0) return -9999;
w1_write(0x44);
delay_ms(550);
if (ds1820_read_spd(addr)==0) return -9999;
return (int)(__ds1820_scratch_pad.temp_lsb);
}


Зачем там delay_ms(550) ума не приложу. Еще там было w1_init(); которое занимает не менее 550 мс. Я убрал обе строки - работает без сбоев. Как раз 20 мс на измерение затрачивается..

Но! При этом соотношение доли времени измереиня температуры к доле времени, когда может быть проверено состояние кнопок все равно велико. Ибо после 20 мс измерений за микросекунды прогоняется оставшаяся часть цикла и опять начинается измерение. Я сделал так: создал переменную Key равную нулю. После каждого цикла она увеличивается. Когда она достигает 10000 то происходит измерение температуры и обнуление Key. На частоте 1 МГц получается примерно раз в секунду измерение на 20 мс, затем в течение секунды опрос клавиатуры и так далее. Т.е. в одной секунде есть 20 мс, в течение которых нажатие на кнопку будет пропущено.
WHALE
Я бы сделал так-прерывание от таймера раз 500ms, в нем непосредственно обрабатывать кнопки и по
окончании обработчика выставлять флаг.В голове опрашивать флаг и запускать функцию измерения
клавиатуры.
З.Ы.- смотрю на ваш обработчик клавиатуры и нифига понять не могу-как он работает?И где ваши 5 кнопок?
zorromen
ващето в этом датчике нада ждать 750 мс на измерение температуры...поэтому нес смысла его опрашивать раньше чем 1 раз в >=750 мс.. значить делаем прерывание по таймеру для опроса и обработки полученных данных..температура будет глобальной переменной... а в теле основной программы мы просто выводим полученные данные и опрашиваем кнопки...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.