реклама на сайте
подробности

 
 
> Многопоточность на attiny2313
aivs
сообщение Apr 6 2013, 21:15
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 114
Регистрация: 3-10-09
Пользователь №: 52 731



Продолжаю изучать программирование под avr.
Написал программу "Часы", добавил три кнопки для выставления времени, кнопки обрабатываются по прерыванию от Таймера каждые 0.1 сек, время тикает от того же таймера, все красиво и четко работает.
Затем я задействовал термодатчик ds18b20 с шиной 1ware и написал программу для показа температуры на дисплее hd44780, датчик опрашивается по прерыванию от таймера каждые 0.1 сек, прекрасно работает.
А затем я решил совместить эти две программы, чтобы часы в одной части дисплея работали, а температура в другой части. Получилось кривенько, при опросе датчика прерывания запрещены, соответственно на нажатия кнопок реакция заторможенная.
Подскажите, как бы реализовать подобие многопоточности?
Может тут подойдут конечные автоматы?
Приветствую список литературы по этому вопросу!
А может для attiny2313 вообще это не возможно сделать без тормозов?

Сообщение отредактировал aivs - Apr 6 2013, 21:16
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
mempfis_
сообщение Apr 7 2013, 11:12
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(aivs @ Apr 7 2013, 01:15) *
Затем я задействовал термодатчик ds18b20 с шиной 1ware и написал программу для показа температуры на дисплее hd44780, датчик опрашивается по прерыванию от таймера каждые 0.1 сек, прекрасно работает.
А затем я решил совместить эти две программы, чтобы часы в одной части дисплея работали, а температура в другой части. Получилось кривенько, при опросе датчика прерывания запрещены, соответственно на нажатия кнопок реакция заторможенная.


Есть такая проблема при опросе DS18B20. Датчик требует точного выдерживания временных интервалов, поэтому тут без __delay_cycles(x) с запрещёнными прерываниями никак. Но если внимательно посмотреть на шину 1-wire, то в принципе точно выдерживать временные интервалы необходимо не постоянно, а только в пределах определения наличия устройства на шине и при чтении бита данных. Т.е. можно между чтениями битов на некоторое время разрешать прерывания чтобы сработали прерывания, возникшие в моменты чтения отдельных бит.
А как часто Вы оправшиваете датчик? Некоторые товарищи на форуме советуют опрашивать не чаще чем раз в 30 секунд, ибо будет саморазогрев датчика. Также нет смысла опрашивать его часто при измерении температуры воздуха.

Мне неоднократно приходилось опрашивать такие датчики и отображать температуру на дисплее + сканировать кнопки. Могу кое что посоветовать по поводу организации программы. Вам нет смысла висеть в обработчиках прерываний для сканирования кнопок и динамической индикации. Достаточно одного таймера с периодом = 10мС/(число отображаемых разрядов индикатора). Если у Вас 4 разряда, то период 10/4 = 2,5 мС. Это обеспечит частоту обновления ~100 Гц. В прерывании просто выставляйте флаг что было прерывание, а в основном цикле анализируйте этот флаг, выполняйте процедуру динамической индикации и опрос кнопок. Эти процессы не требуют сверхбыстрой реакции. Если Вы организуете чтение датчика с разрешёнными на время прерываниями между таймслотами 1-wire, то Вы даже не заметите мерцания индикации или пропуска кнопок.
А для часов заведите другой таймер, который будет генерировать прерывания раз в 0,5-1 секунду. За 500 мС процессор всегда найдёт возможность обработать этот флаг и Вы не потеряете точности хода.
В загруженных программах, где много чего обрабатывается, но прерывания разрешены более точно считать время помагает переменная timestamp, которую необх. инрементировать при входе в обработчик прерывания от таймера. Тогда при обработке флага прерывания от таймера Вы более-менее точно будете знать сколько было прерываний от данного таймера. Но Ваша задача не настолько сложна и загружена, чтобы вводить подобное ухищрение.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Apr 7 2013, 19:37
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(mempfis_ @ Apr 7 2013, 14:12) *
Есть такая проблема при опросе DS18B20. Датчик требует точного выдерживания временных интервалов,

Проблемы скорее нет, чем есть.
Разве самому можно её создать, подключив 1-wire к неподходящим для этого выводам МК.
Точности тоже никакой не требуется.

Цитата(mempfis_ @ Apr 7 2013, 14:12) *
поэтому тут без __delay_cycles(x) с запрещёнными прерываниями никак.

Делать запрет прерываний на 500 мкс? Странно это.

Цитата(mempfis_ @ Apr 7 2013, 14:12) *
Но если внимательно посмотреть на шину 1-wire, то в принципе точно выдерживать временные интервалы необходимо не постоянно, а только в пределах определения наличия устройства на шине и при чтении бита данных.

Все циклы обмена начинаются мастером. Остаётся только настроить захват таймера по фронту(или считывать по PIN_CHANGE, но это хуже).
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 8 2013, 07:31
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата
Проблемы скорее нет, чем есть.
Разве самому можно её создать, подключив 1-wire к неподходящим для этого выводам МК.


