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

Модуль Ccp В Режиме Захвата (Язык С)


6ap6oc

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

Потребовалось использовать модуль CCP в режиме захвата. камень 16f877a. Накидал небольшую прошивку, подаю на вход RC2(CCP1) 10кГц, при каждом прерывании модуля CCP должен инвертироваться вывод RB6, а так же на семисегментник выводится трехзначное значение счетчика (0...655).

Прерывания по таймеру 0 и 1 есть, по модулю захвата нет ничего. Код написан согласно ДШ.

#include <pic.h>

__CONFIG(0x3FFA);		
int v1,v2,v3,v4,ADCR;	 //Числа для каждого знакоместа
char vn;
static volatile unsigned int num		 @ 0x26; // программный регистр преобразования ацп
static volatile unsigned char numL	 @ 0x26; // младший байт
static volatile unsigned char numH	 @ 0x27; // старший байт
void CPU_SETUP (void){
TRISA = 0b11111111; //порт А - на вход
TRISB = 0; //Вывод анодов
TRISC = 0b11111111;
TRISD = 0;
PORTA = 1;		 //очищаем порт А
PORTB = 0; //очищаем порт В
PORTC = 0;
PORTD = 0;
OPTION = 0b00000000; //Конфигурация переферии по умолчанию, предделитель таймера 0 на 0
INTCON = 0b11100000; //Конфигурация прерываний
T1CON = 0b00001101;
//ADCON0 = 0b10000000; //Правое выравнивание, канал AN0, включен
ADCON1 = 0b00000111; //Fosc/32
CCP1CON = 0b00110101; //Захват по каждому переднему фронту сигнала
PIE1 = 0b00000101; //Прерывания от CCP1,TMR1
CCP1IF = 0; //Флаг захвата сброшен
CCP1IE = 1;
//////////////////////////////////////////////////////////////////////
//	 Регистр настроек OPTION	 //
//RBPU = 1; //подтягивающие резисторы выкл бит 7 //
//INTEDG = 0; //прерывания по заднему фронту сигнала бит 6 //
//T0CS = 0; //внутренний тактовый сигнал таймера 0 бит 5 //
//T0SE = 0; //приращение по переднему фронту TMR0 бит 4 //
//PSA = 0; //предделитель включен перед TMR0 бит 3 //
//PS2 = 0; //установка	 бит 2 //
//PS1 = 0; //коэффициента	 бит 1 //
//PS0 = 0; //предделителя TMR0 на 0 бит 0 //
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
//	 Регистр прерываний INTCON	 //
//GIE = 1; //разрешаем глобальные прерывания бит 7 //
//PEIE = 1; //разрешаем прерывания периферии бит 6 //
//T0IE = 1; //разрешаем прерывания по таймеру 0 бит 5 //
//INTE = 0; //запрещаем внешние прерывания бит 4 //
//RBIE = 0; //запрещаем прерывания по порту В бит 3 //
//T0IF = 0; //очищаем флаг таймера 0	 бит 2 //
//INTF = 0; //очищаем флаг внешнего прерывания бит 1 //
//RBIF = 0; //очищаем флаг прерывания на порту В бит 0 //
//////////////////////////////////////////////////////////////////////
}void delay(unsigned int p)
{
unsigned int i;
for(i=0;i<p;i++){asm("NOP");}
}
void seg7(unsigned char c, unsigned char s)
{
unsigned char t=0;
switch(c%13)		 // выбор сегментов (катодов)
{
//Таблица символов (чисел, знаков)//
case 0 : {t=0b11000000;} break;
case 1 : {t=0b11111001;} break;
case 2 : {t=0b10100100;} break;
case 3 : {t=0b10110000;} break;
case 4 : {t=0b10011001;} break;
case 5 : {t=0b10010010;} break;
case 6 : {t=0b10000010;} break;
case 7 : {t=0b11111000;} break;
case 8 : {t=0b10000000;} break;
case 9 : {t=0b10010000;} break;
case 10 :{t=0b11111111;} break; //пустой знак
case 11 :{t=0b10111001;} break; //знак - 1
case 12 :{t=0b10111111;} break; //знак -
}
RB0 = 0;
RB1 = 0;
RB2 = 0;
RB3 = 0;switch(s)		 // выбор анода
{
case 1 :{ RB0 = 1;}break;
case 2 :{ RB1 = 1;}break;
case 3 :{ RB2 = 1;}break;
case 4 :{ RB3 = 1;}break;
}
PORTD = t;
}
void write_7seg(int res){
v2=res/100; //2е знакоместо
res=res%100;
v3=res/10;	 //3е знакоместо
v4=res%10;	 //4e знакоместо
}void main (void)
{
CPU_SETUP();
vn=0;
v1 = 10;
while(1){}
}
void interrupt pwm_int(void)	 // общая процедура прерывания
{
if(T0IF)		 // при переполнение TMR0
{
vn++;
switch(vn)
{
case 1:seg7(v1,1);break; //сегмент 1
case 2:seg7(v2,2);break; //сегмент 2
case 3:seg7(v3,3);break; //сегмент 3
case 4:{seg7(v4,4);vn = 0;}break; //сегмент 4
}
TMR0=100;
T0IF=0;		 // сбрасываем флаг
}if (TMR1IF){
TMR1IF = 0;
RB7 = !RB7;
}
if (CCP1IF == 1){
CCP1IF = 0;
CCP1IE = 1;
RB6 = !RB6;
numH = CCPR1H;
numL = CCPR1L;
ADCR = num/100;
write_7seg(ADCR);
// TMR1H = 0;
// TMR1L = 0;
}
}

к сожалению готовых примеров кода с использованием ССР в режиме захвата на языке С по поиску не нашел...

Изменено пользователем 6ap6oc

у ЦА ненависть вообще ко всему, что не укладывается в их квадратно-гнездовой способ мышления.

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

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

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

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

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

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

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

по модулю захвата нет ничего
Откуда знаете, чем смотрите ?

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

у ЦА ненависть вообще ко всему, что не укладывается в их квадратно-гнездовой способ мышления.

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

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

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

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

static volatile unsigned int num		 @ 0x26; // программный регистр преобразования ацп
static volatile unsigned char numL	 @ 0x26; // младший байт
static volatile unsigned char numH	 @ 0x27; // старший байтvoid CPU_SETUP (void){
/////////
numH = CCPR1H;
numL = CCPR1L;

принудительное указание адресов очень плохой ход... хайтек запросто может использовать эти адреса для своих промежуточных вычислений и пофиг ему на статик и волетюне....

либо

num=CCPR1H<<8 + CCPR1L;

либо

описывайте переменые через структуру и объединение...

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

Ещё замечание по коду.

Прикиньте, хотябы примерно, сколько будет выполняться этот код :

ADCR = num/100;
write_7seg(ADCR);

И подумайте, можно ли его оставлять в обработчике прерываний, тормозя другие обработчики его неуклюжестью ?
Ссылка на комментарий
Поделиться на другие сайты

Ещё замечание по коду.

Прикиньте, хотябы примерно, сколько будет выполняться этот код :

ADCR = num/100;
write_7seg(ADCR);

И подумайте, можно ли его оставлять в обработчике прерываний, тормозя другие обработчики его неуклюжестью ?

код да, написан по ламерски :umnik2: .

стоит ХОТЯ БЫ так : ADCR = num>>2

и функцию записи в 7ми сегментный индикатор переписать должным образом.

Убрал эти причуды, оставив только инвертирование вывода по прерыванию CCP, но все равно не работет... :help:

у ЦА ненависть вообще ко всему, что не укладывается в их квадратно-гнездовой способ мышления.

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

  • 5 месяцев спустя...

Доброго времени суток. Я тут немножко археологией позанимаюсь =)

Собственно вспомнил про данную проблему с прошивкой, ранее я ее решил путем замены мк на аналоговые вещи для реализации конкретной задачи =) Но все же.

Начал снова ковырять это дело. передрал код один в один, как в сообщении выше от модератора IMXO - но увы и ах, у меня он таки не работает. Если бы не работал в протезе - можно было бы сослаться на глюк модели, но данная прошивка отказалась работать и на железе.

Прикрепляю скрин с протеуса - собственно такая же картина и на отладочной плате.

Камень работает на 20MHz, от стабилизированного источника на тл431.

QZx9NimvD-A.jpg5_9sIPFvGBM.jpg

Изменено пользователем 6ap6oc

у ЦА ненависть вообще ко всему, что не укладывается в их квадратно-гнездовой способ мышления.

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

где код?

Полностью из вашего сообщения выше. Но уже разобрался в проблеме =)

У меня стояла версия Hi-tech 9.5. Обновил до 9.7 - работает. Что там за различия разбираться не стал, времени на это нет...

у ЦА ненависть вообще ко всему, что не укладывается в их квадратно-гнездовой способ мышления.

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

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

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

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

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

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

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

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

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

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

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