BonTens86

Подключение тактовой кнопки к PIC

3 сообщения в этой теме

BonTens86    0

Доброго времени суток господа!) Вопрос к знатокам, начал изучать С++, писать начал на PIC16F628A, по мере изучения столкнулся с несколькими проблемами, первая это нужна помощь с подключением тактовой кнопки к PIC, суть проблемы в том, что при нажатии кнопки светодиод загорается, если нажать еще раз, то ничего не происходит.... Вопрос в том, как сделать выключение на эту же кнопку???? 



unsigned char CheckButton(void)
{
unsigned char result=0;
unsigned int butcount=0;
while(!RB2)
{
if(butcount < 10000)
{
butcount++;
}
else
{
result = 1;
break;
}
}
return result;
}


void kkk2 (void)
{
if(CheckButton ())
{
RB3 = 1;
{
//__delay_ms(100);
}
return;
}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Grig96    71

a) кидайте полный код

б) навскидку (код особо не смотрел) - сделайте инверсию вывода 

в) изучайте лучше мк авр

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BonTens86    0
8 минут назад, Grig96 сказал:

a) кидайте полный код

б) навскидку (код особо не смотрел) - сделайте инверсию вывода 

в) изучайте лучше мк авр

Да как раз это и помогло, попробовал сделать инверсию, тут же все заработало) И да решил все таки через if else делать
Щас другая проблема возникла, почему то работает только одна кнопка и все.... Остальные просто загораться не хотят, что ни так, ума не приложу

Как то С больше понравился))

 

#include <pic.h>
__CONFIG (INTIO & UNPROTECT & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS );

#define uph1 RB0 // Вверх щуп
#define pump RA0 // Помпа
#define auto1 RA1 // Клапан автоподкачки
#define downh2 RB1 // Низ щуп
#define head RA2 // Тен
#define kk1 RB2 // Кнопка 1 - Эспрессо мал
#define kk2 RB3 // Кнопка 2 - Эспрессо большой
#define kk3 RB4 // Кнопка 3 - Американо мал
#define kk4 RB5 // Кнопка 4 - Американо большой 
#define kk5 RB6 // Кнопка 5 - Горячая вода
#define kk6 RB7 // Кнопка 6 - Программирование времени работы кнопок - ???
#define exitkk1 RA3 // Выход кнопки 1 
#define exitkk2 RA4 // Выход кнопки 2
#define exitkk3 RA5 // Выход кнопки 3
#define exitkk4 RA6 // Выход кнопки 4
#define exitkk5 RA7 // Выход кнопки 5
#define _XTAL_FREQ 4000000

void podgot (void); // Подготовка МК
void down (void); // Щуп низ 
void up (void); // Щуп вверх
void kkk1 (void); // Программа кнопки 1 - Эспрессо мал
void kkk2 (void); // Программа кнопки 2 - Эспрессо большой 
//void kkk3 (void); // Программа кнопки 3 - Американо мал
// void kkk4 (void); // Программа кнопки 4 - Американо большой
// void kkk5 (void); // Программа кнопки 5 - Горячая вода
// void kkk6 (void); // Программирование времени работы кнопок - ???

bit NAG;
int counter;

void main (void)
{
podgot();
while(1)
{
up (); //Функция Вверх щупа
down (); //Функция Низ щупа
kkk1 (); //Функция Кнопки 1
kkk2 (); //Функция Кнопки 2 
}
} 

void kkk1 (void) // Программа кнопки 1
{
if (kk1==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk1==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk1=!exitkk1; // переключаем свечение светодиода
counter++;
}
}	
else if (kk1==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk1==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk1=!exitkk1; // переключаем свечение светодиода
counter--;
}
}
else
{
NAG=0; // сбросить флаг "кнопка нажата" - исходя из логики
}
}

void kkk2 (void) // Программа кнопки 2
{
if (kk2==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk2==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk2=!exitkk2; // переключаем свечение светодиода
counter++;
}
}	
else if (kk2==0)	// тестируем состояние порта
{
__delay_ms(100); // ожидаем 10 мс, пропускаем дребезг
if (kk2==0&&NAG==0) // снова тестируем состояние порта и флага "кнопка была нажата"
{  // если уровень низкий и клавиша, до этого не была нажата" выполняем код в скобках
NAG=1; // устанавливаем флаг кнопка нажата
exitkk2=!exitkk2; // переключаем свечение светодиода
counter--;
}
}
else
{
NAG=0; // сбросить флаг "кнопка нажата" - исходя из логики
}
}

