Перейти к содержанию

crazz

Рекомендуемые сообщения

16 бит это уже много, предделитель можно включать и получить по факту 24 бита. А есть ли у него предделитель? Только предделитель прочитать изначально нельзя, приходится высчитывать его косвенно методом досчета.  как-то так делал на 16F84 но у меня частотомер был с разрешением 100Гц поэтому никаких проблем как у вас...

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

у таймера предделитель 1:8

 

Да вопрос не столько в частотомере, сколько в совмещении частотомера и вольтметра.

Если с измерением частоты за 1сек можно мириться, то с измерением напряжения - хочется по быстрее.

А то будет тяжело настраивать. Любое вращение ручки - жди секунду :(

Изменено пользователем vksam
Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Для начала, зачем вы сбрасываете TMR1 в прерывании? Вы специально создаете ошибку счета? Таймер считает и после переполнения из значения 0xFFFF к значению 0x0000 . Необходимо лишь зафиксировать факт этого события инкрементом программного старшего байта. Вы это и делаете, но зачем то передергиваете аппаратную часть счетчика к нулю.

Второе. Есть прескалер таймера со значениями 1...2...4...8. И есть прескалер модуля ССР со значениями 1...4...16.

Прескалер TMR1 изменяет тик счета, а прескалер ССР увеличивает время счета, за счет деления числа событий.

Но нет никакой разницы между увеличением опорной частоты (уменьшением тика) и увеличением числа периодов счета измеряемого сигнала. 

Прикинем.

20 МГц - частота осциллятора дает нам 5 МГц системной частоты (Tcy=200 нс).

Без переполнения и прескалеров период может быть посчитан до 65535. То есть от 0 до 13 мс (минимальная входная частота примерно 76 Гц)

С прескалером таймера :2 - 38 Гц, с прескалером  :4 - 19 Гц, с прескалером  :8 - 9 Гц (все числа примерные)

Прикинем разрешение по частоте в верхней части значений таймера при предделителе  8:

65000 -> 65000*8*0,2us -> 9,615384...Hz

64999 -> 64999*8*0,2us -> 9,615532...Hz

Итого, шаг счета частоты в данной точке составляет  0,00015 Гц

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

Про АЦП.

Не очень понятна схемотехника измерения напряжения. Если это аналоговый детектор на ОУ, то просто запускаете циклическое преобразование АЦП с получением результата и перезапуском в прерывании от АЦП. Не забывайте, что неизбежен шум измерений, который легко устраняется суперсемплингом, то есть усреднением измеренных значений. Создаете кольцевой массив (массив с кольцевым заполнением) и каждое измерение пересчитываете его среднее значение. Например, массив из 16 значений даст Вам стабилизацию 4 шумящих разрядов при отсутствии операции деления (оно заменяется правым сдвигом на 4 разряда).

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

 

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ЗЫ. Не вздумайте применять float. Он тут совершенно не нужен и быстро приведет к недостатку памяти и времени. В таких проектах применяют целочисленные переменные с fix point и с выводом точки в определенной расчетом десятичной позиции.

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

ЗЗЫ. Так как у выбранного Вами контроллера ДВА модуля ССР, можно проводить параллельный захват при разных предделителях захвата.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Я не пробовал еще в железе. Дебажу в протеусе.

Так вот что меня смущает - событие таймера наступает раньше, чем FFF -> 0000

Это меня и смущает. :(

По даташыту по идее событие TMR1IF не должно возникать раньше времени даже при учете использования CCP

Ссылка на комментарий
Поделиться на другие сайты

У Вас разрешено прерывание по CCP, а обработчик CCP не написан и сделано ожидание флага в основном цикле. Поэтому вход в прерывание происходит от CCP, а попадает в обработчик TMR1, где Вы благополучно TMR1 зачем то сбрасываете...

Кроме того, Вы в инициализации к чему то принудительно устанавливаете флаг CCPIF вместо его сброса. Cброс флага TMR1 не делаете вообще, значит, скорее всего, сразу после разрешения глобальных прерываний программа влетит в обработчик, ибо флаг взводится независимо от разрешения прерываний по любому переполнению счетчика. Совершенно непонятно зачем Вы сбрасываете регистр захвата CCPR1. Этот регистр в режиме захвата пишется из таймера, а читается после события захвата (по флагу CCPIF), зато сам TMR1 в инициализации не сбрасываете вообще (это необязательно в существующей задаче, но хоть логично для общего порядка).

В общем написана какая то каша....

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

есть вопрос  : каким битом вперед передаются команды и данные в ds18b20

и каким битом вперед идет ответ от датчика и какой байт передается первым

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, IMXO сказал:

есть вопрос  : каким битом вперед

Цитата

All data and commands are transmitted least significant bit first over the 1-wire bus.

 

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

Это хорошо. даже если английский недостаточно хорошо знаешь и сомневаешься в переводе "least significant bit" то для этого есть осциллограммы и на них написано где какой бит и можно легко понять каким битом идёт вперёд.

Кстати, википедия.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

В 21.01.2018 в 06:19, my504 сказал:

У Вас разрешено прерывание по CCP, а обработчик CCP не написан и сделано ожидание флага в основном цикле. Поэтому вход в прерывание происходит от CCP, а попадает в обработчик TMR1, где Вы благополучно TMR1 зачем то сбрасываете...

Либо я чего-то не понимаю, либо одно из двух.

Разрешение прерывания не подразумевает его обработку в процедуре прерываний. Поймать прерывание и сбросить флаг можно в любом месте программы. И я это делаю в основном цикле.

Тот факт, что в обработчике у меня только таймер - это не значит, что этот обработчик будет выполняться "вместо CCP". Следуя вашей логике надо обрабатывать все возможные прерывания и в строго определенном порядке. Иначе программы работать не будет.

В моем случае что-то взводит флаг TMR1IF_bit. И мне кажется, что это делает CCP

Ссылка на комментарий
Поделиться на другие сайты

13 minutes ago, vksam said:

Поймать прерывание и сбросить флаг можно в любом месте программы

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

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, vksam сказал:

Либо я чего-то не понимаю, либо одно из двух.

Разрешение прерывания не подразумевает его обработку в процедуре прерываний. Поймать прерывание и сбросить флаг можно в любом месте программы. И я это делаю в основном цикле.

Тот факт, что в обработчике у меня только таймер - это не значит, что этот обработчик будет выполняться "вместо CCP". Следуя вашей логике надо обрабатывать все возможные прерывания и в строго определенном порядке. Иначе программы работать не будет.

В моем случае что-то взводит флаг TMR1IF_bit. И мне кажется, что это делает CCP

1. Вы вообще ничего не понимаете в механизме работы флагов и прерываний.

2. Разрешение прерываний ПО КОНКРЕТНОМУ ИСТОЧНИКУ означает, что как только будет поднят флаг события прерывания ЭТОГО ИСТОЧНИКА, программа прервет исполнение и перейдет по вектору прерываний, сиречь в обработчик. Разрешение прерываний по ССРх определяется  состоянием бита CCPxIE, а вход в прерывание по ЭТОМУ СОБЫТИЮ будет произведен сразу, как только ФЛАГ ТРЕБОВАНИЯ  CCPxIF будет установлен в единицу. Установит его в единицу либо МОДУЛЬ ССРх, либо это можно сделать принудительно в программе. Флагу и контроллеру прерываний в МК на это наплевать.

3. Обрабатываться должны только те прерывания, которые разрешены. Все возможные прерывания обрабатывать нет необходимости. Из-за того, что в этой архитектуре общий вектор для всех источников,  ЖЕЛАТЕЛЬНО в семафоре обработчика проверять не только флаг, но и разрешение: (CCPxIF&&CCPxIE). Иначе возможен ложный вход в чужой обработчик, если этот чужой источник прерываний временно запрещен, но флаг взводит (это когда события этого источника нельзя остановить, например TMR0, который не имеет останова).

4. Порядок обработки прерываний почти никогда не имеет значения. Даже если два флага от разных источников будут взведены одновременно и оба эти прерывания разрешены, выполнится обработка первого по ходу семафора, его флаг будет сброшен и по выходу из обработчика, оно немедленно будет вызвано снова по не сброшенному флагу второго источника.

5. В Вашем случае НИЧЕГО НЕ КАЖЕТСЯ. Модуль не может взводить чужой флаг. Он взводит СВОЙ. И если его разрешение установлено, программа уйдет в обработчик ПО ЕГО СОБЫТИЮ. А Ваша задача состоит в том, чтобы в семафоре обработчика определить источник опросом и уйти на правильную ветку обработчика.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

Здарова, ребят. Кто может немножко помочь разобраться с записью числа в ПЗУ (PIC)?

Что я хочу сделать: 

Результат преобразования АЦП (ADRESH именно) запихнуть в ПЗУ. Нашел пример работы с памятью:

Скрытый текст

unsigned char ee_read(unsigned char address)

{

.while(WR) continue;     //  пока идёт цикл записи, читать из EEPROM нельзя!

EEADR=address;          //  адрес

SetBit(EECON1,0);       //  разрешаем чтение

return EEDATA;

}

void ee_write(unsigned char a ddress, unsigned char data)

{

while(WR) continue;     //  ожидаем пока завершится предыдущий цикл записи

EEADR=address;          //  адрес

EEDATA=data;            //  данные

SetBit(EECON1,2);       //  разрешаем запись в EEPROM

CARRY=0;                //  используем регистр для запоминания наличия прерываний

if(GIE) CARRY=1;        //  запоминаем, если были приревания

GIE=0;                  //  запрет приреваний

EECON2=0x55;            //  обязательная последовательность

EECON2=0xAA;

SetBit(EECON1,1);       //  запуск цикла записи

ClrBit(EECON1,2);       //  сбрасываем WREN

if(CARRY) GIE=1;        // разрешаем прерываня, если нужно

}

Вопросы такие:

1. Обязательно ли использовать тут прерывания? Можно же без них? В чем разница будет?

2. В моем МК есть след. биты: 

Скрытый текст

dhshG3awpQY.jpg

Первые 3 бита (не считая "пустого") - нужно в самом начале выставлять?

3. В функцию записи/чтения я должен передать адрес. А как мне можно вообще узнать, в какой адрес можно записывать, а в какой - нельзя? 

Скрытый текст

3ahIjux7rNk.jpg

P.S. Я никогда до этого не работал нигде с памятью. 

Изменено пользователем Tulen

Flashback!

Ссылка на комментарий
Поделиться на другие сайты

1 hour ago, Tulen said:

Обязательно ли использовать тут прерывания?

прерывания тут не используются. Процесс записи просто занимает некоторое время и должен проходить в режиме запрета прерываний. Остальное просто запоминалки для корректной отработки запрета. Чтобы случайно не разрешить их если они были отключены до входа в процедуру записи. Люди бывает забывают про такой момент

1 hour ago, Tulen said:

А как мне можно вообще узнать, в какой адрес можно записывать, а в какой - нельзя?

ну мануал же у вас перед глазами. Открываем раздел еепром и читаем внимательно. Там все подробненько расписано и о порядке записи и о пространстве адресов. Или нам за вас почитать? (просто по памяти могу сказать что там свое пространство адресов и начинается оно с простого 0х00 и длится до 0хFF, зависит от контроллера)

Память программ к еепром никакого отношения не имеет вообще.

Код у вас на листинге совершенно правильный и закомментирован верно. Добавлять и убирать ничего не надо. Разберитесь с адресами и вперед. Там все проще простого

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

11 час назад, mail_robot сказал:

Процесс записи просто занимает некоторое время и должен проходить в режиме запрета прерываний.

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

movlw 55h
movwf EECON2
movlw AAh
movwf EECON2
bsf EECON1,WR

если не будет выполнена данная последовательность, записи в ЕЕПРОМ не будет.

запись ЕЕПРОМ длится около 18-20мс и ее завершение можно регистрировать флагом прерывания.

12 часа назад, mail_robot сказал:

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

смелое заявление не видя листинга ассемблера   

 

13 часа назад, Tulen сказал:

разобраться с записью числа в ПЗУ (PIC)

ТС функции чтение/записи ЕЕПРОМ являются стандартными функциями компилятора, открывайте мануал на компилятор , читайте и не изобретайте велосипед.

13 часа назад, Tulen сказал:

2. В моем МК есть след. биты: 

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

Ссылка на комментарий
Поделиться на другие сайты

@IMXO Слушай, дружище, ты вообще в норме? Ничего не болит?

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

странная реакция для человека, которому пофиг что о нем говорят и думают в интернете. 

Скорее это чумовая закомплексованность... 

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

странная реакция на мою реакцию... видимо тоже какие то комплексы

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

22 hours ago, mail_robot said:

Процесс записи просто занимает некоторое время и должен проходить в режиме запрета прерываний

 

10 hours ago, IMXO said:

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

пять команд не занимают "некоторое время"?

вы любители поумничать на ровном месте такие все странные. Наводит на всякие мысли типа - головка вава

10 hours ago, IMXO said:

смелое заявление не видя листинга ассемблера 

для чего мне листинг ассемблера, если приведен текст программы на Си? Человек же не приводит листинг на Си. И ответа ждет на понятном языке. Нет, надо возвыситься, выпятив грудь показать всем что ты мастер, а все остальные говно и плавают в говне. Завышение ЧСВ? Ну конечно нееееет! )

10 hours ago, IMXO said:

функции чтение/записи ЕЕПРОМ являются стандартными функциями компилятора

рантайм чтоли? Его то именно рантайм интересует. Можно было еще сказать так тогда - это является стандартной функцией программатора! Читайте доку на прошивалку. (при этом изображая сверхумную надменную заточку)

Вот это реально чушь

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Процессу записи глубоко наплевать на прерывания, поскольку этот процесс происходит при ОСТАНОВЛЕННОМ ЯДРЕ.

На прерывания не наплевать процессу разблокировки.

Именно это Вам сказали.

Что касается АСМа, то никто не предлагал писать на АСМ. Стандартная процедура записи на АСМ приведена в даташите, поэтому предлагалось ПРОВЕРИТЬ скомпилированный код на соответствие этой процедуре, либо использовать библиотечные макросы/функции.

ЗЫ. Проблема, любезный, даже не в существе того, что Вы пишите (правильно-неправильно  -  не имеет значения), а в Вашей болезненной реакции на возражения.

Это и есть проявление комплексов и сильной психологической зависимости от МНЕНИЯ читателей.

Такшта вешать мне лапшу про Ваше безразличие не нужно.

戦う前に相手のベルトの色に注目

Ссылка на комментарий
Поделиться на другие сайты

3 часа назад, mail_robot сказал:

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

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

1. разницу между "инициализация записи" и "процесс записи" понимаешь? 

2. ты что ясновидящий или писал компилятор для ТС? откуда ты знаешь во что разворачивается :

SetBit(EECON1,1);       //  запуск цикла записи

это как минимум два  , а то четыре варианта в зависимости от оптимизации и от того как написана эта функция. для ТС приемлем только один вариант:

bsf EECON1,WR

во всех других случаях записи не будет.

если бы в коде как положено было

WR=1;  вопросов бы небыло

Ссылка на комментарий
Поделиться на другие сайты

Т.е. я правильно понял, что в этом коде, в самом начале мне нужно написать:

EEPGD = 0; (как в функции для чтения, так в функции и для записи)

Исходя из этой картинки, я правильно понял, что память, доступная для записи/чтения, начинается с 060h?

Скрытый текст

FPaHvFrGkOg.jpg

И ещё, я правильно понял, что для записи, скажем, полученного преобразований с АЦП, мне нужно передать в функцию чтения адрес и информацию. Адрес начальный я так и пишу - 060h, а data - ADRESH (я беру 1е 8 бит с АЦП)?

Если я захочу сохранить 2 преорбазования ацп, то я должен увеличить адрес на единичку?

Тапками не бить!

Flashback!

Ссылка на комментарий
Поделиться на другие сайты

вот как выглядит правильно код
 

Скрытый текст

 


ee_write(unsigned int addr, unsigned char value)			
{						
		while(WR)continue;			
//		EEADRH=(addr>>8)&0xFF;  // раскоментировать для EEPROM>256байт
        EEADR=(addr)&0xFF; 
		EEDATA=(value);	
		EECON1&=0x3F;		
		CARRY=0;
        if(GIE)CARRY=1;
        GIE=0;		
		WREN=1;
        EECON2=0x55;
        EECON2=0xAA;
        WR=1;	
		EEIF=0;
        WREN=0;			
		if(CARRY)GIE=1;		
}
unsigned char
ee_read(unsigned int addr)
{
//	 EEADRH=((addr)>>8)&0xFF; // раскоментировать для EEPROM>256байт
     EEADR=(addr)&0xFF;
	 EECON1&=0x3F;     
	 CARRY=0;
     if(GIE) CARRY=1;
     GIE=0;
     RD=1;
	 EEADR=EEDATA;
	 if(CARRY)GIE=1;	
	 return EEADR;
}

 

 

 

 

1 час назад, Tulen сказал:

начинается с 060h?

? нет не верно,на картинко карта распределения ОЗУ МК, не понятно какой контроллер вы пользуете, для EEPROM 256 байт адреса: 0х00-:-0xFF, для 1024 байт : 0x00-:-0x3ff

? с остальным все верно.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...