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

Не Работает Счётчик На Pic16F84A


Jeka777

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

Недавно мне понадобилось создать небольшой счётчик, который бы принимал сигналы и перекрывал их источник после принятия определённого количества, при этом выдавая процесс на семисегментый индикатор с двумя цифрами и единицой в начале (188). Для работы решил использовать pic16f84a, потому, что это оказался единственным микроконтроллером в одном из немногих радиомагазинов в моём городе. Сам аппарат спаял, а так-как занимаюсь программированием на С++, решил, что с прошивкой проблем не будет. В качестве компилятора выбрал "MPLAB IDE" с "hi-tech c comopiler'ом". Но как же я оказался неправ. В общем сижу уже неделю, изучаю pic. За это время переписал код несколько раз. Но всё без толку. Добивался, что стабильно работал индикатор, но ввод с конопок на той-же ножке, что и вывод на индикатор, никак не мог реализовать. Проверял, кстати, с помощью Proteus'а и PIC simulator IDE. На настоящем микроконтроллере пока проверять не рискую, ибо первый pic16 спалил при первой же попытке, остался только один, а сроки поджимают. Кто-нибудь из разбирающихся в этой области может помочь? В общем вот тот код, что у меня вышел на данный момент. В чём ошибки и почему он отказывается нормально работать?

#include <pic.h>
__CONFIG(HS & WDTDIS & PWRTEN);//4 мегагерца кварц, таймеры 1 - вкл, 2 - выкл
enable_digital_io();//цифровой режим выходов
void Graphic(int);//вывод на индикатор
char Input(int);//ввод по кнопкам
bit count_mode = 0;//вода или таймер
bit clapan_mode = 0;//принудительное закрытие или начало отсчёта
char APORTB[10];//цифры 0-9
bit step = 0;//шаг индикатора
//мейн
int main()
{
//назначаем ножки
TRISA0 = 0;//открытие потока
TRISA1 = 0;//цифра 2
TRISA2 = 0;//цифра 3
TRISA3 = 0;//цифра "1"
TRISA4 = 1;//вход турбины
//назначаем элементы цифр
TRISB0 = 0;//прерывание
TRISB1 = 0;//лево верх, +-
TRISB2 = 0;//лево низ, 1
TRISB3 = 0;//центр верх, 19
TRISB4 = 0;//центр центр, смена режима
TRISB5 = 0;//центр низ, открытие клапана
TRISB6 = 0;//право верх
TRISB7 = 0;//право низ
RBPU = 1;//подтягивающие резисторы
INTEDG = 1;//срабатывание по нажатию
INTCON = 0b00000000;//нет прерываний
//присваиваем значения цифрам
APORTB[0] = 0b11101110;
APORTB[1] = 0b11000000;
APORTB[2] = 0b01111100;
APORTB[3] = 0b11111000;
APORTB[4] = 0b11010010;
APORTB[5] = 0b10111010;
APORTB[6] = 0b10111110;
APORTB[7] = 0b11001000;
APORTB[8] = 0b11111110;
APORTB[9] = 0b11111010;
//мигаем после загрузки
Graphic(188);
for(int stop=0; stop<10; stop++)
{_delay(10);}
//начинаем работу
char sygnal = 10;//оставшееся количество порций
float dynamic_sygnal = 0;//точное количество сигналов
char time_i = 0;//оставшееся время
float time_f = 0;//точное количество
while(1)//бесконечный цикл
{
if(count_mode == 0)
{
sygnal+=Input(sygnal);//регулирование количества воды
Graphic(sygnal);//вывод оставшегося количества воды
if (clapan_mode == 0)
{
if(RA4 == 0) step=0;
if(RA4 == 1 && step == 0)
{
 step = 1;
 dynamic_sygnal+=0.001;
 if(dynamic_sygnal>=1 && sygnal>=1)
 {
 dynamic_sygnal--;
 sygnal--;
 }
}
}
}
if(count_mode == 1)
{
time_i+=Input(time_i);//регулирование времени
Graphic(time_i);
time_f+=0.0001;
if(time_f>=1 && time_i>=1)
{
time_f--;
time_i--;
}
if(time_i<=0) count_mode == 0;
}
 if(sygnal <= 0 || clapan_mode == 1)
 {
RA0 = 1;
 }
else
{
RA0 = 0;
}
}
}
//ввод
bit A1=0;
bit A2=0;
bit i = 0;//номер цифры
int single_press = 0;
char Input(int sygnal)//блок ввода данных
{
int counting_sygnal = 0;//надбавка воды за цикл
PORTB = 0b00000001;
TRISB1 = 1;//+-
TRISB2 = 1;//1
TRISB3 = 1;//10
TRISB4 = 1;//смена режима
TRISB5 = 1;//смена режима
_delay(250);

//детект отпущеных кнопок
if(RB2 == 1 && RB3 == 1 && RB4 == 1 && RB5 == 1) single_press = 0;

//изменение количества воды
if(single_press == 0)
{
 if(RB2 == 0)
 {
	 single_press = 1;
	 if(RB1 == 0)
	 {counting_sygnal -= 1;}
	 else
{counting_sygnal += 1;}
 }
 if(RB3 == 0)
 {
	 single_press = 1;
 if(RB1 == 0)
	 {counting_sygnal -= 10;}
 else
	 {counting_sygnal += 10;}
}
if(RB4 == 0)
 {
	 single_press = 1;
count_mode ^= 1;
 }
if(RB5 == 0)
 {
	 single_press = 1;
clapan_mode ^= 1;
 }
}
_delay(250);
TRISB1 = 0;//лево верх
TRISB2 = 0;//лево низ
TRISB3 = 0;//центр верх
TRISB4 = 0;//центр центр
TRISB5 = 0;//центр низ
PORTB = APORTB[i] & 0b00000001;
if(sygnal + counting_sygnal > 199) counting_sygnal == 0;
if(sygnal + counting_sygnal < 0) counting_sygnal == 0;
return counting_sygnal;
}
//графический вывод
char pass=1;
char digit=0;
void Graphic(int number)
{
char num[2];
pass++;
if(pass>=100)
{
pass=0;
if(number>=100)
{
number-=100;
RA3=1;
}
else
{
RA3=0;
}
i ^= 1;
num[1]=number%10;
num[0]=number/10;
//выбираем цифру
if(i==0)
{
A1=1;
A2=0;
digit=num[0];
}
else
{
A1=0;
A2=1;
digit=num[1];
}
RA1=A1; RA2=A2;
}
PORTB = APORTB[digit] & 0b00000001;
return;
}

В общем делаю я всё это под индикатор с общим катодом, но крайне было бы желательно мне разобраться с выводом под общий анод.

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

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

Извиняюсь, что код не под катом, если тут есть такая функция, ибо таковой не нашёл. И ещё извиняюсь, что код жутко поплыл при вставке на форум.

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

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

Добрый вечер,опишите конкретно сколько сигналов должно прити на ножку МК, и что значит "перекрывал их источник после принятия определённого количества",и я попробую Вам помочь, сразу говорю что на СИ и С++ не пишу,работаю с другим языком.

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

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

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

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

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

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

Ещё есть подозрения, что проблема у меня из-за незнания С, но на сколько я помню, отличия у него от С++ только в классах, за исключением некоторых комманд, которые сразу видятся компилятором.
проблема в незнании команд микроконтроллера, и правил построения программ для него....

1. где бесконечный цикл основной программы?

2. вы нагрузку на МК при применении этого:

time_f+=0.0001;

представляете?....

3.что делаем этими командами:

RBPU = 1;//подтягивающие резисторы

INTEDG = 1;//срабатывание по нажатию

ЗЫ: и было бы не плохо видеть схему этого полета мысли...

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

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

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

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

И мне непонятно - "и единицой в начале (188)"?

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

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

Неспорю,можна и до 9999 зделать, нужно знать что дальше должно произойти после принятия импульсов.

И непонятно "перекрывал их источник после принятия определённого количества" , хорошо перекроет а как он должен вернуться в исходное состояния для подсчета? Все это и надо чтобы автор проекта описал,тогда и можна будет ему помочь.

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

сколько сигналов должно прити на ножку МК

Я ещё не знаю, ибо будет зависеть от обстоятельств. Как раз для этого и ввёл переменную dynamic_sygnal, чтоб легко изменять число входящих импульсов.

перекрывал их источник после принятия определённого количества

Простой транзистор, подцепленный базой к ножке, на которую идёт сигнал если sygnal опустится до нуля.

1. где бесконечный цикл основной программы?

В мейне после назначения ножек и объявления переменных.

while(1)//бесконечный цикл

{

if(count_mode == 0)

{

sygnal+=Input(sygnal);//регулирование количества воды

Graphic(sygnal);//вывод оставшегося количества воды

if (clapan_mode == 0)

{

if(RA4 == 0) step=0;

if(RA4 == 1 && step == 0)

{

step = 1;

dynamic_sygnal+=0.001;

if(dynamic_sygnal>=1 && sygnal>=1)

{

dynamic_sygnal--;

sygnal--... и так далее

2. вы нагрузку на МК при применении этого представляете?

Честно, не задумывался, но теперь представил. Хотя мне здесь и нужно занять микроконтроллер на определённый срок...

3.что делаем этими командами:

Ну без подтягивающего сопротивления, на сколько я понял из примеров вводы будут не очень стабильно работать.

А вот INTEDG осталось после очередного переписывания кода.

было бы не плохо видеть схему этого полета мысли...

А вот здесь, извиняюсь, предоставить на данный момент не могу, так-как находятся они на данный момент на другом компьютере.

а как он должен вернуться в исходное состояния для подсчета?

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

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

Честно ,непонятно "Ну это мне особо не требуется, ибо главное чтоб он перекрыл" ?

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

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

Честно ,непонятно "Ну это мне особо не требуется, ибо главное чтоб он перекрыл" ?

Ну главное, чтоб он подал сигнал на ножку, а дальше всё равно, что будет. Хотя с этим у меня проблем вообще нет. Сигнал подаётся спокойно и без проблем.

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

Ну без подтягивающего сопротивления, на сколько я понял из примеров вводы будут не очень стабильно работать.

и по этому вы их благополучно отключили?....

1. изучите работу прерываний

2. динамическую индикацию и опрос кнопок проводить по флагу от таймера TMR0

3 изучить параметр чтение-модификация-запись портов ввода/вывода и не использовать подобных конструкций:

if(single_press == 0)
{
	 if(RB2 == 0)
	 {
			 single_press = 1;
			 if(RB1 == 0)
			 {counting_sygnal -= 1;}
			 else
{counting_sygnal += 1;}
	 }
	 if(RB3 == 0)
	 {
			 single_press = 1;
	 if(RB1 == 0)
			 {counting_sygnal -= 10;}
	 else
			 {counting_sygnal += 10;}
}
if(RB4 == 0)
	 {
			 single_press = 1;
count_mode ^= 1;
	 }
if(RB5 == 0)
	 {
			 single_press = 1;
clapan_mode ^= 1;
	 }

результат может быть непредсказуем....

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

Индикацию заведите на обработчик прерываний по таймеру.

Импульсы считайте по внешнему прерыванию, либо внешнему тактированию таймера, либо ловите изменения входа в периодичном месте (он уже есть для индикации). Опрос кнопок запихивайте туда-же, в прерывания.

Остальная логика, вычисления, ... - в основном цикле. Общение между прерываниями и основным циклом - через флаги и глобальные переменные.

PS: Начните с одного, например с индикации, и постепенно наращивайте программу. Сразу за всё браться нельзя - будет каша.

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

Сразу за всё браться нельзя - будет каша.

+1

и настоятельно рекомендую заучить это:

http://pic24.ru/doku.php/osa/articles/encoding_without_errors

http://pic24.ru/doku.php/osa/articles/volatile_for_chainiks

http://pic24.ru/doku.php/osa/articles/modules

http://pic24.ru/doku.php/osa/articles/mpasm_formatting

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

и по этому вы их благополучно отключили?....

Оу, значит это было отключение...

1. изучите работу прерываний

2. динамическую индикацию и опрос кнопок проводить по флагу от таймера TMR0

3 изучить параметр чтение-модификация-запись портов ввода/вывода и не использовать подобных конструкций:

Хорошо, учту, спасибо за совет.

Индикацию заведите на обработчик прерываний по таймеру.

Импульсы считайте по внешнему прерыванию, либо внешнему тактированию таймера, либо ловите изменения входа в периодичном месте (он уже есть для индикации). Опрос кнопок запихивайте туда-же, в прерывания.

Вам тоже спасибо, правда возможность всё это опробовать будет только завтра. Надеюсь, что поможет.

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

Обсолютно согласен с IMXO и с Alex , нужно сначала изучить устройство контроллера,потом принцип построения программ,и изучить прерывания ,а уж после писать саму программу.

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

А в магазинах из PIC'ов, кроме 84А ничего больше нет ? Он же дорогой и бестолковый :(

И ещё, для кварца 4Мгц, в конфигах нужно указывать не HS, а XT.

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

А в магазинах из PIC'ов, кроме 84А ничего больше нет ? Он же дорогой и бестолковый :(

Именно. Были бы варианты - купил бы. А так пришлось обходиться только этим. При этом уже месяц говорят, что со следующим завозом будет что-нибудь получше. Но никак не могут привезти. А даже те немногие, что есть скупают какого-то с бешеной скоростью. Получилось только 2 достать.

И ещё, для кварца 4Мгц, в конфигах нужно указывать не HS, а XT.

А здесь я уже, если не ошибаюсь, в даташите прочёл, что с 4 мегагерцами лучше юзать HS.

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

в России - Платан
Тритон ещё по Микрочипу специализируется. Я у них ПИКи заказываю.

У нас в магазинах то-же выше 628-ого ничего не найдёшь.

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

а через тырнет не судьба?

в России - Платан

в Украине - Гамма...

Да вот не судьба. Просто требовалось срочно, у меня уже в этот четверг должно быть всё готово. Просто никогда ничего вещественного через интернет не покупал. А учитывая, что я живу не в России и даже не на Украине, а в Казахстане, то фиг его знает когда прибудет контроллер. Хотя у меня в планах ещё несколько и тут думаю да - без покупки через инет будет не обойтись.

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

уже в этот четверг должно быть всё готово
Тяжеловато Вам будет... :unsure:

Характеристики входного сигнала какие ? Макс частота, минимальное время импульсов, форма ?

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

уже в этот четверг должно быть всё готово
Тяжеловато Вам будет... :unsure:

Да уж понимаю. Хотя, как уже говорил, в течении недели всё своё свободное время трачу. Да и само устройство уже почти есть. Так что если повезёт, то успею.

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

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

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

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

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

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

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

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

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

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

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