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

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


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

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

  • Сообщения

    • У нас в России он вряд ли будет их продавать.
    • Почему такая уверенность, что именно первичку не мотают литцем? По остальному ответов достаточно накидали. Мон бы еще кучку добавить. Но, не вижу смысла из-за праздности интереса. Впрочем, пару накину. Шо было и для понтов. Хорошо еще что не монокристаллической медью намотали для ламповости светодиодного света.
    • Легко. Даже медными шинами мотают на маленьких трансформаторах с ферритовыми сердечниками. На производстве  выгибают их с помощью специальных приспособлений. 
    • В продаваемых им герберах также были грамм.ошибки в шелкографии? Если нет, то тогда Сухов прав насчёт контрафакта. Но, ИМХО, Николай довольно неплохо знает технический инглиш, чтобы написать слово "усилитель" с ошибкой.  Поэтому, опять-таки ИМХО, хочется увидеть платы, приобретенные непосредственно у автора, чтобы что-то говорить дальше. Конструкция и автор известные, шуму будет много. Для отделения мух от котлет нужна объективность.
    • @donec Ну, как бы ОЛЕД, дешовый, ожидаемо. Был бы более живучий, все бы выли на тему цены. А так, оставить разъем для дисплея и хранить пару в запас.
    • Вы так настойчиво повторяете свой пост, что видимо вам очень нужен ответ. *.splN - это расширение основных файлов - чертежей. Видимо "Templates" - это папка-хранилище заготовок для особо одарённых, чтобы вместо двух действий - выбора формата листа и выбора рамки, делать только одно - выбор уже готового листа с оформлением. Чтоб не ошиблись, что к чему подходит. Точнее ответить не могу, в моей версии sPlan такой папки нет.
    • 7377 так устроена. А вообще вот прямо неведомо на какой наш коллега вот прямо за неё уцепился,это да 
×
×
  • Создать...