Например TDA7294

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

Текущее время: Сб авг 23, 2025 18:39:12

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


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



Начать новую тему Ответить на тему  [ Сообщений: 509 ]    , 2, , , ...  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 22:59:58 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Ты читать умеешь? Чтобы у порта работала подтяжка, её нужно ГЛОБАЛЬНО разрешить, за это отвечает бит PUD в регистре SFIOR. Сейчас у тебя порт находится БЕЗ ПОДТЯЖКИ, как и прежде потому что она запрещена для всего контроллера.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:12:22 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 884
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6077
Откуда: Minsk
Рейтинг сообщения: 0
Alexeyslav писал(а):
и установить бит PUD в регистре SFIOR

Точнее, сбросить, т.е. записать 0. Это состояние по умолчанию ( initial value ) .

Цитата:
Так что не обязательно слушатся знакомого программиста

И незнакомого форумиста :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:16:25 
Встал на лапы

Карма: -1
Рейтинг сообщений: -2
Зарегистрирован: Сб авг 11, 2012 22:31:57
Сообщений: 91
Рейтинг сообщения: 0
Можно код плиз? Я уже 5 часов долбаюсь как разрешить глобальную подтяжку? Просто не знаю как это прописать в IARе?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:26:51 
Встал на лапы

Карма: -1
Рейтинг сообщений: -2
Зарегистрирован: Сб авг 11, 2012 22:31:57
Сообщений: 91
Рейтинг сообщения: 0
#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
DDRC=255; //Все порты C как выход (для светодиода)
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.

while (1) //Организовываем бесконечный цикл
{
if (PINA==(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
{
PORTC&=(~(1<<4));
}
}


}



DDRA=255; //было 0, исправил на 255, теперь вроде слушается) Есть замечания по коду?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:33:42 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 79
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 904
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
nikityan писал(а):
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?

Весело тут у вас :))

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:42:57 
Держит паяльник хвостом
Аватар пользователя

Карма: 10
Рейтинг сообщений: 79
Зарегистрирован: Ср апр 16, 2008 13:22:54
Сообщений: 904
Откуда: Приднестровье, Тирасполь
Рейтинг сообщения: 0
Код:
#include <ioavr.h>
#include <intrinsics.h>

int main( void )
{
DDRC|=(1<<4);
DDRA=0x00;
PORTA|=(1<<4);

while (1)
{

if (PINA&(1<<4)) //если состояние 1 то светодиод горит
{
PORTC|=(1<<4);
}
else
{
PORTC&=~(1<<4);
}

}
}

_________________
Любой, заслуживающий внимания, опыт приобретается себе в убыток...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пн ноя 05, 2012 23:50:27 
Встал на лапы

Карма: -1
Рейтинг сообщений: -2
Зарегистрирован: Сб авг 11, 2012 22:31:57
Сообщений: 91
Рейтинг сообщения: 0
Спасибо мужик! Всё стало хоть как то понятно! Благодарю! Работает!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Вт ноя 06, 2012 01:21:54 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн ноя 05, 2012 22:23:32
Сообщений: 126
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Alexeyslav писал(а):
В даташите черным по английски нарисована именно такая же табличка. Так что не обязательно слушатся знакомого программиста - иногда быстрее и точнее найти это в даташите.


Ну так это было тогда, когда я осваивал микроконтроллеры. Сейчас то я пдфы юзаю)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Ср ноя 07, 2012 13:22:35 
Поставщик валерьянки для Кота
Аватар пользователя

Карма: 12
Рейтинг сообщений: 67
Зарегистрирован: Пт авг 27, 2010 05:57:06
Сообщений: 2482
Откуда: Тюмень
Рейтинг сообщения: 0
Goodefine писал(а):
nikityan писал(а):
DDRA=255; //Все порты A как выход
PORTA|=(1<<4); //Сделали на порте A4 логическую 1, то есть включился подтягивающий резистор.
...
if (PINA==(0<<4)) //если состояние 0 то светодиод тухнет
...
}
теперь вроде слушается) Есть замечания по коду?

Весело тут у вас :))

надо писать не весело тут у вас, а КОШМАР бедный контроллер, подтяжку без резистора установили. Ноги не отгорели случайно?
Работать может только от того, что внутри кристалла происходит падение напряжения и на PINA от этого получается в логической единице.Но есть одно НО, зато какое!!!! Порт может испортиться либо весь контроллер выйдет из строя.

PS обсуждение про ШИМ это походит на оффтопик.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Чт ноя 08, 2012 02:20:07 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4570
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Перенёс все оффтопные посты в новую тему viewtopic.php?f=20&t=80250 .


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопросы по С/С++ (СИ)
СообщениеДобавлено: Пт ноя 09, 2012 17:27:23 
Родился
Аватар пользователя

Зарегистрирован: Пт ноя 09, 2012 17:22:37
Сообщений: 17
Откуда: Москва
Рейтинг сообщения: 0
Доброго времени суток Уважаемые!
Вопрос покажиться глупым, но это факт!
Код:
#include <avr/interrupt.h>
#include <avr/io.h>
unsigned char button = 0;

ISR (TIMER0_OVF_vect) // Обработка прерывания таймера_0
{
         if ((PIND&0x80) == 0)
{ delay_ms(50); button++;}
if (button == 8)
{ button = 0;}
delay_ms(100);
}
/*** процедура задержки в микросекундах ***/
void delay_us(unsigned char time_us)
{ register unsigned char i;
for(i = 0; i < time_us; i++) // 4 цикла
{ asm (" PUSH R0 "); // 2 цикла
asm (" POP R0 "); // 2 цикла
// 8 циклов = 1 us для 8MHz
}
}
/*** процедура задержки в милисекундах ***/
void delay_ms(unsigned int time_ms)
{ register unsigned int i;
for(i = 0; i < time_ms; i++)
{ delay_us(250);
delay_us(250);
delay_us(250);
delay_us(250);
}
}
int main (void)
{
DDRD = 0x00; // Порт "D" - вход
PORTD = 0xFF; //Включены подтягивающие резисторы
DDRB = 0xFF; // Порт "B" - выход
TIMSK |= (1 << TOIE0); // Разрешение прерыванияя
TCCR0 |= (0 << CS02)|(0 << CS01)|(1 << CS00); // без пределителя
sei();    // глобальное разрешение прерываний

while(1)
{

if (button == 0) PORTB = 0x01;  // это просто сделал для проверки работоспособности
if (button == 1) PORTB = 0x02;
if (button == 2) PORTB = 0x04;
if (button == 3) PORTB = 0x08;
if (button == 4) PORTB = 0x10;
if (button == 5) PORTB = 0x20;
if (button == 6) PORTB = 0x40;
if (button == 7) PORTB = 0x80;

}

}

теоретически в функции обработке прерывания от таймера_0 должен проходить опрос кнопки! В AVR Studio когда включаю режим отладки, всё красиво, курсор проходит через эту функцию и проверяет кнопку, но вот в Proteuse работать не хотит эта прошивка! такое ощущение что переменная "button" либо не сохроняет новое значение, либо не записывается новое значение.
Уважаемые профессионалы, поясните мне пожалуйста, с чем это связано, и почему так выходит? перерыл уже весь инет, но во многих стотьях не однократно используют такой метод опроса кнопок!
Ни чего не понимаю что не так? Либо я дурак, лидо лыжи не едут
За ранее спасибо!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 18:09:03 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4570
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Цитата:
но во многих стотьях не однократно используют такой метод опроса кнопок!
Покажите, в каких стОтьях так кнопки опрашивают :)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 20:12:19 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
Жестак... у тебя ОСНОВНАЯ программа практически не выполняется - ей не хватает времени!

Вот контроллер входит в обработчик прерывания от таймера... и ждет 150мс, при этом НЕ ОТДАЕТ УПРАВЛЕНИЕ, прерывание заканчивается выполняется одна инструкция из основной программы и тут БАЦ снова прерывание... в итоге у тебя основной код выполняется со скоростью 1 инструкция в 150мс и при этом каждую инструкцию идет инкремент твоей переменной. В результате в основной программы срабатывание ХОТЯБЫ ОДНОГО условия - очень маловероятное событие.

УБЕРИ с прерывания задержки! Любые задержки!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 20:22:29 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4570
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Видимо, на одном форуме мало нормальных ответов (?), надо ещё на нескольких запостить... http://forum.cxem.net/index.php?showtopic=116605


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 20:23:19 
Родился
Аватар пользователя

