Гость dirvel Опубликовано 29 Июня, 2011 в 13:46 Жалоба Поделиться Опубликовано 29 Июня, 2011 в 13:46 (изменено) Это моя первая программа ( не считая мигания светодиодов, бегущей дорожки и других простейших примеров программирования) Общее описание ATmega должна управлять 2мя реле (вообще их будет 8), естественно через ключи, по нажатию соответсвующей нефиксируемой кнопки включать, при следующем нажатии отключать Схематический пример (вместо реле светодиод) и код который я сам написал (CodeVisionAVR): #include <mega8.h> char a=0, b=0, i=0; void main(void) { char rele[2][1]={ {0b00000000}, {0b00000001}}; PORTB=0x00; DDRB=0xFF; PORTC=0x7F; DDRC=0x00; PORTD=0x01; DDRD=0x00; while (1) { if(PIND.0==0) { a++; if(a>1)a=0; } { PORTB.0= rele[a][i]; } if(PIND.1==0) { b++; if(b>1)b=0; } { PORTB.1= rele[b][i]; } } } тоесть при нажатии соответствующей кнопки PORTB.1 и PORTB.0 бегаеют по двум строчкам масива Суть проблемы в том что когда я жму на кнопку светодиод то включается то нет и при выключении то же самое ....пробовал с delay.h если ее держать то он мигает. Тоесть мне бы хотелось чтобы при первом же нажатии на кнопку нужное реле тут же включалось, а при повторном нажатии этой же кнопки выключалось Может это както связано с "дребезгом" но я еще не знаю как с ним бороться? А может я совсем не по тому пути пошел, но он пока единственно мне известный)))))))) Может есть идеи... Изменено 29 Июня, 2011 в 14:10 пользователем dirvel Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Алексей (ohmjke) Опубликовано 29 Июня, 2011 в 14:23 Жалоба Поделиться Опубликовано 29 Июня, 2011 в 14:23 (изменено) Для начала, зачем PORTB.0= rele[a]; и PORTB.1= rele; заключены в фигурные скобки? Если бы было else, тогда все ок, а так непонятно. Вообще, может это и не повлияет ни на что, но все же... Зачем для этого по нажатию соответсвующей нефиксируемой кнопки включать, при следующем нажатии отключать применять массивы? Мне не понятно. Я бы сделал так: if (PIND.0==0 && ignor!=1) { PORTB.0 = ~PORTB.0; ignor = 1; } if (PIND.1==0 && ignor!=1) { PORTB.1 = ~PORTB.1; ignor = 1; } if (PIND.1==1 && PIND.0==1) { ignor = 0; } Изменено 30 Июня, 2011 в 09:01 пользователем Алексей (ohmjke) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость dirvel Опубликовано 30 Июня, 2011 в 07:40 Жалоба Поделиться Опубликовано 30 Июня, 2011 в 07:40 Для начала, зачем PORTB.0= rele[a]; и PORTB.1= rele; заключены в скобки? .Зачем для этого применять массивы? Мне не понятно. Я бы сделал так: дело в том, Алексей, что я только начал чтото пробовать в программировании и исходил из примеров данных на этом и других сайтах....так в одном примере я заметил что масивом дают команды портам мигать светодиодом...и начал от этого отталкиваться. пробовал твой код, CodeVisionAvr не знает команды ignore..... Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Алексей (ohmjke) Опубликовано 30 Июня, 2011 в 09:00 Жалоба Поделиться Опубликовано 30 Июня, 2011 в 09:00 (изменено) дело в том, Алексей, что я только начал чтото пробовать в программировании и исходил из примеров данных на этом и других сайтах....так в одном примере я заметил что масивом дают команды портам мигать светодиодом...и начал от этого отталкиваться. пробовал твой код, CodeVisionAvr не знает команды ignore..... Да я понял, что ты начинающий, просто хотел уточнить, вдруг в этом скрыт какой-то тайный смысл :smile: Игнор это не команда, а переменная, флаг. Объяви её bit ignor = 0; Т.е. ты нажимаешь кнопку, и соответствующий светодиод меняет состояние на противоположное - был включен, значит выключается, и наоборот. Чтобы это действие выпонлнилось один раз как раз таки и нужен флаг ignor, т.е. бит порта не будет изменять значение(разумеется, кроме одного раза), пока ты не отпустишь кнопку, т.е. пока PIND.1 и PIND.0 не будут равны единице, а когда они равны единице флаг сбрасывается в 0. Изменено 30 Июня, 2011 в 09:08 пользователем Алексей (ohmjke) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость dirvel Опубликовано 30 Июня, 2011 в 10:21 Жалоба Поделиться Опубликовано 30 Июня, 2011 в 10:21 (изменено) Алексей....обьявил "флаг" как ты описал - все заработало, и без всяких глюков с миганием..... Спасибо.... :smile: Изменено 30 Июня, 2011 в 10:21 пользователем dirvel Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти