LINUX.ORG.RU

Программа измерения импульса


0

1

/* Программа измерения и контроля длительности импульса */

#include <ADuC842.h> // Описание регистров МК ADuC842

#include <stdio.h> // Подключение стандартной библиотеки ввода- вывода

unsigned char mCountTik=0; // Счетчик числа переполнений Таймера 0

unsigned char mProv=0; // Счетчик числа проверок

unsigned long mDlitImp=0; // Переменная для записи длительности импульса

sbit RS=P3^5; // Вывод МК для связи с ЖКИ

sbit RW=P3^6; // Вывод МК для связи с ЖКИ

sbit E=P3^7; // Вывод МК для связи с ЖКИ

sbit BUZY_LCD=P1^7; // Вывод МК для связи с ЖКИ

unsigned char STATE_LCD; // Определение переменной состояния ЖКИ /* Определение функции задержки */

void delay (long i)

{

long a;

for (a=0;a<i;a++);

}

/* Определение функции готовности ЖКИ */

void wait_lcd (void)

{

do {

E=1;

RS=0;

RW=1;

P1=0xFF;

STATE_LCD=BUZY_LCD;

E=0;

} while (STATE_LCD!=0);

RW=0;

}

/* Определение функции очистки экрана */

void clear_lcd (void)

{

E=1;

RS=0;

RW=0;

P1=0x01;

E=0;

wait_lcd(); }

/* Определение функции записи символа на дисплей */

void write_char (unsigned char *c1)

{

E=1;

RS=1;

RW=0;

P1=*c1;

E=0;

wait_lcd();

}

/* Определение функции инициализации ЖКИ */

void init_lcd (void)

{

delay(1849);

E=1;

RS=0;

RW=0;

P1=0x30;

E=0;

delay (505)

E=1;

RS=0;

RW=0;

P1=0x30;

E=0;

delay (18);

E=1;

RS=0;

RW=0;

P1=0x30;

E=0;

wait_lcd();

E=1;

RS=0;

RW=0;

P1=0x3C;

E=0;

wait_lcd(); }

/* Программа вывода измеренного значения на ЖКИ */

void vivodDlitImp (void)

{

idata char buf[32]; // Массив для форматизированного вывода строки

char *pbuf=buf; // Указатель массива

int bytes, cnt; // Переменные для организации вывода строки символов

bytes=sprintf(buf,«%s»,«DlitImp=»); // Запись строки в массив

bytes+=sprint(buf+bytes,«%.4d»,mDlitImp); // Запись переменной в массив

for (cnt=0;cnt<bytes;cnt++); // Вывод строки символов на ЖКИ

write_char(pbuf++);

}

/* Программа прерывания по переполнению Таймера 0 */

void t0ISR (void) interrupt 1