Зарегистрирован: Пт ноя 09, 2012 17:22:37
Сообщений: 17
Откуда: Москва
Рейтинг сообщения: 0
Аlex пожалуйста
http://avrlab.com/node/364
Аlex, вы меня конечно извените, но если вы с того форума, то очень жаль что вы меня там закляпали! я вам там очень многое хотел сказать! первое что хотел это то, что вы очень много критекуете, а помочь по делу видать не в вашей компитенции!


Alexeyslav
спасибо вам, кое что понял, ща попробую! Попробывал убрать все задержки в прерывании, и добавил в основную программу тупо PORTC++; ну что бы там хоть что то ещё выполнялось! но как то безрезультатно :cry:


Последний раз редактировалось RGB Пт ноя 09, 2012 21:04:56, всего редактировалось 3 раз(а).

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 20:28:44 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4570
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
RGB писал(а):
Аlex пожалуйста
http://avrlab.com/node/364
:facepalm:

Цитата:
я вам там очень многое хотел сказать!
У Вас будет такая возможность через сутки, не переживайте :)

Цитата:
вы очень много критекуете
Т.е. получается, что Вы, придя на форум и задавая вопрос, мечтаете увидеть только то, что хотите увидеть ? Типа - я критики не хочу, и те кто критикует - флудят !
Нет уж, уважаемый, такого не будет. Будьте любезны ожидать даже того, что Вам неприятно. А если не хотите видеть подобного - не ходите по форумам, а сидите и курите буквари.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 22:07:06 
Друг Кота

Карма: 28
Рейтинг сообщений: 568
Зарегистрирован: Чт май 05, 2011 21:26:34
Сообщений: 4550
Откуда: Украина, Славутич
Рейтинг сообщения: 0
И какого результата нет? ПортC щелкает? как быстро?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 22:33:27 
Родился
Аватар пользователя

Зарегистрирован: Пт ноя 09, 2012 17:22:37
Сообщений: 17
Откуда: Москва
Рейтинг сообщения: 0
Да вообще ни какого! Порт С щёлкает. Ну если верить протеусовскому осцилографу то на пине C.1 = 1 us а на пине C.5 = 2.5 us очень быстро

Аlex: я не спорю, критика нужна, но в меру! вы подскажите в каком направлении двигаться, а то (цитата с форума "паяльник" - Где это видано, что в обработчике таймера так опрашивались кнопки ? Извращение одним словом....) вы бы подсказали хоть статейку нормальную в таком случае, раз уж вы профессионал! К сожалению у меня небыло информатики, и приходиться всё изучать самому!

Минуточку! Добавил в основной цикл задержку, появились первые позывы :) Вроде как переключается, но уж слишком быстро инкрементируется переменная button. Уважаемый Alexeyslav как тогда бороться с этим? если в обработчик прерываний нельзя вносить задержки?


Последний раз редактировалось RGB Пт ноя 09, 2012 22:58:35, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 22:56:19 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4570
Откуда: Планета Земля
Рейтинг сообщения: 5
Медали: 1
Получил миской по аватаре (1)
Настраивайте свой таймер так, что-бы получить такты для опроса входов, миллисек. на 20, примерно. Можно сделать по 1 мс. (они потом Вам пригодятся), и в обработчике создать счётчик до 20.
Далее, нужно ловить изменения и устанавливать флаги, которые будут обрабатываться основным циклом. Изменения ловятся просто - считываем значение входа в темповский флаг, сравниваем этот флаг с предыдущим значением (с прошлого такта) и сохраняем его для следующего опроса (он потом будет предыдущим). При сравнении смотрим изменение, если текущее значение - отжата и предыдущее - нажата, то считаем кнопку кликнутой, устанавливая глобальный флаг кликнутой кнопки.
В основном цикле просто проверяем этот флаг и , если он установлен, сбрасываем его и выполняем необходимые действия, связанные с нажатием этой кнопки.
Имеем быстрый (не зацикленный) обработчик; текущее состояние кнопки; можем ловить как отжатие, так и нажатие; добавив ещё один счётчик, привязанный к кнопке, имеем возможность обрабатывать нажатия любой длительности.
Ну вот как-то так....


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Помогите опросить кнопку
СообщениеДобавлено: Пт ноя 09, 2012 23:23:15 
Родился
Аватар пользователя

Зарегистрирован: Пт ноя 09, 2012 17:22:37
Сообщений: 17
Откуда: Москва
Рейтинг сообщения: 0
Аlex А вот теперь от души вам огромное человеческое СПАСИБО!
Буду пробывать, но уже завтра.


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

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


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

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


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

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


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