Заголовок сообщения: Помогите разобраться с простенькой задачей про кнопки
Добавлено: 08 авг 2010, 14:22
Зарегистрирован: 08 авг 2010, 13:51 Сообщения: 11
Учусь программировать микроконтроллеры AVR, Столкнулся с проблеммой, не могу запрограммировать контроллер на работу от одной кнопки. Задача такая, одной кнопкой на любом входе контроллера по очереди переключать две функции мигания светодиода на любом одном выходе, функции почти одинаковы по алгоритму работы, просто одна функция обеспечивает более быстрое мигание светодиода, чем другая, программирую на С++
хочу запрограммировать контроллер так чтобы он выполнял разные функции в зависимости от нажатия кнопки, но кнопки одной, а не нескольких. это примерно выглядело бы по анологии работы ёлочных герлянд, где при нажатии одной кнопки поочерёдно меняются разные мерцания светодиодов. в приведённой выше мной программе я создал две функции мерцания двух разных светодиодов красного и зелёного подключённых к ножкам Pc0 и Pc1 микроконтроллера Atmega 8 сконфегурированными на выход, функции создал почти одинаковыми только с разной частотой мерцания. хочу одной кнопкой подключённой к ножке Pb5 сконфегурированной на вход, поочерёдно менять функции, нажал кнопку мерцает один светодиод, отжал кнопку ничего не меняется продолжает мерцать тот же светодиод так же как и мерцал, нажал второй раз кнопку мерцает уже другой светодиод с другой частотой, отжал кнопку ничего не меняется продолжает мерцать тот же светодиод так же как и мерцал, нажал ещё раз (третий раз) мерцает опять первый светодиод также как и при нажатии первый раз
#include <delay.h>
int time_1 (); int time_2 ();
while (1) { while (PINB.5==1) {PORTC.0=0;}
while (PINB.5==0) {time_2 ();}
while (PINB.0==1) {time_2 ();}
while (PINB.0==0) {time_1 ();}
while (PINB.0==1) {time_1 ();} } }
int time_1 () { while (1) { // Place your code here PORTC.1=1; //зажигаем светодиод delay_ms(200); //пусть горит 200 милисекунд PORTC.1=0; //гасим светодиод delay_ms(200); //теперь не горит 200 милисекунд } return 0; }
int time_2 () { while (1) { // Place your code here PORTC.0=1; //зажигаем светодиод delay_ms(30); //пусть горит 30 милисекунд PORTC.0=0; //гасим светодиод delay_ms(30); //теперь не горит 30 милисекунд } return 0; }
Project : Version : Date : 08.08.2010 Author : Freeware, for evaluation and non-commercial use only Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
#include <mega8.h> #include <delay.h>
int time_1 (); int time_2 (); // Declare your global variables here
void main(void) { // Declare your local variables here
Project : Version : Date : 08.08.2010 Author : Freeware, for evaluation and non-commercial use only Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
#include <mega8.h> #include <delay.h>
int time_1 (); int time_2 (); // Declare your global variables here
void main(void) { // Declare your local variables here
Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
Добавлено: 08 авг 2010, 17:29
Зарегистрирован: 08 авг 2010, 13:51 Сообщения: 11
Я сталкивался с этим сайтом, ну не знаю может я такой слишком начинающий, не понятно составлено обучение, во первых куча не нужной и не понятной рекламы по продаже, во вторых пол часа читал его с начала естественно и понял что всё это время мне объясняли о том как важно дочитать этот курс до конца с выполнением всех примеров иногда выли вставки по теме программирования контроллеров, но тут же прерывались опять рекламой, и потом сразу же начался разговор о прерываниях, я понимаю что это важно и что с их помощью можно многое осуществить, но мне интересно можно ли осуществить алгоритм с помощью обычных циклических конструкций или операций ветвления на языке С, задачка выглядит вроде бы не сложной а я так и не смог её осуществить и в общем может у меня мало терпения и я хочу узнать побыстрей от других, может кто осуществлял такой алгоритм, наверное мне стоит ещё раз обратить внимание на этот сайт и поучить его побольше.
Project : Version : Date : 08.08.2010 Author : Freeware, for evaluation and non-commercial use only Company : Comments:
Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/
#include <mega8.h> #include <delay.h>
int time_1 (); int time_2 (); // Declare your global variables here
void main(void) { // Declare your local variables here
// Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00;
while (PINB.5==1)// Пока на пятом выводе регистра портов В логическая единица, то есть она ещё ни разу не была нажата, отжата в начальном положении. {PORTC.0=0;}// Установить на первом выводе регистра портов С логический ноль, то есть светодиод не горит.
while (PINB.5==0)// Как только на пятом выводе регистра портов В появился логический ноль, то есть нажали кнопку. {time_2 ();}// Запустили вторую функцию мигания светодиода
Дальше этого места программа не идёт
while (PINB.0==1)// После того как на пятом выводе регистра портов В появилась логическая единица, то есть отжали кнопку. {time_2 ();}// Оставляем включённой вторую функцию, то есть оставляем всё без изменения.
Или этого места В общем при первом нажатии кнопки вызывает вторую функцию и всё программа становится, дальше хоть нажимай, хоть не нажимай ни чего не изменится, будет выполняться вторая функция и всё. while (PINB.0==0)// Как только на пятом выводе регистра портов В появился логический ноль, то есть нажали второй раз кнопку. {time_1 ();}// Запустили первую функцию мигания светодиода
while (PINB.0==1)// После того как на пятом выводе регистра портов В появилась логическая единица, то есть отжали второй раз кнопку. {time_1 ();}// Оставляем включённой первую функцию, то есть оставляем всё без изменения. }
int time_1 () { while (1) { // Place your code here PORTC.1=1; //зажигаем светодиод delay_ms(200); //пусть горит 200 милисекунд PORTC.1=0; //гасим светодиод delay_ms(200); //теперь не горит 200 милисекунд } return 0; }
int time_2 () { while (1) { // Place your code here PORTC.0=1; //зажигаем светодиод delay_ms(30); //пусть горит 30 милисекунд PORTC.0=0; //гасим светодиод delay_ms(30); //теперь не горит 30 милисекунд } return 0; }
Заголовок сообщения: Re: Помгите разобраться с простенькой задчей
Добавлено: 08 авг 2010, 21:57
Зарегистрирован: 29 дек 2004, 23:15 Сообщения: 3744 Откуда: Санкт-Петербург
прог. языки: C, C++, C#, Asm
ФИО: Кашликов Сергей
Для того, чтобы программировать микроконтроллеры на языке С необходимо научиться писать и на обычном компьютере. Возьми книжку по Си, читай и изучай примеры. Ясень пень, если ты будет пытаться зажечь светодиод и при этом не разбираться в программировании на Си - то возникнут проблемы, которые друг друга задевают.
Бегло посмотрел код. В одном месте кнопка подключена в пятому биту, в другом - к нулевому. Может опечатка? И все заработает? И антидребезг вы делали как то странно. Как делают нормальный антидребезг: -увидеть факт нажатия - пауза - повторно увидеть факт нажатия - если второй раз нажато - выполнить действие, иначе нет - цикл ожидания ОТЖАТИЯ (иначе действие будет выполнено N раз)
Вы хотите по одной кнопке по очереди переключать два события (так я понял вашу задачу). Для этого нужна переменная-флажок (в вашем случае достаточно битовой переменной). Кнопка инвертирует переменную (было тру - стало фолс, было фолс - стало тру), а в основном цикле проверяется эта переменная и выполняется соответствующее действие.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения