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

crazz

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

Реклама: ООО ТД Промэлектроника, ИНН: 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

При прогоне не только это вскрылось бы, но и то, что у его программы существует "конец". В main он забыл вызвать led(); :)

Даже если он вызовет led(), условие if (INTCONbits.TMR0IF==1) будет постоянно выполняться, т.к. сброс флага находится фиг знает где, а точнее за пределами while(1){}

Автор, ответьте на вопрос - что у Вас должно работать и где Вы взяли весь этот код ?

ЗЫ: Только что заметил. Иниться таймер 1, а проверяется флаг таймера 0. :D

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

Автор, ответьте на вопрос - что у Вас должно работать и где Вы взяли весь этот код ?

ЗЫ: Только что заметил. Иниться таймер 1, а проверяется флаг таймера 0. :D

Я хочу отображать цифры на 7-ми сегментном индикаторе, в зависимости от нажатой кнопки. А пока хочу научиться выводить цифры...

А код я сам делал.............я просто немного учил в институте, но чего нас там научили, так это диоды на порту RB включать.

Чем отличаются PIR1bits.TMR1IF и INTCONbits.TMR0IF? - я вичитал в мануале к пик18 и то, и то это флаг переполнения таймера TMR1

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

я вичитал в мануале к пик18 ...
Дайте ссылку на этот чудо-мануал и скажите на какой странице такое написано. Очень интересно посмотреть :)
Ссылка на комментарий
Поделиться на другие сайты

Или невнимательно читал, или в даташите допущена опечатка(такое бывает).

Надо еще использовать логику, названия составляют из частей -

например TMR0IF: 1) "TMR" - таймер, 2) "0" - нулевой, 3) "I" - прерывание(interrupt) 4) "F" - флаг(признак)...

И это касается большинства других наименований!

Учение - изучение правил. Опыт - изучение исключений.

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

я вичитал в мануале к пик18 ...
Дайте ссылку на этот чудо-мануал и скажите на какой странице такое написано. Очень интересно посмотреть :)

http://www.microchip.ru/files/d-sheets-rus/PIC18FXX2_manual.pdf

ст 72

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

Не вижу ничего подобного. На этой странице описан регистр INTCON в котором есть флаг TMR0IF. Где написано что TMR0IF и TMR1IF одно и то-же ? Там вообще про TMR1 ни слова....

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

Добавьте обработчик прерываний, в нём проверяйте флаг, сбрасывайте его, переустанавливайте таймер и выводите нужные значения в порт. В main'е инициализируйте порты, таймер, прерывания ... и зацикливайте программу.

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

Написал Вам примерчик для 4-х индикаторов, только компиль немного другой (HI-TECH), но по коментариям думаю разберётесь.

В архиве проект МПЛАба, исходник и файл протеуса. Можете наглядно посмотреть как это работает.

Удачи....

7_seg.rar

Для тех, кому лень качать архив, исходный код :

#include	"pic18.h"

__CONFIG(1, 0x02FF);	
__CONFIG(2, 0x0EFF);		
__CONFIG(4, 0xFF80);

// Сегменти (цифры) 0 1 2 3 4 5 6 7 8 9 
unsigned char const digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
unsigned char buf_ind[4]; // Буфер индикаторов


//******************************************************//
void main ()
{


TRISC=0b10000000;
PORTC=0xFF;
TRISD=0b11110000;
PORTD=0xF0;


TMR1ON=1;	// Вкл. таймер 1
TMR1IF=0;	// Сбросили флаг
TMR1IE=1;	// Разрешили прерывание от TMR1
TMR1 = -2500;	// Установили значение таймера на 2500 циклов


PEIE=1;
GIE=1;

buf_ind[0] = ~digit[1]; // Буфер 1-ого индикатора = цифре 1. 
		// ~ поставил потому что таблица для общего катода
buf_ind[1] = ~digit[2];	// Буфер 2-ого индикатора = цифре 2. 
buf_ind[2] = ~digit[3];	// И т.д...
buf_ind[3] = ~digit[4]; // 


while(1)	// Основной цикл
{


}
}