Не всегда программист выбирает к какому выводу подключать датчики. И не всегда "правильные" выводы свободны.
Зато можно написать одну процедуру чтения 1-wire устройства, которая будет работать на любом пине любого порта AVR.
Для AVR у меня именно так и сделано.


Цитата
Точности тоже никакой не требуется. Делать запрет прерываний на 500 мкс? Странно это.


В чём странность запрещать прерывания? Возникновение прерывания во время вызова процедуры __delay_cycles() увеличивает задержку на время входа в прерывание, его обработки и выхода из прерывания. Если прерывание тяжёлое, то и задержка может растянуться. Если посмотреть на таблицу, то практически везде требуется точность не хуже 10 uS.
Go to the top of the page
 
+Quote Post
_basile
сообщение Apr 8 2013, 07:52
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 175
Регистрация: 18-01-06
Из: Москва
Пользователь №: 13 329



DATASHEET 2313: "The External Interrupts are triggered by the INT0 pin, INT1 pin or any of the PCINT7..0"
Ну, и зачем кнопки по таймеру опрашивать?
Как тут уже заметили, температура - штука достаточно инерционная, поэтому ее вполне можно считывать раз в 10 секунд.
Ну, и, естественно, разрешать прерывания после каждого прочитанного БИТА.
Что касается дисплея, то я статус вообще не опрашиваю, а просто выставляю гарантированную задержку.

Ха! Дак у топикстартера что в прерывании по таймеру творится:

_delay_ms(25); // Пауза на 25 мс Ну, и ктож задержки делает в обработчике прерываний ??????
if (bit_is_clear(PIND,5)) { // Если кнопка PD5 нажат
while (bit_is_clear(PIND,5)); //Ждем отжатия клавиши Еще бы не тормозило !

Сообщение отредактировал _basile - Apr 8 2013, 08:02


--------------------
" Будут с водкою дебаты, отвечай : Нет ребяты-демократы, только чай ! "
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Apr 8 2013, 07:57
Сообщение #6


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(_basile @ Apr 8 2013, 10:52) *
Как тут уже заметили, температура - штука достаточно инерционная, поэтому ее вполне можно считывать раз в 10 секунд.

Вы не с того конца мысль выразили. sm.gif Чаще считывать температуру не надо, потому что в этом случае идет саморазогрев ds18b20.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- aivs   Многопоточность на attiny2313   Apr 6 2013, 21:15
- - ILYAUL   ЦитатаПолучилось кривенько, при опросе датчика пре...   Apr 6 2013, 21:52
- - Xenia   Цитата(aivs @ Apr 7 2013, 01:15) Получило...   Apr 6 2013, 23:39
|- - _Артём_   Цитата(Xenia @ Apr 7 2013, 02:39) что нел...   Apr 7 2013, 00:31
- - aivs   В прерывании я опрашиваю три кнопки, и если кнопка...   Apr 7 2013, 07:38
|- - Xenia   Цитата(aivs @ Apr 7 2013, 11:38) Код // ...   Apr 7 2013, 12:23
||- - _Pasha   Цитата(Xenia @ Apr 7 2013, 15:23) Возможн...   Apr 7 2013, 14:19
||- - Xenia   Цитата(_Pasha @ Apr 7 2013, 18:19) Там в ...   Apr 7 2013, 14:31
||- - _Pasha   Цитата(Xenia @ Apr 7 2013, 17:31) А syste...   Apr 7 2013, 14:35
|- - mempfis_   ЦитатаЗадержки с использованием _delay_us и _delay...   Apr 7 2013, 12:58
- - _Pasha   Могу сказать, как делаю я. 1. Беру за основу идею,...   Apr 7 2013, 09:58
|||- - _basile   Цитата(_Pasha @ Apr 8 2013, 11:57) Вы не ...   Apr 8 2013, 08:08
|||- - _Pasha   Цитата(_basile @ Apr 8 2013, 11:08) И что...   Apr 8 2013, 08:22
||- - aivs   Цитата(_basile @ Apr 8 2013, 11:52) DATAS...   Apr 8 2013, 16:37
|- - _Артём_   Цитата(mempfis_ @ Apr 8 2013, 10:31) Не в...   Apr 8 2013, 14:36
- - aivs   Спасибо, уберу из прерывания: Код_delay_ms(25...   Apr 8 2013, 13:36
- - ARV   всем начинающим всегда рекомендую мудрить поменьше...   Apr 8 2013, 17:48
- - Xenia   Я тоже сразу заметила, что в этой программе пока д...   Apr 8 2013, 22:36
- - _Pasha   Цитата(Xenia @ Apr 9 2013, 01:36) Поэтому...   Apr 9 2013, 01:23
- - aivs   Цитата(Xenia @ Apr 9 2013, 02:36) Поэтому...   Apr 9 2013, 08:17
- - _Pasha   Цитата(aivs @ Apr 9 2013, 11:17) Нет...   Apr 9 2013, 09:14
- - mempfis_   Цитата(aivs @ Apr 9 2013, 11:17) Нет...   Apr 9 2013, 09:43
- - ARV   Цитата(mempfis_ @ Apr 9 2013, 13:43) Прос...   Apr 9 2013, 10:11
- - mempfis_   Цитата(ARV @ Apr 9 2013, 13:11) P.S. судя...   Apr 9 2013, 14:14


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 03:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016