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

Pic18 Как Рассчитать Время Для Таймера На C18 Компиляторе Mplabx


vv7

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

Получается: 14+1001+1 ( PORTCbits.RC5 =!PORTCbits.RC5; ) = 1016 ?

Но число, которое у меня сейчас стоит:

Что равно: 65535 - 63036 = 2499

То есть я должен вместо 63036 поставить 64519 ? Что равно FC07 ?

вы все напутали....

1маш.цикл=0,4мкс

2500маш.цикл=1мкс

у вас задержка от входа в прерывание до установки счетчика составляет 14маш.цикл

те таймер должен отсчитать 2500-14 = 2486

предустановка таймера 65536-2486 = 63050(10) или 0xF64A

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

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

Вот, для облегчения понимания такая картинка жизненного цикла таймера. При достижении 0xFFFF следующим тактом сбрасывание в 0.

Я насчитал 12 тактов до записи в TMR0L, то есть в таймере заменяем число 12 на число 0xF648 и получаем ровно 2500 тактов между прерываниями.

post-193952-0-95904600-1468585522_thumb.png

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

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

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

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

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

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

Я насчитал 12 тактов до записи в TMR0L

1 маш.цикл - вход в прерывание

2 маш.цикл - переход на функцию обраб прерывания

10 маш.цикл - до записи в таймер

1маш.цикл запись в таймер

итого 14...

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

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

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

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

Да чё мучиться то, загнали в симулятор и всё сразу видно.

Вот так получается ровно 1 мс :

#define TMR0_VAL	    -2480
//***********************************************************************************************
void high_isr (void);
#pragma code high_vector = 0x08
void interrupt_at_high_vector(void)
{
 _asm GOTO high_isr _endasm
}
static int ms = 0;
#pragma interrupt high_isr
void high_isr (void) {
    if (INTCONbits.TMR0IF){
		    INTCONbits.TMR0IF = 0;			   
		    Nop();		 
		    TMR0H = TMR0_VAL>>8;
		    TMR0L = TMR0_VAL&0x0FF;
    }
}
//***********************************************************************************************

post-48853-0-36222100-1468588683_thumb.png

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

Во, в симуляторе 20 тактов получается.

Кароче, для vv7. Чтобы точно рассчитать, какую константу надо записать в TMR0L, одного ассемблера-листинга мало. Нужно ещё вникнуть в самые тонкости работы процессора: сколько тактов занимает реакция процессора на переполнение таймера, сколько тактов на переход для выполнения первой команды вектора прерывания 0х0008, сколько тактов на прыжок в процедуру high_isr (void), сколько тактов до записи в TMR0L в самой процедуре. И потом, может статься, что после записи таймер пропускает ещё пару тактов для старта с нового значения.

Гораздо проще подобрать это значение, где-то около рассчётного 2500.

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

Правильно ?

Код:

