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

 
 
> Структура программы, Вырабатываю хороший стиль программирования
UniBomb
сообщение Mar 18 2009, 11:33
Сообщение #1


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

Группа: Свой
Сообщений: 148
Регистрация: 26-05-05
Пользователь №: 5 416



Добрый день. Возник у меня вопрос, который терзает моё эго и не даёт спокойно работать. Вопрос заключается в организации программы. В общем вот:

Допустим есть ТЗ: сделать прибор, который должен:

- считывать температуру с датчика по шине TWI
- считывать значение напряжения с АЦП с датчика влажности
- расчитывать значение влажности в общепринятых единицах
- выдать предупреждающие сигналы в случае превышения норм
- показать значения на дисплее

Зада просто и понятна (хоть и высосана из пальца). Реализовал бы всё это дело я так:

Код
#include <io.h>
volatile int counter;
int main()
{
//инициализирую всё и вся

for(;;) //пустой бесконечный цикл
;
}

ISR(SIG_OUTPUT_COMPARE1A)
{
switch(counter)
  {
   case 100: BeginTempConvers(); break; //посылаю запрос для начала считывания температуры
   case 200: GetADCValue(); break; //считываю значение с АЦП
   case 300: ProcessADCValue(); break; //раситываю необходимые значения
   case 400: GetTempValue(); break; //считываю температуру
   case 500: SetAlarm(); break; //проверяю значения и вывожу аварийные сигналы если надо
   case 600: DisplayValues(); break; //вывожу все данные на экран
  };

counter++;
if(counter == 601)
  counter = 0;
}


Так вот вопрос - хорошо ли я делаю? Какие есть ещё способы реализации поставленной задачи. Просто мне почему то кажется, что всю логику работы прибора нехорошо запихивать в таймер...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
haker_fox
сообщение Mar 19 2009, 04:38
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



Цитата(UniBomb @ Mar 18 2009, 19:33) *
Добрый день. Возник у меня вопрос, который терзает моё эго и не даёт спокойно работать. Вопрос заключается в организации программы.

Здравствуйте!
В прерываниях обрабатывайте то, что там обрабатывать нужно. Обработчики прерываний делайте максимально быстрыми. Весь функционал программы (обработки информации с датчиков, выдача данных на дисплей, обработка данных от клавиатуры) разместите в отдельных функциях, которые вызывайте из бесконечного цикла в main(). А вот работу с шиной I2C, сбор данных с АЦП можно (и даже лучше) разместить прерывания. Таким образом, в обработчике прерывания от АЦП Вы будете считывать данные и ложить их в буфер, а также анализировать ошибки АЦП. Все. В обработчики прерываний шины TWI вы будете анализировать состояние шины, ошибки, принимать данные и ложить в буфер или брать данные из буфера и передавать их. Все. А вот ложить данные в буферы, читать их оттуда, уже задача основной программы. Ну примерно так. Дальше уже с опытом понимание придет.

Цитата(UniBomb @ Mar 18 2009, 21:50) *
Кстате, а почему плохо? Спрашиваю для общего развития, а не для спора)))

Тут дискутировали недавно.


--------------------
Выбор.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 24th August 2025 - 05:58
Рейтинг@Mail.ru


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