{

TR0=0; // Остановка счета Таймера 0

TH0=0; // Обнуление старшего байта Таймера 0

TL0=0; // Обнуление младшего байта Таймера 0

TR0=1; // Запуск счета Таймера 0

mCountTik++; // Инкрементирование переменной mCountTik }

/* Главная программа */

void main (void)

{

TH0=0; // Обнуление старшего байта Таймера 0

TL0=0; // Обнуление младшего байта Таймера 0

TMOD=0x19; /Установка режима работы Таймера 0 (16 разрядный счет, бит GATE=1 – запуск таймера при наличии сигнала на выходе INT0 и TR=1)/

ET0=1; // Разрешение прерывания по переполнению Таймера 0

EA=1; // Разрешение всех прерываний

while (INT0); // Ожидание окончания импульса

init_lcd(); // Инициализация ЖКИ

clear_lcd(); // Очистка экрана

/* Измерение длительности импульса */

while (1) {

TR0=1; // Запуск Таймера 0

while (!INT0); // Ожидание начала импульса

while (INT0); // Ожидание окончания импульса

TR0=0; // Остановка Таймера 0

mDlitImp=((TH0<<8)|(TL0)|(mCountTik<<16)); /* Присвоение результата измерения переменной mDlitImp */

mDlitImp=mDlitImp/2097152; /* Преобразование кода в длительность импульса, путем деления на частоту работы тактового генератора (2097152 Гц), полученное значение измеряется в секундах*/

TH0=0; // Обнуление старшего байта Таймера 0

TL0=0; // Обнуление младшего байта Таймера 0

/* Сравнение полученного значения с допустимыми пределами */

if ((mDlitImp<20/1000)&&(mDlitImp>80/1000)) {

mProv++; // Инкрементирование переменной счета числа проверок

delay (12331); // Задержка 0.1 с

if (mProv=10) {

clear_lcd(); // Очистка экрана ЖКИ

vivodDlitImp(); // Вывод последнего измеренного значения

delay(308299); // Задержка 2.5 с.

mProv=0; // Обнуление переменной счета числа проверок

}

}

else {

mProv=0; // Обнуление переменной счета числа проверок

}

}



Последнее исправление: Lucky03 (всего исправлений: 1)

delay (12331); // Задержка 0.1 с Что представляет эта запись? Как получено значение в скобках? Приведите расчет.

Lucky03
() автор топика
Ответ на: комментарий от Rx0

Не мог добавить разметку, ошибка вылазила

Lucky03
() автор топика

Пойдёт, деплой на продакшен

DllMain
()

Программа измерения и контроля длительности импульса

Первая созданная тема: 10.05.20 11:08:58
Последняя созданная тема: 10.05.20 11:08:58
Первый комментарий: 10.05.20 11:09:54
Последний комментарий: 10.05.20 11:09:54
Число комментариев: 1

Всегда пожалуйста.

anonymous
()
  1. А в чем собственно проблема?
  2. Согласно даташиту у этого контролера 3 таймера и часы реального времени. К чему эти задержки через циклы? Статьи как пользоваться таймерами гуглятся.
Silerus ★★★★
()
Ответ на: комментарий от Silerus

Была задача создать программу измерения длительности импульса. Скинул преподавателю такую программу. Он скинул вопрос «delay (12331); // Задержка 0.1 с Что представляет эта запись? Как получено значение в скобках? Приведите расчет.» Я всяко разно пробовал провести расчет, откуда взялось данное значение, не смог, поэтому я тут. Думал сможет кто помочь, потому что в данной теме не разбираюсь

Lucky03
() автор топика
Ответ на: комментарий от Lucky03

Как получено значение в скобках?

void delay (long i)
{
   long a;
   for (a=0;a<i;a++);
}

Методом научного подгона разумеется.

anonymous
()

лучше просто двоичные счетчики использовать.

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от Lucky03

Как оно математически получается?

По ТТХ контроллера:

#include <ADuC842.h> // Описание регистров МК ADuC842
anonymous
()
Ответ на: комментарий от Lucky03

ну вот и считайте, содержимое функции на каждой итерации тратит где-то 2 такта машинного времени + времяна вход и выход из функции, умножьте входное число на 2 и разделите на тактовую частоту должно получится время задержки

Silerus ★★★★
()
Ответ на: комментарий от Silerus

Необходимо учесть, что один цикл занимает один период тактовой частоты. В нашем случае при частоте 2.097 МГц период тактовой частоты примерно равен 0.477 мкс. Следовательно, общее время выполнения основного цикла равно мкс. Для оценки общего времени задержки следует добавить время вспомогательных действий функции вне цикла tВ – для вызова функции с передачей параметра (команда ACALL; 3 цикла; 1.431мкс), инициализации локальных переменных ( мкс) и возврата ( мкс). Все равно не получается

Lucky03
() автор топика
Ответ на: комментарий от Lucky03

Не обязательно. Достаточно конкретный вопрос в начале темы, что именно ты хочешь от LOR, перед тем как высирать весь листинг.

seiken ★★★★★
()
Ответ на: комментарий от Lucky03

тебе анонимус уже ссылку на ответ кинул - тпм формула есть откуда твое число взялось

Silerus ★★★★
()
Ответ на: комментарий от anonymous

А вот и нет. Ты смешал тёплое с мягким: Программа измерения импульса (комментарий)

У него еще много вопросов будет …
Гуглить не хочет /беда/.

Кстати по приведенной ссылке используется похожая задача для такого же микроконтроллера как у ТС.

Гуглить не хочет /беда/.

Владимир

anonymous
()

в армии научат импульсы измерять

Harald ★★★★★
()
Ответ на: комментарий от anonymous

Изначально было понятно, что это программа для измерения длительности импульса, просто нужно откуда эти цифры функции задержки delay (12331), ответили про ТТХ, там ничего нет такого

Lucky03
() автор топика
Ответ на: комментарий от Lucky03

Вообще, можешь. Но не мне, т.к. я не твой преподаватель. Но может быть твой препод сидит тут на LOR и все видит. Вот ему можешь отправить. По-хорошему, конечно, надо твоему преподу сообщить, что ты воспользовался подсказкой зала, чтобы пару баллов тебе скинул или на пересдачу отправил, с новым заданием. А на западе, в нормальных вузах за читерство отчисляют, с запретом поступать опять по той же специальности.

seiken ★★★★★
()
Ответ на: комментарий от Harald

надо же, курсачи теперь не на КР580ВМ80 задают, прям прогресс в российском образовании

Ну хотя бы «слабал» с готового.

Владимир

anonymous
()
Ответ на: комментарий от seiken

Да он и так за это тройку ставит, не больше, мне просто узнать это и сдать. Если хочешь выше оценку, то надо лично разговаривать уже и отвечать на вопросы. Мне по моей специальности вообще это не нужно

Lucky03
() автор топика
Ответ на: комментарий от anonymous

Да уже на i8051 делали давно, со времен царя Бориса, если не раньше, и учебная литература под него написана.

seiken ★★★★★
()
Ответ на: комментарий от Lucky03

Да он и так за это тройку ставит

Вот поэтому все через жопу в стране.

Мне по моей специальности вообще это не нужно

Ну да, конечно, один умник решил, что ПДД дурацкие, другой корректирует учебную программу под себя :)

seiken ★★★★★
()
Ответ на: комментарий от Lucky03

ответили про ТТХ, там ничего нет такого

Как нет? long твой контроллер не умеет, ему 17 тактов нужно для работы с long-ом. См. по ссылке от Владимира, мать твою.

anonymous
()
Ответ на: комментарий от Lucky03

Была задача создать программу измерения длительности импульса. Скинул преподавателю такую программу.

Дай мыло препода, я уверен, что кто-нить и ттпика обязательно напишет ему и объяснит про 12331.

ya-betmen ★★★★★
()
Ответ на: комментарий от anonymous

У нас 20 циклов 170,477=8,109 31,431=4,293 Плюсуем и получается 12,402

Lucky03
() автор топика
Ответ на: комментарий от seiken

сдача лабы на LOR? А кто принимающий преподаватель?

анонимус же. вот ему оценку и поставим. анонимус сдал – анонимус принял. зачётище.

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

anonymous
()
for (cnt=0;cnt<bytes;cnt++); // Вывод строки символов на ЖКИ
write_char(pbuf++);

так и написано, пустой цикл в первой строчке? считается cnt и потом нигде не используется? или всё-таки write_char должно быть в теле цикла?

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.