#include "config_bits.h"
#include <stdio.h>
#include <stdlib.h>
#include <timers.h>
#include <string.h>
#include "lcd.h"
#include "lcd.c"
void high_isr (void);
static int o = 0;
char lcd_buff[16];
char lcd_buff2[16];
char time_buff[8];
#define button1 PORTBbits.RB0
#define buzzer PORTCbits.RC4
#pragma code high_vector = 0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
static int ms = 0;
static int s = 0;
char S[2];
static int m = 0;
char M[2];
static int h = 0;
char H[2];
static int butc1 = 0;
static int but1 = 0;
#pragma interrupt high_isr
void high_isr (void) {
if (INTCONbits.TMR0IF){
 _asm
		 NOP
 _endasm
 INTCONbits.TMR0IF = 0;				
 TMR0H = 0xF7;
 TMR0L = 0x50;
 ms++;
}
}
char lcd_time( int ss ) {
if ( ss > 59 ) { s = 0; m++; }
if ( m > 59 ) { m = 0; h++; }
if ( h > 23 ) { s = 0; m = 0; h = 0; }
if ( ss < 10 ) { sprintf(S, "0%d", s); } else { sprintf(S, "%d", s); }
if ( m < 10 ) { sprintf(M, "0%d", m); } else { sprintf(M, "%d", m); }
if ( h < 10 ) { sprintf(H, "0%d", h); } else { sprintf(H, "%d", h); }
sprintf(lcd_buff, "%02d:%02d:%02d", h, m, s);
}
void buz1(void) {
int buzz;
for (buzz = 0; buzz < 20; buzz++) {
DelayMs(10);
buzzer = !buzzer;
}
}
void main (void) {

TRISA = 0x00;
PORTA = 0x00;
TRISB = 0x01;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
TRISE = 0x00;
PORTE = 0x00;

ADCON1 = 0x0F;
T0CON = 0b10001000;


TMR0H = 0xF7;
TMR0L = 0x50;


INTCON = 0x20;			
INTCON2 = 0x04;
RCONbits.IPEN = 1;				
INTCONbits.GIEH = 1;

DelayMs(10);
lcd_init();
lcd_clear();
DelayMs(10);
lcd_gotoxy(0,3);
sprintf(lcd_buff, "> STARTED <");
lcd_puts(lcd_buff);
buz1();
DelayMs(100);
lcd_clear();
lcd_gotoxy(0,4);
sprintf(lcd_buff, "00:00:00");
while (1) {

 if ( button1 == 0 && but1 == 1 ) {
	 lcd_gotoxy(1,0);
	 butc1++;
	 sprintf(lcd_buff2, "Button: %d" , butc1);
	 lcd_puts( lcd_buff2 );
	 but1 = 0;
 }

 if ( button1 == 1 ) {
	 but1 = 1;
 }

 if ( ms == 1000 ) {
 PORTCbits.RC5 = !PORTCbits.RC5;
 s++;
 lcd_time( s );
 lcd_gotoxy(0,4);
 lcd_puts(lcd_buff);
 ms = 0;
 }
}
}

В результате 250 микросекунд ( 250 µs в Симуляторе ) за 1 цикл. PIC делает 4 цикла за 1 секунду ? Или я не так понял ? Получиться 1 секунда ?

Я Асм NOP добавил из-за того, что подобрать у меня с цифрой без него не получалось ... 250. Потому, как без NOP - 249,7 мкс

post-195350-0-44399400-1468594114_thumb.png

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

Хмм ... и чему тогда верить :D ? Может в протеусе другой компилятор или что-то иное ? Или другой код asm ? 100% где-то добавились какие-то команды ...

А что нужно выбирать ( Breakpoint ) ( Какую строку ? По какой строке ориентироваться ? ) чтобы высчитать ?

Просто, прошил я МК и поставил в схемку. В живую через ~50 секунд на ~5 секунд быстрее чем часы. Чудеса или не та строка отсчёта в симуляторе ?

Код тот, который в прошлом сообщении с 2500 тактов.

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

А что нужно выбирать ( Breakpoint ) ( Какую строку ? По какой строке ориентироваться ? )

тк у вас всего одно прерывание , то брекпоинт на любой строке в приделах прерывания

и 0хF750 в таймере??? установили таймер с 10% погрешность и удивляетесь почему тикают на 5сек быстрее часов???

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

Спасибо !

Как понять с 10% погрешностью ? :unknw: В симуляторе вообще можно подобрать данное число ? Или это можно сделать ТОЛЬКО подбором ?! Просто ... вы тоже подбираете ?! Или как ... вы также подбираете, когда вам нужно точное время ?

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

:wall: ну сколько можно объяснять частота осцилятора и частота инструкций(маш.циклов) это не одно и тоже!

частота инструкций в 4 раза ниже

для кварца 10МГц = 2,5МГц!

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

У Вас установлена частота инструкций 10 Мгц, а при 10 Мгц тактовой частоты, частота инструкций = 2.5 Мгц. Установите её и у Вас будет всё показывать верно.

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

Да я как-то ничего не поменял. Цифры ведь те же ... просто ... я уже сам не понял. Цифры те же а результат в живую ... быстрее нужного )))

Alex, IMXO, вы меня простите ... )

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

1мс. Верно ?
Улыбнуло :)

А как Вы сами считаете ? :)

не знаю как считает ТС, но у вас предустановка 2480маш.циклов

у мну предуст 2480маш.ц получаем 1мс

и у ТС 2224м.ц и тоже 1мс

вопрос куда ТС дел 254м.ц. > :)

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

Весь код:

#include "config_bits.h"
#include <stdio.h>
#include <stdlib.h>
#include <timers.h>
#include <string.h>
#include "lcd.h"
#include "lcd.c"

