текст программы 007

 
RU termostat #10.03.2004 20:07
+
-
edit
 

termostat

аксакал

ПРОШУ не делать сюда ПОСТИНГИ!

Вопосы и ответы: Сайт расходящихся тропок

"Пишем прогу для МК AVR в он-лайн"

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\


// программа наконец-то 007

/////////////////////// - это отбивка!

/* 007 micro Дата логер - это заголовок программы

сдесь размещают краткое описание устройства, алгоритма его
работы и ключевых моментов для понимания программы спустя
некоторое время после ее написания.

/

///////////////////////

// инклуды #include - подробнее о них

/
Это директивы - указания препроцессору вставить (перед компиляцией только) в
текст написаной вами программы тексты любых других ТЕКСТОВЫХ файлов.

Например вам нужно использовать вычисление sin cos - тогда вам понадобится библиотека математических вычислений, и нужно написать:

#include // из директории INC компилятора

#include "math.h" // вместо этой строки компилятор вствит текст файла math.h
// из директории вашего проекта! а если его там нет то из INC


#include "delay.h" // если мы собираемя использовать готовые временные задержки
// например: delay_ms(25); delay_us(186);

Внимание - различные компиляторы могут иметь различные правила
вызова функций не входящих в стандартный набор реализации языка Си.

Всегда читайте мануал и просматривайте примеры
к компилятору который вы используете! /

///////////////////////

// дефайны #define



///////////////////////

// константы и переменные

///////////////////////

// прототипы функций

///////////////////////

// главная функция main - обязательна в Си

void main(void)
{

}

///////////////////////

// описания функций


/////////////////////// ВСЕ - конец программы!


/
Уфф! написали.

Удивительно но это уже программа для МК, выполнение программы
начинается со строчки void main(void)

Программа как бы ни чего не делает, но если ее откомпилировать то
уже займет некоторый объем флэш памяти МК :-)

Итак минимально возможная програама на Си выглядит так:

void main(void)

{
}

и все.

*/
RU termostat #10.03.2004 20:14
+
-
edit
 

termostat

аксакал

// дефайны #define



/* Это очень мощная и полезная директива препроцессора - она
позволяет делать программу более легко читаемой и адаптируемой.

Например мы задаем частоту измерений с датчиков 100 раз в сек:

#define sample_times 100

И мы использовали это знчение (число 100) в нескольких местах программы.
Но нам потребовалось изменить частоту измерений на 50.

Значит нам потребуется найти все места где написано 100 и поменять на 50, причем мы можем заменить и числа "100" не относящиеся к делу!

А если мы применили Дефайн как выше, то нам нужно просто заменить в этой одной строке 100 на 50:

#define sample_times 50

Все - теперь везде в программе sample_times препроцессор заменит на 50 перед компиляцией.

Смысл директивы понятен: текст после #define заменяется на то что стоит правее, после пробела.

В директиве могут производится и вычисления! и использоваться
переменные х у ...

Подробней в мануале к компилятору.
RU termostat #10.03.2004 20:16
+
-
edit
 
RU termostat #10.03.2004 20:18
+
-
edit
 

termostat

аксакал

Итак СЕКЛЕТ программы на Си для МК:


/* 007 micro Дата логер - это заголовок программы

краткое описание устройства, алгоритма его
работы

*/

///////////////////////
// инклуды #include



///////////////////////
// дефайны #define




///////////////////////
// константы и переменные




///////////////////////
// прототипы функций




///////////////////////
// главная функция main


void main(void)
{

}

///////////////////////
// описания функций





////// конец программы


Будем наращивать мясо!
RU termostat #10.03.2004 20:21
+
-
edit
 

termostat

аксакал

///////////////////////
// главная функция main Что в ней будет?


void main(void)
{

первое это инициализация МК, его устройств в нужном нам режиме:

init_device(); // Название может быть любым, желательно понятное
// Мы просто вызвали функцию которю напишем позже


// Вспомним алгоритм работы устройства - после включения МК должен

// выбрать режим работы - для выбора в Си есть инструкция if ... else


if (recording_data)
{


}

else

{


}



}
RU termostat #10.03.2004 20:29
+
-
edit
 

termostat

аксакал

///////////////////////
// главная функция main Что в ней будет?


void main(void)
{

первое это инициализация МК, его устройств в нужном нам режиме:

init_device(); // Мы просто вызвали функцию инициализации
// которю напишем позже


// Название Функций может быть любым, желательно

// напоминающее что она делает!


// Вспомним алгоритм работы устройства - после включения МК должен

// выбрать режим работы - для выбора в Си есть инструкция if ... else



// Что мы написали ниже? Если значение "recording_data" не равно нулю


if (recording_data) // recording_data - понятно связан с
// положением переключателя перед
// включением питания
{
Если значение "recording_data" не равно нулю, то выполняется
программа расположеная сдесь.

}

else

{
В противном случае, ваполнять программу сдесь.

}



} // скобка закрывающая для функции Мэйн!

