Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Вт сен 13, 2011 11:54:57
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4583 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Цитата:
Language tool versions: mpasmwin.exe v5.34, mplink.exe v4.34, mcc18.exe v3.34
Не вижу ни в Ваших постах, ни в скрине подобной строки. У меня объявление как bit прокатывает на ура. Не знаю почему у Вас не работает. Может у Вас какой-нибудь там PRO
значение переменной - бит в общем, идет как бонус для этих компиляторов - и, скорее всего, потому что ими хайтек куплен, (в котором оно есть как бы изначально), для совместимости с ним делают примочки. Попробуйте подключить в проект файл GenericTypeDefs.h
Ребят, ну обьясните как работать с этим флоат float. читал файл который дали выше. но там же не сказано как это всё оформить програмно.
volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в прерывании, и не позволить компилятору попытаться выкинуть её при оптимизации кода. ---------- самое нормальное обьяснение.
Ребят, ну обьясните как работать с этим флоат float. читал файл который дали выше. но там же не сказано как это всё оформить програмно.
volatile - ставьте если нужно предотвратить возможность повреждения содержимого переменной в прерывании, и не позволить компилятору попытаться выкинуть её при оптимизации кода. ---------- самое нормальное обьяснение.
Давай заново подробно показывай что не получается, кто ж помнит всех подробностей Попутно анализируя свои действия и возможные причины проблем. Более чем в половине таких случаев решение само приходит в голову до того как успеешь до конца набить сообщение на форуме, ибо повторно разбираешься с проблемой не с места возникновения, а самого начала и по порядку.
Значит так. Хочу сделать тахометр. По сути своей это частотомер в котором результат умножается на 60. Тоесть оборотов в минуту. Планирую снимать сигнал с датчика коленвала. 1 оборот=1импульс. Я в своей програме меряю время между импульсами (между задними фронтами, мне кажется так удобней). При кварце в 20 мегагерц 1машинный цикл (Далее мц) выполняется за 200 наносекунд. Зная количество машинных циклов с момента падения сигнала до момента падения сигнала( так как прерывание по заднему фронту) и время 1 мц то можем расчитать частоту по формуле 1/Т ( где Т- периуд)( тоесть 200 умноженые на количество МЦ и переведённые в секунды). Далее унас выходит частота за секунду. Умножаем на 60 и получаем Количество оборотов за минуту. В програме так. Таймер1 считает количество МЦ между импульсами. При каждом переполнении таймера1 (Если время между циклами больше чем 65536) инкрементируется переменная tmr1temp и выходит из ПОП. Когда происходит прерывание, тоесть когда сигнал падает в ноль. Программа уходит в ПОП. Здесь я хотел сделать её как можно короче, то мы опускаем алаг прерывания int , обьединяем число с 2 половинок TMR1 в одну переменную и количество переполнений таймера в другую переменную. обнуляем переменную хранящюю количество переполнений ( мы их сохранили уже) и таймер1 обнуляем ( тоже сохранили обьединив 2 половинки тайймера) и выходим из прерывания. В основной программе мы считаем количество МЦ которые мы сохраняли. Тоесть количество переполнений умножим на 65536 и прибавим то что оттавалось в таймере до до момента обьединения их в одно число( так как я понимаю таймер работает когда мы в прерывании находимся). получили количество МЦ за периуд. Умножим это всё на 200наносекунд. Просто на 200 тупо множим, получается огромное число с точкой. Потом переводим это в секунды деля на МИЛЛИАРД. Потом единицу делим на то сто получилось и получаем частоту. Умножив на 60 получим частоту в минуту. Проблема в том что янезнаю как считать большие числа , умножать и делить их в програме и как например вывести число которое с точкой разбить на целые и вывисть на 7сег индикатор. как вывести я знаю а вот как разбить число с точкой нет. Тоесть как разбить число типа float. Там как я понял степени какието, множители , идентификаторы плюса или минуса. как такое число вывести на дисплей.
Заголовок сообщения: Re: Програмирование pic на СИ.
Добавлено: Вт сен 27, 2011 12:15:24
Модератор
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4583 Откуда: Планета Земля
Рейтинг сообщения:1 Медали: 1
Вам совсем не нужен тип float, можно обойтись числами без точки. Тактовая частота известна (20'000'000 Гц), период тоже (T). Теперь просто берём тактовую, умножаем её на 60 и делим на период. об/мин = 1'200'000'000 / T Проверяем. К примеру у нас 3000 об/мин. Это 50Гц. За 1 период(20 мс.), таймер отсчитает 400'000 тактов. Делим 1'200'000'000 на 400'000, получаем 3000. Что и требовалось доказать Всё до боли просто
Если, к примеру, нужно показывать по 10 об/мин, а не по 1 (что-бы в глазах не мельтишило), то тактовую надо умножить не на 60, а на 6. А конечный результат умножить на 10.
Вам совсем не нужен тип float, можно обойтись числами без точки. Тактовая частота известна (20'000'000 Гц), период тоже (T). Теперь просто берём тактовую, умножаем её на 60 и делим на период. об/мин = 1'200'000'000 / T Проверяем. К примеру у нас 3000 об/мин. Это 50Гц. За 1 период(20 мс.), таймер отсчитает 400'000 тактов. Делим 1'200'000'000 на 400'000, получаем 3000. Что и требовалось доказать Всё до боли просто
Если, к примеру, нужно показывать по 10 об/мин, а не по 1 (что-бы в глазах не мельтишило), то тактовую надо умножить не на 60, а на 6. А конечный результат умножить на 10.
Математика 5 класс
Класс. всё гениальное-просто. Это нужно сделать прерывание в 1сек и считать за секунду импульсы. Верно?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 34
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения