Перейти к содержанию

Atmega8 управляет двумя рэле


Рекомендуемые сообщения

Это моя первая программа ( не считая мигания светодиодов, бегущей дорожки и других простейших примеров программирования)

 

Общее описание

ATmega должна управлять 2мя реле (вообще их будет 8), естественно через ключи, по нажатию соответсвующей нефиксируемой кнопки включать, при следующем нажатии отключать

 

Схематический пример (вместо реле светодиод)

post-3392-1309353283_thumb.jpg

 

и код который я сам написал (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 если ее держать то он мигает.

Тоесть мне бы хотелось чтобы при первом же нажатии на кнопку нужное реле тут же включалось, а при повторном нажатии этой же кнопки выключалось

 

Может это както связано с "дребезгом" но я еще не знаю как с ним бороться?

А может я совсем не по тому пути пошел, но он пока единственно мне известный))))))))

Может есть идеи...

Изменено пользователем dirvel
Ссылка на комментарий
Поделиться на другие сайты

Гость Алексей (ohmjke)

Для начала, зачем 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;
}

Изменено пользователем Алексей (ohmjke)
Ссылка на комментарий
Поделиться на другие сайты

Для начала, зачем PORTB.0= rele[a]; и PORTB.1= rele; заключены в скобки? .

Зачем для этого применять массивы? Мне не понятно. Я бы сделал так:

 

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

 

пробовал твой код, CodeVisionAvr не знает команды ignore.....

Ссылка на комментарий
Поделиться на другие сайты

Гость Алексей (ohmjke)
дело в том, Алексей, что я только начал чтото пробовать в программировании и исходил из примеров данных на этом и других сайтах....так в одном примере я заметил что масивом дают команды портам мигать светодиодом...и начал от этого отталкиваться.

 

пробовал твой код, CodeVisionAvr не знает команды ignore.....

 

Да я понял, что ты начинающий, просто хотел уточнить, вдруг в этом скрыт какой-то тайный смысл :smile:

Игнор это не команда, а переменная, флаг. Объяви её

bit ignor = 0;

 

Т.е. ты нажимаешь кнопку, и соответствующий светодиод меняет состояние на противоположное - был включен, значит выключается, и наоборот. Чтобы это действие выпонлнилось один раз как раз таки и нужен флаг ignor, т.е. бит порта не будет изменять значение(разумеется, кроме одного раза), пока ты не отпустишь кнопку, т.е. пока PIND.1 и PIND.0 не будут равны единице, а когда они равны единице флаг сбрасывается в 0.

Изменено пользователем Алексей (ohmjke)
Ссылка на комментарий
Поделиться на другие сайты

Алексей....обьявил "флаг" как ты описал - все заработало, и без всяких глюков с миганием.....

 

Спасибо.... :smile:

Изменено пользователем dirvel
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...