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

Не Работает Счётчик На 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;//срабатывание по нажатию

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

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

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

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

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

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

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

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

Неспорю,можна и до 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 пользователей онлайн

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

    • А какой монитор был до этого и на какой поменяли? Желательно точную модель
    • "Стандартной" входной емкостью 150...250 пик и "стандартным" входным сопротивлением 47 кОм. А надо 25 пик и 150 кОм (см. аттач)
    • Было подобное от электромагнитных помех. Решилось заменой монитора.
    • Можно взять ватную палочку намочить в ацетоне и протереть верхнюю часть микросхемы. В 99% лак смывается и надписи хорошо читаются.  
    • Собрал тут за праздники очередную приблуду, по принципу "я его слепила из того, что было" Брал когда-то давно пару "печаток" Лемана по распродаже на Али. Одну сразу спаял на 2134й и noname транзисторах Не понравилось - "грелка-пищалка", да и ОРА2134 к делу пригодилась. Вторая плата оставалась, так как ни в какой корпус не лезла. А тут у компьютерщиков добыл корпус от мини-компьютера. BDшки уже Филипсовские старые давно лежали, и две пары Фаирчайлдовских 550\560х, OPA27 с апрельской распродажи подоспели... НаЛУТовал недостающие платы, старому советскому ТП-30-2 профилактику сделал. Переднюю и заднюю панель долго не мог придумать из чего сделать, пока в мусорке у рекламщиков не увидел толстую пластиковую панель с двусторонним алюминиевым покрытием (красить ее, кстати, задолбался). Памятуя опыт сборки прошлого "Лахмана" добил схему выпрямителей 7815\7915 до даташитовой (на фото нет диодов, они smd, снизу припаяны). Резисторы в питании поставил полваттные, а 10-омники вообще 2W. Переменники добавил в цепь регулировки коэффициента усиления операционников. Вывел с платы светодиод на переднюю панель. Вход и выход сделал по схеме ATH-5000. Ну и уже привычный EMI-фильтр, с развязкой через резистор на корпус, плату дросселя с предохранителями по низкой стороне. Микросхему 1237 сделал съемной, а то при покупке новых проверить не в чем. Пустые 2 контакта у разъема наушников сделал на всякий случай - они завязаны на нулевой контакт, размыкаемый при вставке штекера наушников. Прозвонил, включил, послушал - на этот раз понравилось, Филипсовские транзы вместе с OPA27 звучат шикарно (с ОРА134 значительно хуже).  
    • Где-то на Ютубе был ролик как мужик с ом2.7 снимал 180вт синуса в статику .правда там был огромный радиатор и серверный кулер . Хотел бы спросить чем обусловлен ток входного дифференциациального каскада ? Почему в большинстве усилителей он выбран именно 2-3ма .почему не больше или меньше ?Заметил такую особенность(хотя может мне кажется ) если снизить ток до 100-200мка то звук становится более динамичным и с более четкой серединой .но и начинаются какие-то искажения похожие на ступеньку . Хотя осциллограф его не видит.
    • Ниже сопротивление нагрузки - больше выходной и потребляемый ток. Чем больший ток течет по обмоткам транса - тем больше их нагрев. На холостом ходу трансформатор греться вообще не должен, во всяком случае заметно греться не должен. Если трансформатор расположен близко к радиатору, то он может нагреваться теплом от радиатора. 
  • Похожий контент

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