void high_isr (void);
static int o = 0;
char lcd_buff[16];
char lcd_buff2[16];
char time_buff[8];
#define button1 PORTBbits.RB0
#define buzzer PORTCbits.RC4

#pragma code high_vector = 0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}

static int ms = 0;
static int s = 0;
char S[2];
static int m = 0;
char M[2];
static int h = 0;
char H[2];

static int butc1 = 0;
static int but1 = 0;

#pragma interrupt high_isr
void high_isr (void) {
if (INTCONbits.TMR0IF){
_asm
NOP
_endasm
INTCONbits.TMR0IF = 0;
TMR0H = 0xF7;
TMR0L = 0x50;
ms++;
}
}

char lcd_time( int ss ) {
if ( ss > 59 ) { s = 0; m++; }
if ( m > 59 ) { m = 0; h++; }
if ( h > 23 ) { s = 0; m = 0; h = 0; }
if ( ss < 10 ) { sprintf(S, "0%d", s); } else { sprintf(S, "%d", s); }
if ( m < 10 ) { sprintf(M, "0%d", m); } else { sprintf(M, "%d", m); }
if ( h < 10 ) { sprintf(H, "0%d", h); } else { sprintf(H, "%d", h); }
sprintf(lcd_buff, "%02d:%02d:%02d", h, m, s);
}

void buz1(void) {
int buzz;
for (buzz = 0; buzz < 20; buzz++) {
DelayMs(10);
buzzer = !buzzer;
}
}

void main (void) {

TRISA = 0x00;
PORTA = 0x00;
TRISB = 0x01;
PORTB = 0x00;
TRISC = 0x00;
PORTC = 0x00;
TRISD = 0x00;
PORTD = 0x00;
TRISE = 0x00;
PORTE = 0x00;

ADCON1 = 0x0F;
T0CON = 0b10001000;


TMR0H = 0xF7;
TMR0L = 0x50;


INTCON = 0x20;
INTCON2 = 0x04;
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;

DelayMs(10);
lcd_init();
lcd_clear();
DelayMs(10);
lcd_gotoxy(0,3);
sprintf(lcd_buff, "> STARTED <");
lcd_puts(lcd_buff);
buz1();
DelayMs(100);
lcd_clear();
lcd_gotoxy(0,4);
sprintf(lcd_buff, "00:00:00");
while (1) {

if ( button1 == 0 && but1 == 1 ) {
lcd_gotoxy(1,0);
butc1++;
sprintf(lcd_buff2, "Button: %d" , butc1);
lcd_puts( lcd_buff2 );
but1 = 0;
}

if ( button1 == 1 ) {
but1 = 1;
}

if ( ms == 1000 ) {
PORTCbits.RC5 = !PORTCbits.RC5;
s++;
lcd_time( s );
lcd_gotoxy(0,4);
lcd_puts(lcd_buff);
ms = 0;
}
}
}

Файл "config_bits.h":


// PIC18F452 Configuration Bit Settings

// 'C' source line config statements

#include <p18f452.h>

// CONFIG1H
#pragma config OSC = HS         // Oscillator Selection bits (HS oscillator)
#pragma config OSCS = OFF       // Oscillator System Clock Switch Enable bit (Oscillator system clock switch option is disabled (main oscillator is source))

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOR = ON         // Brown-out Reset Enable bit (Brown-out Reset enabled)
#pragma config BORV = 20        // Brown-out Reset Voltage bits (VBOR set to 2.0V)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 128      // Watchdog Timer Postscale Select bits (1:128)

// CONFIG3H
#pragma config CCP2MUX = ON     // CCP2 Mux bit (CCP2 input/output is multiplexed with RC1)

// CONFIG4L
#pragma config STVR = ON        // Stack Full/Underflow Reset Enable bit (Stack Full/Underflow will cause RESET)
#pragma config LVP = OFF        // Low Voltage ICSP Enable bit (Low Voltage ICSP disabled)

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000200-001FFFh) not code protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot Block (000000-0001FFh) not code protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000200-001FFFh) not write protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot Block (000000-0001FFh) not write protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000200-001FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from Table Reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from Table Reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot Block (000000-0001FFh) not protected from Table Reads executed in other blocks)

#pragma target clock 10_000_000

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

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

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

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

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

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

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

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

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

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

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

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