//***** обработчик прерываний ***********************//
void interrupt _isr(void)
{
static unsigned char ind_num=0;	// Номер индикатора


if(TMR1IF)	// Проверяем флаг
{
	TMR1IF=0;	// Сбрасываем флаг
	TMR1 = 65537-2500 + TMR1;	// Переустанавливаем таймер на 1 mS

	ind_num++;	// Следующий индикатор
	if(ind_num>3)	ind_num=0;	// Если зашкалило, выбираем первый

	PORTD &=0b11110000;	// Гасим индикаторы
	NOP();NOP();NOP();NOP();NOP();	// Небольшая задержка
	PORTC=buf_ind[ind_num];			// Выводим в порт значение текущего индикатора из буфера
	PORTD |=(1<<ind_num);			// Зажигаем текущий индикатор
}

}

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

Помогите....... :help:

Почему не обрабатываются прерывания???

#include<p18f452.h>

void main (void);

void InterruptHandler (void);

// Сегменты 0 1 2 3 4 5 6 7 8 9

unsigned char const digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// Розряды

unsigned char ind[1];

void main()

{

TRISC=0b00000000;

PORTC=0x00;

TRISD=0b00000000;

PORTD=0x00;

//------------------

// таймер TMR1

T1CONbits.RD16=0;

T1CONbits.T1CKPS0=1;

T1CONbits.T1CKPS1=1;

T1CONbits.T1OSCEN=0;

T1CONbits.T1SYNC=0;

T1CONbits.TMR1CS=0;

T1CONbits.TMR1ON=1;

PIR1bits.TMR1IF=0;

PIE1bits.TMR1IE=1;

RCONbits.IPEN=0;

INTCONbits.GIE=1;

INTCONbits.PEIE=1;

//------------------------------

ind[0] = ~digit[1]; // Буфер 1-ого индикатора = цифре 1. (Для начала для одного)

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

while(1) //цикл

{

}

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

//***** обработчик прерываний **********

void InterruptHandler()

{

static unsigned char ind_num=0;

if (PIR1bits.TMR1IF==1)

{

PIR1bits.TMR1IF=0;

}

}

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

Так у Вас обработчик пустой. Только флаг сбрасывает и все. Чего Вы хотели от первого таймера в алгоритме?

Вот именно, не хочет сбрасываться флаг, код в обработчике не работает, так как туда попросту не заходит....НЕ ПОЙМУ ПОЧЕМУ

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

Я поставил в МПлабе в окне Watch регистр PIR1. А в коде поставил знак остановки напротив строки if (PIR1bits.TMR1IF==1)

Так цикл никогда не останавливается

Наконец работает...........

Нужно было прописать (насколько я это понял)адреса векторов прерываний.

Осталось теперь дополнить код, при переполнении таймера :rolleyes:

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

Кстати, получившийся пока-что код:

#include<p18f452.h>

void main (void);

void InterruptHandlerHigh (void);

void InterruptHandlerLow (void);

// Сегменты 0 1 2 3 4 5 6 7 8 9

unsigned char const digit[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};

// Розряды индикотора

unsigned char ind[1];

void main() //Основная программа

{

TRISC=0b00000000;

PORTC=0x00;

TRISD=0b00000000;

PORTD=0x00;

//------------------

// таймер TMR1

T1CONbits.RD16=0;

T1CONbits.T1CKPS0=0;

T1CONbits.T1CKPS1=0;

T1CONbits.T1OSCEN=0;

T1CONbits.T1SYNC=0;

T1CONbits.TMR1CS=0;

T1CONbits.TMR1ON=1;

PIR1bits.TMR1IF=0;

PIE1bits.TMR1IE=1;

//TMR1 = 65536-25000;

RCONbits.IPEN=1;

INTCONbits.GIE=1;

INTCONbits.PEIE=1;

IPR1bits.TMR1IP=0;

//------------------------------

ind[0] = ~digit[1]; // Буфер 1-ого индикатора = цифре 1.

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

while(1) //цикл

{

}

}

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#pragma code InterruptVectorHigh = 0x08

void InterruptVectorHigh (void)

{

_asm

goto InterruptHandlerHigh

_endasm

}

#pragma code InterruptVectorLow = 0x18

void InterruptVectorLow (void)

{

_asm

goto InterruptHandlerLow

_endasm

}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#pragma code

#pragma interrupt InterruptHandlerLow

void InterruptHandlerLow ()

{

static unsigned char ind_num=0;

if (PIR1bits.TMR1IF==1)

{

PIR1bits.TMR1IF=0;

PORTC=digit[3]; //вывести цифру 3

}

}

#pragma code

#pragma interrupt InterruptHandlerHigh

void InterruptHandlerHigh ()

{

}

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

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

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

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

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

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

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

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

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

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

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

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