Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
1

Подключение кнопки к порту

16.11.2014, 00:43. Просмотров 1362. Ответов 14
Метки нет (Все метки)

Есть физический переключатель (1 положение - замкнуто 2 проводка, 2- разомкнуто). Подключаю один провод из этого переключателя к питанию VCC, второй провод подключаю к порту B1. Вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(void)
{
    preset();
    //2200-max
    //500-,min
    //18 ms достаточно для пол оборота
    int i = 35;
    int i1 = 500;
    int i2 = 2200;
while (1)
{
 
    
    if (PINB & 0b00000010)
    
        OCR1A = i1; 
    else
            OCR1A = i2;
}       
}
В presets прописано (закоментировал на всякий пожарный):
C
1
2
3
DDRD = 0xFF; // port D5(OC1A) set to output (signal to servo)
    DDRB = 0x00; // all B ports to input
    PORTB = 0xFF;
OCR1A = i1 задаю положение сервопривода (проверено и работает в чистом виде).

Схему того, как подключал прикрепил.
0
Миниатюры
Подключение кнопки к порту  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2014, 00:43
Ответы с готовыми решениями:

подключение USBASP v2.0 к COM порту. как, если это USB устрйоство?
Доброй ночи! Купили мк ATMega8515 и програматор USBASP v2.0. Установил дрова...

Подключение кнопки, удаленной на 300 метров
Добрый день! Возник такой вопрос: кнопка, посылающая информацию МК будет...

Вход-выход на порту в МК
хотел на одном порту сдеать вход на кнопку выход на свето диод но при запуске в...

Несколько микроконтроллеров к одному COM-порту
Делать такую штуку вроде бы пока не собираюсь из за ненадобности, просто...

Не работает прерывание по порту B в PIC16F887 (MikroC)
Всем привет. Учусь программировать ПИК контроллеры в Си а именно(16f887), для...

14
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 08:09 2
Лучший ответ Сообщение было отмечено Stas_Garcia как решение

Решение

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

Цитата Сообщение от Stas_Garcia Посмотреть сообщение
PORTB = 0xFF;
При отжатой кнопки у Вас с порта читается 1 и при нажатой тоже 1

А где инициализация таймера?
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
if (PINB & 0b00000010)
Такой метод чтения кнопки хорош только для "протеуса" и препода. В реальности надо писать защиту от дребезга.

Не по теме:

P.S. Модератор, не знал как разместить сообщение после картинки поэтому разбил на два, думал что движок форума сам соединит в одно, а он :cry:

1
Миниатюры
Подключение кнопки к порту  
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 13:32  [ТС] 3
Цитата Сообщение от Витальич Посмотреть сообщение
При отжатой кнопки у Вас с порта читается 1 и при нажатой тоже 1
Почему? В протеусе тоже неадекватно себя ведет кнопка с таким кодом.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 13:50 4
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
DDRD = 0xFF; // port D5(OC1A) set to output (signal to servo)
DDRB = 0x00; // all B ports to input
PORTB = 0xFF;
Вы включили встроенный подтягивающий резистор PORTB = 0xFF; При чтении на PINB у Вас будет 1
Вы нажали кнопку, насколько я понял Ваш рисунок, замкнули её на питание, при чтении PINB опять единица.
1
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 13:51  [ТС] 5
Цитата Сообщение от Витальич Посмотреть сообщение
Вы включили встроенный подтягивающий резистор PORTB = 0xFF
Да я его потом включил, до этого без него тоже не работало.
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 13:54 6
Приводите весь код, а не кусочки, а также схему из протеуса(скриншот картинкой)
0
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 14:10  [ТС] 7
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#define F_CPU 8000000//10000000L
#include <avr/io.h>
#include <util/delay.h>
 
void preset(){
    
    //DDRD = 0xFF;
    DDRD = 0xFF; // port D5(OC1A) set to output (signal to servo)
    DDRA = 0xFF; // all A pins to output
    PORTA = 0xFF;// all a ports are ON
    DDRB = 0x00; // all B ports to input
    DDRC = 0x00;
    PORTC = 0x00;
    
    //DDRB = 0xFF;
    
//TCCR1B = (1<<WGM13)|(1<<WGM12)|(1<<CS10);
//TCCR1A = (1<<COM1A1)|(1<<WGM11);
TCCR1B =0b00111001;
TCCR1A = 0b10000010;
 
 
ICR1 = 8999;
    
}
 
int main(void)
{
    preset();
    //2200-max
    //550-,min
    //18 ms достаточно для пол оборота
    int i = 50;
    int i1 = 600;
    int i2 = 2200;
 
            
            if (PINB & (1<<PINB0))
            {
                OCR1A=i1;
            } 
            else
            {
                OCR1A=i2;
            }
            
                
}
При таком раскладе если схему в протеусе включать при отжатой кнопке, то встает в одно положение, а при зажатой в другое. Но если нажимать во время работы программы, то не меняется ничего.

Да, еще можно было условие поставить в беск цикл.
0
Миниатюры
Подключение кнопки к порту  
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 14:16  [ТС] 8
дел
0
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 14:21 9
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
Да, еще можно было условие поставить в беск цикл.
не можно, о нужно
1
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 14:30  [ТС] 10
Цитата Сообщение от Витальич Посмотреть сообщение
нужно
Ну картина не поменялась. Разве что, если сначала кнопку в положение откл, а во время работы во вкл, то поменяется положение мотора, если снова кнопку в положение выкл, то так и останется все, т.е. else выполняется только 1 раз.

Добавлено через 5 минут
Подключил по этой схеме все физически. При переключении переключателя в положение "разомкнуто" моторчик становится в одно положение, при переключении в положение "замкнуто" моторчик начинает дрыгаться)
0
уни
327 / 106 / 12
Регистрация: 06.03.2010
Сообщений: 234
16.11.2014, 15:09 11
Сервоприводу параметры вручную выставили? Там нужно указать напряжение импульса, период, нарастание, спад, ширину импульса. То же касается реального сервопривода. Насколько я помню, частота должна быть 50 Гц, ширина варьируется от 1 до 2 мсек: http://www.rc-auto.ru/articles_elekton/id/432/

Посмотрите анализатором реальный вид импульсного сигнала при разных условиях.
1
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 15:33  [ТС] 12
Цитата Сообщение от уни Посмотреть сообщение
Сервоприводу параметры вручную выставили?
С ее позиционированием проблем ровно 0. Все прекрасно работает с теми настройками, что я выставил для таймера. Не знаю что я делаю не так, но пока не получилось нормально ни одну кнопку к мк подключить.

Добавлено через 20 минут
Кажется разобрался. МК не воспринимает 0 как 0. Подключил еще к ножке приема сигнала Землю через резистор. Сейчас еще потестирую и отпишусь)
0
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 15:41  [ТС] 13
Да. Если кому понадобится, то вот схема: резистор у меня на 100 Ом.
0
Миниатюры
Подключение кнопки к порту  
Витальич
1274 / 1184 / 174
Регистрация: 02.12.2013
Сообщений: 4,886
16.11.2014, 15:46 14
Цитата Сообщение от Stas_Garcia Посмотреть сообщение
МК не воспринимает 0 как 0. Подключил еще к ножке приема сигнала Землю через резистор
Цитата Сообщение от Витальич Посмотреть сообщение
При разомкнутом контакте кнопки не рекомендуется оставлять порт подвешенным в воздухе, порт нужно притянуть
Мой первый ответ с картинкой
1
Stas_Garcia
Ушел наливать чай
187 / 137 / 32
Регистрация: 02.03.2013
Сообщений: 652
16.11.2014, 15:47  [ТС] 15
Цитата Сообщение от Витальич Посмотреть сообщение
Мой первый ответ с картинкой
Да, именно) Спасибо за помощь.
0
16.11.2014, 15:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2014, 15:47

Логическая единица 1.78V на порту JTAG на ATMega32
Miko32, JTAG выключен через fuse bit. Не могу понять почему на порту PC5 (TDI)...

Слетает один бит в порту (глюк компилятора?)
есть такое определение пинов #define HC595_PORT PORTC #define ...

Не получается по СОМ порту компьютера принять переданные с USARTA-stm32F429 данные
Обучаюсь программировать микроконтроллер на отладочной плате...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru