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

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


AS7ti6K

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

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

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

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

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

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

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

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

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

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

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

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

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

Реклама: АО КОМПЭЛ, ИНН: 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

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

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

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 пользователей онлайн

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

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