RU termostat #10.03.2004 20:35
+
-
edit
 

termostat

аксакал

///////////////////////
// главная функция main Что в ней будет?


void main(void)
{

первое это инициализация МК, его устройств в нужном нам режиме:

init_device(); // Мы просто вызвали функцию инициализации
// которю напишем позже


// Название Функций может быть любым, желательно

// напоминающее что она делает!


// Вспомним алгоритм работы устройства - после включения МК должен

// выбрать режим работы - для выбора в Си есть инструкция if ... else



// Что мы написали ниже? Если значение "recording_data" не равно нулю


if (recording_data) // recording_data - понятно связан с
_000200: { // положением переключателя перед
// включением питания


//Если значение "recording_data" не равно нулю, то выполняется
// программа расположеная сдесь. от _000200: до _000500:

У нас есть два режима записи - в кольцевой буфер и до конца памяти!

while(!start)
{

Пока мы не зафиксировали старт - т.е. значение "start" = 0 или ложно,
и соответственно (!start) - истинно делаем прогу здесь!

}

Через скобку мы перешагнем, когда акселерометр обнаружит старт



_000500: // просто нумерация

}


else
{
В противном случае, ваполнять программу сдесь.


}



} // скобка закрывающая для функции Мэйн!
Это сообщение редактировалось 10.03.2004 в 20:41
RU termostat #10.03.2004 20:45
+
-
edit
 

termostat

аксакал

Кусок программы - в режиме записи:

if (recording_data) // recording_data - понятно связан с
_000200: { // положением переключателя перед
// включением питания


//Если значение "recording_data" не равно нулю, то выполняется
// программа расположеная сдесь. от _000200: до _000500:

У нас есть два режима записи - в кольцевой буфер и до конца памяти!

while(!start)
{

// Пока мы не зафиксировали старт - т.е. значение "start" = 0 или ложно,

// и соответственно (!start) - истинно делаем прогу здесь!


// Нам нужно делать измерения через равные промежутки времени, для их отсчета используем таймер МК.


подождем пока таймер насчитает очередное время измерения:

while(!go_get_data); // в этой строке просидим пока "go_get_data" не станет "1" - а "go_get_data" мы в начале программы определим флаг прерывания таймера МК. Знчит при отсчете интервала времени будет возникать прерывание таймера МК и мы сможем проскочить этот WHILE !!!





}

Через скобку мы перешагнем, когда акселерометр обнаружит старт



_000500: // просто нумерация

}
RU termostat #10.03.2004 20:51
+
-
edit
 

termostat

аксакал

Кусок программы - в режиме записи (до старта!):

if (recording_data) // recording_data - понятно связан с
_000200: { // положением переключателя перед
// включением питания


//Если значение "recording_data" не равно нулю, то выполняется
// программа расположеная сдесь. от _000200: до _000500:

У нас есть два режима записи - в кольцевой буфер и до конца памяти!

while(!start)
{

// Пока мы не зафиксировали старт - т.е. значение "start" = 0 или ложно,

// и соответственно (!start) - истинно делаем прогу здесь!


// Нам нужно делать измерения через равные промежутки времени, для их отсчета используем таймер МК.


подождем пока таймер насчитает очередное время измерения:

while(!go_get_data);

// здесь мы окажемся когда "go_get_data" станет "1" - значит пора мерить


get_pressure(); // вызываем функцию измерения давления


get_axeleration(); // вызываем функцию измерения ускорения


save_data_kolzo(); // сохранить данные в кольцевой буфер

send_data_rs232(); // отправить данные на ПК


}

Через скобку мы перешагнем, когда акселерометр обнаружит старт



_000500: // просто нумерация

}
RU termostat #10.03.2004 20:57
+
-
edit
 

termostat

аксакал

Кусок программы - в режиме записи - После старта

}

Через скобку мы перешагнем, когда акселерометр обнаружит старт

в функции get_axeleration() происходит сравнение ускорения с пороговым значением и как только оно будет превышено, мы преодолеваем скобку и выполняем запись с сохранением уже до конца памяти.

ЗАБЫЛ !!! здесь нужно воткнуть проверку что память не закончилась!

while (!memory_full)
{ // скобка 4567 - пока память не заполнена находимся
// между скобками 4567

опять ждем команды пора мерить!

while(!go_get_data);

// здесь мы окажемся когда "go_get_data" станет "1" - значит пора мерить








} // скобка 4567


_000500: // просто нумерация

}
Это сообщение редактировалось 10.03.2004 в 21:03
RU termostat #10.03.2004 21:07
+
-
edit
 

termostat

аксакал

Кусок программы - в режиме записи - После старта

}

Через скобку мы перешагнем, когда акселерометр обнаружит старт

в функции get_axeleration() происходит сравнение ускорения с пороговым значением и как только оно будет превышено, мы преодолеваем скобку и выполняем запись с сохранением уже до конца памяти.

ЗАБЫЛ !!! здесь нужно воткнуть проверку что память не закончилась!

while (!memory_full)
{ // скобка 4567 - пока память не заполнена находимся
// между скобками 4567

опять ждем команды пора мерить!

while(!go_get_data);

// здесь мы окажемся когда "go_get_data" станет "1" - значит пора мерить


// все функции как и до старта только сохранение обычное:


get_pressure(); // вызываем функцию измерения давления


get_axeleration(); // вызываем функцию измерения ускорения


save_data(); // сохранить данные НЕ в кольцевой буфер

send_data_rs232(); // отправить данные на ПК



} // скобка 4567


_000500: // просто нумерация

}
RU termostat #10.03.2004 21:09
+
-
edit
 

termostat

аксакал

Когда память закончится и "memory_full" станет "1" мы окажемяся за этой скобкой:

} // скобка 4567

// Пусть устройство мигает и пищит противно, стоб его найти можно было.



While(1) // бесконечный цикл !!! БЕЗ ;
{
blink_led(fast);

beep_protivno();
}




_000500: // просто нумерация

} // скобка закрывающая для куска проги с записью данных

RU termostat #10.03.2004 21:17
+
-
edit
 

termostat

аксакал

Теперь напишем кусок воспроизведения данных, он гораздо проще и будет расположен между скобок 5732 (ранее я не обозначил к сожалению)

было:

else
{ // щас обознчаю - скобка 5732

// здесь мы находимся при воспроизведении данных


} // скобка 5732




RU termostat #10.03.2004 21:20
+
-
edit
 

termostat

аксакал

программа воспроизведения данных расположена между скобок 5732
было:

else
{ // скобка 5732

while(memory_end) // делаем пока не дойдем до конца памятти
{

restore_data_byte();

send_byte_rs232();

}

// все память прочитана - просигналим об этом


blink_led(slow); // вызвали функцию мигания светодиодом и
// "сказали" мигать медленно!


} // скобка 5732
RU termostat #10.03.2004 21:25
+
-
edit
 

termostat

аксакал

Теперь можно пробежаться по программе и собрать все функции которые мы написали, перечислить их в списке прототипов.
RU termostat #10.03.2004 21:29
+
-
edit
 

termostat

аксакал

///////////////////////
// прототипы функций


init_device();

restore_data_byte();

send_byte_rs232();

blink_led(char);

beep_protivno();

get_pressure();

get_axeleration();


save_data_kolzo();

send_data_rs232();

perekluchit_led();

turn_off_led();



// вроде все собрал






Это сообщение редактировалось 10.03.2004 в 21:44
RU termostat #10.03.2004 21:32
+
-
edit
 

termostat

аксакал

Давайте поправим ошибку в алгоритме, после условия if на запуск записи нужно добавит задержку в 10 секунд и мигание орание для предохранения от случайного стирания
RU termostat #10.03.2004 21:34
+
-
edit
 

termostat

аксакал

Вот кусок программы - режим записи:

if (recording_data) // recording_data - понятно связан с
_000200: { // положением переключателя перед
// включением питания

Дадим 10 секунд одуматься:

char ctr=0; // объявили переменную для счета

while(ctr<50) // сделаем 50 раз
{
perekluchit_led(); // изменить состояние светодиода

delay_ms(200);

ctr++; // увеличим по просьбе Сергея счетчик


}

turn_off_led(); // выключить наверняка - такую функцию конечно заменим операциейнад соотв битом, когд будем знать куда подключен светодиод.


//Если значение "recording_data" не равно нулю, то выполняется
// программа расположеная сдесь. от _000200: до _000500:

У нас есть два режима записи - в кольцевой буфер и до конца памяти!

while(!start)
{

Пока мы не зафиксировали старт - т.е. значение "start" = 0 или ложно,
и соответственно (!start) - истинно делаем прогу здесь!

}

Через скобку мы перешагнем, когда акселерометр обнаружит старт



_000500: // просто нумерация

}

Это сообщение редактировалось 10.03.2004 в 21:53
RU termostat #10.03.2004 21:51
+
-
edit
 

termostat

аксакал

Будем заканчивать.

Программа структурно набросана.

Теперь нужно расписать "тело" каждой функции, объявить все переменные использованые в программе, вобщем осталось начать и закончить.

Нужна схема устройства.

Сегодняшнее занятие это первый блин - не знаю кому он как.

Выскажитесь если будет настроение, только не здесь!

Я буду рботать над программой. Постарайтесь тоже делать что-то, спрашивайте.
AD Реклама Google — средство выживания форумов :)
RU termostat #11.03.2004 12:05
+
-
edit
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru