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

Расчет Времени Цикла


AS7ti6K

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

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

Считаете, что так будет правильнее мне переделать?

Или в моем случае это не критично? Работает же :)

Не, я конечно переделаю как положено.... однозначно. Я не ленивый в таких случаях)

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

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

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

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

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

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

Что-то не пойму, что ему не нравится

volatile unsigned int Timer1;

void interrupt isr(void) {
if(TMR1IF){
TMR1IF = 0;
TMR1 += 64537;
if(Timer1) Timer1--; // Если таймер запущен уменьшаем его счётчик на единицу.
}
}

unsigned int Get_Timer (unsigned int * p_tmr){
unsigned int ret;
GIE=0;
ret = *p_tmr;
GIE=1;
return ret;
}
//*******************************************************//

//*******************************************************//

void main() {
CMCON = 0x07;
PORTA = 0;
PORTC = 0;
TRISA = 0b00000001;
TRISC = 0b00000000;

TMR1ON = 1;
TMR1IF = 0;
TMR1 = 64535; // Таймер на 1000 циклов 65535-1000
TMR1IE = 1;

PEIE = 1;
GIE = 1;

while(1) {
Timer1 = 1000;
while (Get_Timer(&Timer1))
if (PORTAbits.RA0) {
Timer1 = 0;
break;
}
PORTCbits.RC5 = !PORTCbits.RC5;
while (PORTAbits.RA0);
}
}

newmain.c:54: warning: illegal conversion between pointer types

pointer to volatile unsigned int -> pointer to unsigned int

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

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

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

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

Ругается на несовпадение типов. Но это не ошибка.

unsigned int Get_Timer (volatile unsigned int * p_tmr){
unsigned int ret;
GIE=0;
ret = *p_tmr;
GIE=1;
return ret;
}

или

while (Get_Timer((unsigned int*)&Timer1))

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

Не ошибка, я знаю, но считаю, что это не правильно :)

Лучше перестраховаться, если есть сомнения.

Работает же :)
Я уже говорил об этих глюках и их последствиях, думайте сами :)

И это тоже имеет место тут :)

Вроде решилось так:

unsigned int Get_Timer (volatile unsigned int * p_tmr){

Ой, только заметил, что Вы мне уже решение и предложили.... :)

Исправил, все работает, но...

Но все таки данная программа, листинг ее чуть выше почти весь, считает не точно.... если выставить на 10 сек. то считает где-то примерно по 12-13 сек.

Что это может быть? Не верные расчеты....? погрешности протеуса?

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

А чем меряете ? Возможно, протеус по времени отстаёт от реальности, в простонародье - тормозит. Это у него слабость.

Внизу у него тикает время его хода, ориентируйтесь по нему, а не по своему времени.

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

Внизу у него тикает время его хода, ориентируйтесь по нему, а не по своему времени.

Ок, сейчас гляну.... а я по часам системным смотрел...

Ё-моё... По его часам чётко :) Спасибо! Вот ведь, кто бы мог подумать, что протеус по своим часам живет :)

Alex, ну так что по поводу подсмотреть мой первый проект, когда я его доделаю?

Не, я не настаиваю, если нет, так нет. Ничего в этом плохого не вижу. :)

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

Я так понимаю, что TMR1 он тикает и тикает всегда, а вот наша переменная Timer1 которая от него зависит, может либо "вкл" либо "выкл"....

Так вот мне тут оказывается все таки понадобился еще один таймер.... Точнее не таймер а просто отсчет "куска времени".

Я что подумал, так это же можно так же реализовать и в том же самом TMR1 просто туда добавить еще одну переменную типа Timer1_2 ну или вообще им имена осмысленные дать.... Просто я изначально думал, что Timer1 как-то намертво привязывается к TMR1 т.е. наоборот TMR1 к Timer1... Но это же не так..

Я верно мыслю? Может быть даже и Блинки можно на этот же таймер повесить... Или лучше не надо...

Просто удобно, что TMR1 тикает 1 мс. (не, я понимаю, что это мы его так настроили и можно и другие так сделать) :)

.... и проект не будет огромным :)

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

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

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

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

В общем я в обработку прерывания TMR1 добавил еще одну переменную..... вроде работает.

А читаю их(теперь их там две) функцией Get_Timer... Удобно)

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

Вау, так вот это супер вообще :):dance2:

Но я уже сам проверил :yes:

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

А читаю их(теперь их там две) функцией Get_Timer... Удобно)
Ну да, их можно одной функцией читать :)

Эх, добрый я сегодня - такие лекции бесплатно провожу :D Ладно, ограничимся "Спасибами" под моими постами :)

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

Эт да... я сегодня столько инфы получил.... Мозг чуть не взорвался :)

Сижу небольшой рефакторинг основного проекта делаю...

Alex, буду должен :)

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

проверить младший бит - он укажет на чётность :)

Вот с битами у меня проблема :(

Стыдно уже спрашивать как его проверить...

Нашел что-то типа

int a;
a = ...;
if ( a & 1 )
{
// нечетное
}
else
{
// четное
}

неужели так просто?

т.е. можно вот такую штуку сделать. Это правильно будет?

bool Odd (unsigned int X)
{
return (X & 1)
}

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

Да, всё так просто :)

Только нужно наоборот - если бит установлен, то значение нечётное.

return !(X & 1);

Можно в макрос это всё дело уложить:

#define Odd(x) !((x)&1)

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

Скажите пожалуйста влияют ли

биты:

PS0 = 1;

PS1 = 0;

PS2 = 0;

в OPTION_REG

на TMR1?

Я установил предделитель перед TMR0 в 1:4 - я так понял в таком режиме он тикает ~1 мс

Так вот TMR1 стал тормозить почти в двое... (частота МК 4 мгц)

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

Странно... а из-за чего тормозить стал?

Если PS0 = 0; снова сделать, TMR1 нормально тикать начинает...

Вот инициализация:

void InitApp(void)
{
CMCON = 0x07;
PORTA = 0;
PORTC = 0;
TRISA = 0b00001111;
TRISC = 0b00000000;

// Нужно для работы таймера TMR0------------
//OPTION_REG=0b00101000;
T0CS = 0;
PSA = 0;
PS0 = 0;
//PS0 = 1; <<< так тормозит TMR1
PS1 = 0;
PS2 = 0;

// Настройка прерываний
//INTCON = 0b10100000;
INTCON = 0;
INTE = 1; // Включаем прерывание RA2/INT
T0IE = 1; // Включаем прерывание TMR0
TMR1IE = 1; // Включаем прерывание TMR1
GIE = 1; // Разрешаем прерывания

TMR1 = 64535; // Таймер на 1000 циклов 65535-1000
TMR1CS = 0; //
TMR1IF = 0; // Сбрасываем флаг TMR1
TMR1ON = 1; // Включаем TMR1
}

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

Вот обработчик прерываний:

void interrupt isr(void) {
 if (INTF) INTF = 0;			   //Обработали прерывание INT
 if(T0IF) {
   T0IF=0;						 //Обработали прерывание TMR0
   //TmfGetingStateButton();
 }
 if(TMR1IF){
   TMR1IF = 0;					 //Обработали прерывание TMR1
   TMR1 += 64537;				  // 1000 тиков - 1 мс
   if(TmvTmr1) TmvTmr1--;
   //if (Pi_IS && Tmv_DelayStart) Tmv_DelayStart--;
   //if (TmvLED) TmfBlinkLED();
 }
}

С закомментированными строками так же тормозит

Возможно, один другому мешает.

Хм... каким образом они друг другу могут мешать, но если PS0 выставть в 0;

и

PS1 = 0;

PS2 = 0;

начинает работать нормально.... ничего не понимаю

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

PEIE=1; забыли :) Таймер №1 является периферийным модулем.

У Вас, просто напросто, от него прерывания не выполняются. А в isr программа заходит только по 0-вому таймеру. По этому, от него и зависит период попадания программы на if(TMR1IF){ :)

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

Т.е. последовательность должна быть примерно такой:

TMR1=-1000;
TMR1ON=1;
TMR1IF=0;
TMR1IE=1;

......

PEIE=GIE=1;

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Благодарю всех, поделившихся замечаниями и предложениями! Отдельная благодарность z_vip за предложения, которыми я воспользовался и Starichok за принципиальную схему активной нагрузки. Результаты теста на разрушение Активной Нагрузки (далее АН) с транзисторами AP60T03 (30V 45A). В процессе пайки ПП для внесения изменений, закоротил С10. В работе остались два канала - два транзистора. Эти транзисторы и вышли из строя (омметр показывает 120-140 Ом между любыми выводами в любом направлении). Причина выхода из строя - кратковременное превышение предельного напряжения и тока из-за плохого контакта (искрение) при подключении БП при уставке тока больше 0. Два китайских резистора 0,33Ом 1вт, включенные последовательно с этими транзисторами, так же вышли из строя. Но ОЧЕНЬ оригинально - стали показывать изоляцию, НО внешних повреждений не видно. Выводы. Для снижения рисков пробоя силовых транзисторов: 1) (сделано) Максимально уменьшить индуктивность между БП и АН, в том числе убрать дроссель на входе АН (как вариант, можно включить обратный диод параллельно входному дросселю, но токи самоиндукции могут быть большими); 2) (не сделано) Как рекомендовал z_vip, последовательно с конденсаторами Сток-Исток включить резисторы 10-100Ом и входной быстродействующий предохранитель на максимальный ток АН +(3..4А); 3) Установить транзисторы с рабочим напряжением, раз в 5-10 превышающем напряжение нагружаемых БП; 4) Если требуется подключение "на горячую", то в цепь включения установить быстродействующий надёжный выключатель (автомат, реле, тумблер) с запасом по току от 2-3 крат. Восстановление АН. Установил б.у. транзисторы IRFR3411 (100V 32A), устранил короткое C10, установил советские резисторы 0,33Ом 5Вт, удалил дроссель на входе и конденсатор после дросселя, удалил диодный мостик перед стабилизатором, т.к. питание от нестабилизированного БП АС220/DC16В 0,8А. Установил в корпус DC/DC для питания вентилятора. Добавил в схему переключатель на съёмной перемычке, позволяющий подать на вход компаратора 12В служебного - может понадобиться для отладки. Добавил в схему оптопару для вкл/выкл АН внешним ТТЛ сигналом - для исследования переходных процессов испытуемых БП. Тест на разрушение проводить не буду - вроде бы всё понятно. Проверка. Как и говорил z_vip, диод MBR2045 сильно греется. Установленный на медную пластину 30*50*0,8 длительно держит 4А при ~40гр.Ц. При 6А нагревается градусов до ~60. С включенным вентилятором АН длительно держит 60Вт (12В 5А) при температуре радиатора в районе до 40гр.Ц. (приятно тёплый). ZIP-файл - схема и печатка в формате DipTrace, схема в PDF. Фото и осциллограммы.    
    • Я с алика беру сгшки и смд и дип уже давно. Полëт нормальный, но есть нюанс, что у некоторых микрух нет UVLO. Но я нашел способ, как это обходить
    • Поменял в усилителе резисторы на тонкопленочные smd 1206 производства Yageo. Померил их перед установкой - удивительная точность у них оказалась, отклонение от номинала не более 0.1%. Звук на слух не поменялся но фоновый шум усилителя стал практически неслышим даже в очень чувствительных наушниках. Так что есть смысл сразу ставить тонкопленочные резисторы.
    • После делителя поставьте повторитель на ОУ с высоким входным сопротивлением. Тогда и не будет влияния измерителя на делитель. https://forum.cxem.net/index.php?/blogs/entry/317-точный-делитель-из-неточных-резисторов-и-грабли-при-применении-резистивных-делителей/ Читаете вторую часть - "Грабли..."
    • С чего это ему кранты? Правда при первом включении щелчок все же был. Но после включался и выключался вообще тихо. Думаю надо прозванивать дальше плату по питанию, возможно еще что то крякнуло вслед за 4409.
    • Templates это шаблоны.
    • Такой как входной подойдет?
×
×
  • Создать...