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

Съезд Периода Сигнала На 0.02 Секунды ( Pic18F4550 )


vv7

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

Привет ! Рад видеть, говоря, конечно, фигурально.

Вообщем, код:

int msecst, secs, started, startcount;
void AddSecond() {
 secs++;
}
void Interrupt(){
if (TMR0IF_bit){

TMR0IF_bit = 0;
// TMR0H = 0x0B; // 1s
// TMR0L = 0xDC; // 1s
TMR0L = 0x06;
if ( started == 1) {
msecst++;
msecs++;
if ( msecst == 1000 ) {
LATB.RB6 = ~PORTB.RB6; // Меняем 0/1 на светодиоде каждую секунду.
 msecst = 0;
 AddSecond();
}
}
}
}
void InitTimer0(){ // Ставим 0 таймер
// T0CON = 0x83; // 1s
// TMR0H = 0x0B; // 1s
// TMR0L = 0xDC; // 1s
T0CON = 0xC1; // 1ms
TMR0L = 0x06; // 1ms
GIE_bit = 1;
TMR0IE_bit = 1;
}
void main() {
TRISB = 0x00;
LATB = 0x00000000;
ADCON0 = 0xFF;
ADCON1 = 0xFF;
CMCON |= 7;
msecs = 0;
msecst = 0;
secs = 0;
started =0;
delay_ms(500); // Проверка светодиодов
LATB.RB6 = 1;
LATB.RB5 = 0;
LATB.RB4 = 1;
Sound_Init(&PORTB, 5);
Sound_Play(100, 100); // Сигнал о нормальном запуске мк
Sound_Play(1000, 100);
// Timer
InitTimer0();
startcount = EEPROM_Read(0x00); // Так, просто считаем количество запусков мк
delay_ms(250);
EEPROM_Write(0x00,startcount+1);
// Timer
while (1) {
if ( started == 0 ) { started = 1; } // Прошёл запуск
}
}

Вот ... проблема в том, что в результате мк считает секунду с погрешностью в 0.01 с !!

К МК подключен кварц на 4 МГц, а также кондёры по 22пФ

Как исправить данное чудо !?

Картина с осциллографа в Атаче.

post-195350-0-56602800-1447607821_thumb.jpg

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

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

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

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

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

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

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

Alex да у него грабли старые как мир....

неправильно настроен/переустанавливается таймер...

1мкс*4*250=1000мкс + 8-10мкс до переустановки таймера (сохранение контента прерывания, проверка и сброс флага) итого

1,01мс * 1000 = 1,01с....

ЗЫ непонятна только логика использования таймера в режиме 8бит

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

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

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

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

Чтоб работал, как часы.

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

а так TMR0L = TMR0L + 0x06;

А можно поподробней ? То есть добавить в Interrupt ?

Ага, ясно.

Ну значит юзайте 2-ой таймер, он сам переустанавливается, аппаратно.

void InitTimer(){
 T2CON  = 0x04;
 TMR2IE_bit  = 1;
 PR2   = 249;
 INTCON  = 0xC0;
}

void Interrupt(){
 if (TMR2IF_bit){
   TMR2IF_bit = 0;
   // Тут код.
 }
}
void main () {
InitTimer();
}
Таким образом ? Будет примерно 1 сек ? Я правильно понимаю ?

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

Если есть в нём TMR2, то он Вас спасёт.

а он ему зачем? TMR0 переключить на 16бит и предделитель поставить 1:1 и скорректировать таймер...

чего еще подробней? таймер до момента переустановки от момента переполнения насчитает тики вот на эти тики и будет скорректирован

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

Чтоб работал, как часы.

Если есть в нём TMR2, то он Вас спасёт.

а он ему зачем? TMR0 переключить на 16бит и предделитель поставить 1:1 и скорректировать таймер...

Аххха ... ну да .. спасибо ?

Просто настроение - хорошее. Простите за ...

Ладно ... серъёзно.

Предделитель ставить в конфиге ?

Типа: No prescale = 0 ?

У меня MicroC ... а как переставить таймер на 16 ?

Я никогда не работал с PIC - в полную меру ... вот и набираюсь минимума ...

Читать, читал, но примеров нигде и нет.

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

а он ему зачем?
Чтобы не выё... с подгонкой значений. 2-ой таймер сам переустанавливается автоматом и вызывает прерывание. Тем самым, нам пофиг на время входа в обработчик.

Таким образом ? Будет примерно 1 сек ? Я правильно понимаю ?
Да, верно. Будет 1 миллисекунда.

ЗЫ : Юзать 0-вой таймер для подобных задач - ананизм.

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

У меня MicroC ... а как переставить таймер на 16 ?

поставить хайтек или ХС8 религия не позволяет?.... ну ты же предделитель как-то же выставил???? вот там же и битность выставляется...
Ссылка на комментарий
Поделиться на другие сайты

Предделитель = 4, период = 249 (250 тиков будет) - и будет Вам ровно 1 мс.

Естественно, точность будет зависить от точности тактового генератора.

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

Юзать 0-вой таймер для подобных задач - ананизм.

и юзать 2-ой и попутно зарезать с десяток полезных плюшек(модулей) где пользуют второй как назовем?
Ссылка на комментарий
Поделиться на другие сайты

Ясно, что правильней былобы сидеть над этой задачей ! Я полностью с вами солидарен ! И я буду !!! Но сейчас мне надо решить было данную задачу, как можно быстрей.

Появиться чуть больше времени - обязательно почитаю на данную тему ! Всем плюсы.

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

и юзать 2-ой и попутно зарезать с десяток полезных плюшек(модулей) где пользуют второй как назовем?

как раз таки, плюшка этого таймера в том, что у него есть свой компаратор для сброса таймера. Этот таймер конкретно предназначен для создания периодичных временных отсчётов.

А что этим можно зарезать - хз... Если речь идёт о PWM, то он спокойно может работать, а таймер вызывать периодичные прерывания.

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

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

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

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

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

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

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

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

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

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

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