void up (void) //Программа вверх щупа
{
if (uph1 = 0) //Если, щуп не замкнут на землю, то
{
pump = 1; //Включение помпы
auto1 = 1; //Включение клапана автоподкачки
}
else //Если, уровень воды достиг до щупа и замкнул цепь на землю, то
{
pump = 0; //Выключение помпы
auto1 = 0; //Выключение клапана автоподкачки
}
}

void down (void)//Программа низ щупа
{
if (downh2 = 1) //Если, щуп замкнут на землю
{
head = 0; //Выключение тена
}
else //Если, вода наже уровня, то
{
head = 1; //Включение тена
}
}

void podgot (void) //Подготовка МК
{
TRISA = 0b00000000; // направление работы ножек порта А
TRISB = 0b11111111; // направление работы ножек порта В
CMCON = 0x07; // отключение компараторов
PORTA = 0b00000000; // очищаем порт А
PORTB = 0b00000000; // очищаем порт Б
RBPU = 0;  // подтягивающие R (0-вкл, 1-выкл)
}

 

Поделиться сообщением


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Похожие публикации

    • Автор: pingyini
      Всем доброго времени суток. Решил я сделать "умную" электронную сигарету на arduino. Концепция заключается в кнопочном управлении мощностью посредством ШИМ, наличии экрана, и некоторыми защитами в виде ограничения максимального времени нажатия и уход камня в сон (режим пониженного энергопотребления) после N секунд простоя.
      Вводные: по нажатию кнопки запускается ШИМ и управляет полевиком, но в целях защиты я хочу ограничить время выполнения кода до 7 секунд(что бы при случайном зажатии кнопки в кармане не получить травматическую ампутацию конечностей)

      Проблема пришла откуда не ждали - обработка нажатой основной кнопки срабатывает как попало. Нажимая кнопку обработчик может сработать сразу и отработает как по маслу, а может и через 5 нажатий не сработать вовсе.  Проверял в живую на Arduino UNO, Pro Mini (328е Меги) и в Proteus'е. Симптомы одни и те же.  Проблема очевидно в коде но я в упор не вижу в чем может быть загвоздка. Уровень у меня "штота умею" поэтому не судите строго. 
       
      #define pwmPin 5 #define buttonStart 3 #define maxOnTime 7000 //максимальное время выполнения условия нажатой кнопки #define RED_LED 7 #define GREEN_LED 8 int power = 150; //boolean StartState; boolean StartStateFlag; //Флаг кнопки Старт unsigned long pressTime; void setup() { pinMode(pwmPin, OUTPUT); pinMode(buttonStart, INPUT); pinMode(RED_LED, OUTPUT); pinMode(GREEN_LED, OUTPUT); Serial.begin(9600); //чисто для отладки } void loop() { if (digitalRead(buttonStart) && StartStateFlag && ((millis() - pressTime) <= maxOnTime)) { // (1) если кнопка старт нажата И была отпущена И нажата менее 7 секунд выполняем: analogWrite(pwmPin, power); //запуск ШИМ Serial.println("PWM_ON"); digitalWrite(GREEN_LED, HIGH); digitalWrite(RED_LED, LOW); } else { // (2) иначе StartStateFlag = false; // кнопка небыла отпущена analogWrite(pwmPin, 0); digitalWrite(GREEN_LED, LOW); Serial.println("PWM_OFF"); pressTime = millis(); } if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата analogWrite(pwmPin, 0); //остановка ШИМ Serial.println("PWM_OFF"); digitalWrite(RED_LED, HIGH); StartStateFlag = true; //была отпущена и можно входить в условие с нажатой кнопкой (1) } } И файлы: сам скетч, .elf и .hex для шПротеуса и проект Протеус.
      P. S. ШИМ в Протеусе не работает в принципе, в железе все ОК 
      BUTTON_TEST.ino
      BUTTON_TEST.ino.eightanaloginputs.hex
      BUTTON_TEST.ino.elf
      BUTTON_TEST.ino.with_bootloader.eightanaloginputs.hex
      ButtonTest.pdsprj
    • Автор: Александр Липатов
       
       Нужна кнопка с импульсным принципом работы на 12В. Т.е При нажатии кнопки контакт замкнулся "I" и отщелкнулся обратно в "0" а кнопка осталась вдавленной пальцем . . Этакая кнопка-щелкунчик. Как технически правильно называется КНОПКА не знаю. 
    • Автор: Vanyok_333
      Уважаемые форумчане, хотел бы задать вам задачку. Условие такое надо кнопкой без фиксации включать и выключать питание прикуривателя. Питание 12вольт, сила тока на прикуриватель 10ампер. После выключения авто питание на прикуриватель должно пропадать, а после включения  авто должно оставаться выключенным, до тех пор пока снова его не включишь кнопкой. Желательно сделать схему надежную, чтобы сделать и к этому вопросу не возвращаться(чтобы элементы были надёжный). На схему нужно добавить индикацию включённого прикуривателя (когда на него подается питание). Ну и конечно по возможности простое и компактное. Заранее говорю Спасибо, умным головам)
    • Автор: Arseniy Popov
      Добрый день! Необходимо подобрать микроконтроллер, который будет получать команды по serial от esp8266 и димировать RGBW светодиод по следующему алгоритму: 
      https://docs.google.com/document/d/1FkPLiIgxleuDQn8pjihICQGRrMPXbwFzqCt6StQZjhU/edit?usp=sharing
      а также написать для него прошивку на си.
      Отвечать можете в телеграм arsenicum32 или сюда.
      Пишите цену / сроки, находитесь ли в МСК и/или в области.
    • Автор: Krokodil007
      Продам:
      ПКН-150-1, новые, в упаковках, 13 тыс.шт. по 3,5 руб/шт.
      ПКН-125, новые, в упаковках, 10 тыс.шт. по 7 руб/шт.
      Продажа от 100 шт. и более.
      При покупке всего количества возможна небольшая скидка.
      Саратовская обл.
      Возможна отправка почтой.




       



  • Сообщения

    • Одно дело ставить в ЛМ мидбасы с рабочим дипазоном длинн волн больше межосевого а другое ширики без фильтрации. Не думаю что вы сможете правильно отфильтровать и настроить гнутый линейный массив... а вот попробывать можете.
    • как сказал наш один *мудрец* - люди это наша нефть, потому не особо радуюсь )) , а доля от нефте доходов в ввп была выше в 90-е пока промышленность еще была как таковая , сейчас практически одно сырье , рост то есть , только вопреки) мы сейчас меньше поставляем металла на предприятия , в основном стройка , если они надуют мыльный пузырь с ипотекой , то и приедем)  там свои законы , своя страна) я  металл туда поставлял , и только что видел говорю)
    • Даже больше по расчету. I/t = U/L = 150B/2мкГн = 75А/мкс. Для схем с ОС по току в нижнем ключе выходной дроссель особенно важен. 
    • чуйка - это АЧХ, а далее уже идут махинации для получения наиболее красивой цифры.   Но если у АС в диапазоне 80-200Гц чуйка будет 90 дБ, а на 1 кГц 106 дБ, нам придется убавлять 1 кГц, чтобы от такой распрекрасной АЧХ не возненавидеть всё и вся.
    • Как лицо приближённое к императору, мне бы для позитивного, отпимистичного  взгляда на деятельность Сколково, хватило бы хотя бы одним глазком, увидеть хоть одну бумажку/шильдик, где русскими буквами было бы написано "...разработано в Сколково..." Сколько времени уже прошло, уж давно  порабы, ....а так  - да,  дети у нас хорошие красивые, а всё что делаем руками - ....  С уважением, Сергей
    • Не страшно. При первом подключении АБ выровняются по напряжению и зарядятся. Только процесс дольше продлиться. Если АБ живые, естественно.
    • fant, я просто высказал свое мнение как это все видится мне, а вы можете дальше читать суркова и слушать пропагандонов о том что все прекрасно и экономика растет небывалыми темпами