Например TDA7294

Форум РадиоКот • Просмотр темы - Подключение нескольких кнопок к ATmga8A
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 16, 2024 17:11:20

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 26 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 09:00:52 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Доброго всем дня.

Подскажите, пожалуйста, как объединить код, с помощью какой функции? Заранее большое спасибо.
На основе ATmga8A собрана схема: 4 кнопки через резисторы подсоединены к 4 портам В на вход, на выходе D есть семисегментный индикатор. При не нажатой кнопке горят все сегменты, при нажатии первой кнопки выводится число 0, второй - 1, третьей - 2, четвертой - 3. По отдельности код работает исправно, но как объединить, не знаю.

Код для вывода числа 2 с помощью третьей кнопки:
#include <avr/io.h>

#define F_CPU 8000000L
#include <avr/io.h>
//#include <util/delay.h>

int main(void)
{
unsigned char butcount=0;

DDRD = 0xFF;
DDRB = 0x00;
PORTD = 0b00000000; // 1 2 3 4 5 6 7 8
//PORTB = 0b00000001;// 0b|dp|g|f|e|d|c|b|a
//PORTB = 0b00000010;
PORTB = 0b00000100;
//PORTB = 0b00001111;
//PORTB = 0b00001111; Запитаны 4 ноги порта В, чтобы 4 кнопки реагировали.

PORTD = 0b0111111; //0
PORTD = 0b0000110; //1
PORTD = 0b1011011; //2
PORTD = 0b1001111; //3
PORTD = 0b1111111; //8


while (1)
{
if (!(PINB&0b0111111))
{
PORTD = 0b10100100;
}
else
{
PORTD = 0b00000000;
}



}
}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 09:28:22 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1289
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4510
Откуда: Планета Земля
Рейтинг сообщения: 1
Медали: 1
Получил миской по аватаре (1)
Не понятно, что Вы и с чем хотите объединить. Поподробнее объясните.

PS: На форуме уже есть тема по кнопкам, посмотрите, может чего подчерпнёте оттуда - viewtopic.php?f=61&t=79801


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 09:50:35 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Нужно объединить коды, с помощью которых кнопки выводят определенные заданные цифры, в один код. То есть на схеме 4 порта (начиная с верхнего №14) должны быть запитаны одновременно. При нажатии на верхнюю кнопку индикатор показывает 0, на следующую - 1 и т. д. Если объединяю условия if по отображению чисел в цикл while, то программа Atmel рассматривает код как неправильный. И как сделать так, чтобы 4 порта
PORTB = 0b00000001;
PORTB = 0b00000010;
PORTB = 0b00000100;
PORTB = 0b00001000;
в коде были подключены, и не ругалась на это программа?

В Вашей ссылке, к сожалению, не совсем та информация, которая мне нужна на этот случай. Мне бы понять, как собрать код из четырех для вывода разных цифр, и в Atmel получился бы корректный hex.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 10:04:15 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
вложи каждую следующую проверку в елзе предыдущей, а все сегменты зажигай только внутри елзе самой вложенной проверки.
или на свитч — кейс перепиши, там всего 1 раз условие вводить надо будет.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

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

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 10:25:28 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
То есть если на свитч, то:

void segchar (unsigned char seg)
{
switch (seg)
{
case 1: PORTD = 0b11000000; break;
case 2: PORTD = 0b11111001; break;
case 3: PORTD = 0b10100100; break;
case 4: PORTD = 0b10110000; break;
}
}

А если else:

else
{
{
else
}
PORTD = 0b00000000;
}

Или опять совсем не так?


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 10:56:18 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 3
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
разбивайте большую задачу на меньшие, меньшие на маленькие, маленькие на малюсенькие, и так до тех пор, пока дальнейшее разбиение уже не будет делать решение для вас более понятным.
Прочтите вот эту статью о самом принципе программирования

Ваша задача крайне просто решается, просто у вас нет системного подхода к решению.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 11:25:47 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Спасибо за статью. Буду делать дальше, обязательно напишу, что получилось или не получилось. Думаю, будут еще вопросы по этой задаче, так как только начинаю учить программирование, пока что слабо в нем ориентируюсь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 12:14:35 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
почти:
switch (PINB|0x0F)
{
case 0: PORTD = 0b00000000; break;
case 1: PORTD = 0b11000000; break;
case 2: PORTD = 0b11111001; break;
case 4: PORTD = 0b10100100; break;
case 8: PORTD = 0b10110000; break;
}

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 13:58:56 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Спасибо большое. Получается в свитч операторе пишется условие для 5 вариантов, включая случай, когда индикатор показывает все сегменты:

switch (PINB|0x0F)
{
case 0: PORTD = 0b00000000; break;
case 1: PORTD = 0b11000000; break;
case 2: PORTD = 0b11111001; break;
case 3: PORTD = 0b10100100; break;
case 8: PORTD = 0b10110000; break;
}

И половину битов выставляем со значением 1. А что тогда написать в while? Если остается только одно условие, цифры для индикатора помещены в свитч, то там должен быть код на нажатие кнопки? Свитч лучше помещать до или после main?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 14:15:27 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
mnirti писал(а):
switch (PINB|0x0F)
{
case 0: PORTD = 0b00000000; break;
case 1: PORTD = 0b11000000; break;
case 2: PORTD = 0b11111001; break;
case 3: PORTD = 0b10100100; break;
case 8: PORTD = 0b10110000; break;
}
Изображение

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 14:25:28 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Подскажите, пожалуйста, почему нельзя выводить цифру 3?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 14:28:26 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
mnirti писал(а):
почему нельзя выводить цифру 3
потому что

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 14:36:50 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Не надо смеяться, подскажите, в чем ошибка. Учу программирование меньше недели, конечно, мне очень многое еще непонятно. Тем более, что стыдно не не знать, а не спрашивать и ничему не учиться. Просто выполняю упражнение, одно из многих.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 14:43:16 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
Не надо смеяться, подскажите, в чем ошибка.

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

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Чт май 25, 2017 16:41:14 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
да, это, так, :? хотел просто пример привести использования свитч - кейс (но, чтобы у ТС возникли вопросы, а времени, чтобы по уму пример сделать не хватило)
что я накосячил 4 = 0b00000100, а можно написать (1<<2) это значит 1 сдвинутая на 2 бита - так удобней искать нужную ногу (такая запись какраз и обозначит, в контексте примера, PINB.2).
в этом примере также не учтено, что при нажатии кнопки она делается 0, а не 1 (т.е. "условие" надо сообразно твоей задаче написать).

Добавлено after 3 minutes 59 seconds:
в свитч - кейс всё просто - какой кейс по значению равен условию, тот и выполняется, если ни один не равен - выполняется default:, если он есть.

Добавлено after 10 minutes 45 seconds:
Свитч лучше помещать до или после main?
Конечно в майне (или в прерывании, или в подпрограмме), так просто "валяются" (вне функций) всякие #define, #include, описания глобальных переменных... но не сам код.
А если хочешь чтобы он не один раз выполнился (так обычно производятся первоначальные настройки железа), а работал постоянно - найди в майне цикл while (1) {}; (он внизу) и впиши в него.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Пт май 26, 2017 11:38:03 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
ARV, Ваша статья хорошая, но достаточно сложная для новичка. К тому же я знаю еще очень мало функций и их сочетаний.

Ivanoff-iv, спасибо за помощь. Свитч теперь в while, получается так:

while (1)
{
{
if (!(PINB&(1<<PINB0)))

butcount=0;


else
{
if (!(PINB&(1<<PINB1)))


butcount=1;

else

{
if (!(PINB&(1<<PINB2)))


butcount=2;

else

butcount=4;
}


}


}

switch (butcount)

{
case 0: PORTD = 0b00000000; break;
case 1: PORTD = 0b11000000; break;
case 2: PORTD = 0b11111001; break;
default: PORTD = 0b11111001; break;
}

}
}


В протеусе схема работает, только еще путаюсь с отображением цифр. А если нужно, чтобы при нажатых двух кнопках одновременно индикатор показывал еще какую нибудь цифру, как код дополнить?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Пт май 26, 2017 12:22:34 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
можно без переменной буткоунт и без ИФов обойтись: пинБ прямо в свитч пиши (там же и требуемые ему операции (инверсия, маскирование), а в кейс - требуемые результаты.
В общем — пиши без ИФов.

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Пт май 26, 2017 13:15:44 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
mnirti писал(а):
К тому же я знаю еще очень мало функций и их сочетаний.
не откладывая срочно изучайте! Изучайте не столько готовые (из стандартной библиотеки) функции, сколько сам принцип их создания: как описать, где разместить, что такое параметр, какие они бывают и как возвращается результат...

Все это есть в книгах.

Добавлено after 1 minute 2 seconds:
Ivanoff-iv писал(а):
пинБ прямо в свитч пиши (там же и требуемые ему операции (инверсия, маскирование)
зачем вы новичка учите плохому стилю программирования? научите хорошему, плохо он и без вас сделает.

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

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Сб май 27, 2017 08:54:42 
Друг Кота
Аватар пользователя

Карма: 46
Рейтинг сообщений: 2030
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 6618
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
тогда уж из кейса выносить знакогенератор - собрать для него массив констант со значениями PORTD для каждой цифры и присваивать нужный элемент, например: PORTD=SEG[2]; для вывода "2" на индикатор или даже сюда переменную задействовать. т.е. разделение блоков кода должно быть логически обоснованным, и если пинБ (и номер нажатой кнопки) больше нигде не используется - я считаю такой блок допустимым.

Добавлено after 3 minutes 13 seconds:
а в начале кода const unsigned char SEG[]={0b00010101,0b10001110,0b00000000}//0,1,2 (цифры в массиве от фонаря)

_________________
Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Подключение нескольких кнопок к ATmga8A
СообщениеДобавлено: Пн май 29, 2017 10:00:12 
Первый раз сказал Мяу!

Зарегистрирован: Вт май 23, 2017 15:41:09
Сообщений: 26
Рейтинг сообщения: 0
Код стал рабочим в таком случае:

{
if (!(PINB&(1<<PINB0)))

butcount=0;


else
{
if (!(PINB&(1<<PINB1)))


butcount=1;

else

{
if (!(PINB&(1<<PINB2)))


butcount=2;

else

if (!(PINB&(1<<PINB3)))


butcount=3;

else
butcount=4;
}

}

}

switch (butcount)

{

case 0: PORTD = 0b11000000; break;
case 1: PORTD = 0b11111001; break;
case 2: PORTD = 0b10100100; break;
case 3: PORTD = 0b10110000; break;
default: PORTD = 0b00000000; break;
}

}
}

Сначала горят все сегменты индикатора, при нажатии на кнопку от нулевой ножки появляется 0, отпускаю кнопку - опять все сегменты. Вторая кнопка - 1, третья - 2, четвертая - 3.

Но никак не получается сделать так, чтобы при нажатии двух кнопок одновременно появлялась цифра. Например, зажаты первая и третья кнопка, на индикатор подается число 5, вторая и четвертая - 6. Подскажите, пожалуйста, что добавить в свитч.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 26 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y