Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.10.2017, 14:24   #41
scccorp
Пользователь
 
Регистрация: 05.10.2017
Сообщений: 44
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
1. Дребезг контактов
2. Прерывание настроено на не "по фронту", а "по изменению уровня" .
А что надо: пока кнопка нажата - выдача набора сигналов, отпущена - исходное состояние? Тогда по таймеру отслеживать именно это событие: "ни одна не нажата -> исходное" .
ну по коду так и получаеться вроде
Код:
#include <avr/io.h>
#include <util/delay.h>



int main(void)
{
	DDRD=0xFF;
	PORTD=0b00000000;
	DDRB=0xC0;
	PORTB=0b00011111;
   while (1) 
       {		
		  _delay_ms(100);   
		   if(PINB==0b00000100)
		   {
			 PORTD=0b00000001;	
			 continue;
		   }
		   if (PINB==0b00001100)
		   {
			   PORTD=0b00000100;
			   continue;
		   }
		    if(PINB==0b00000010)
		    {
			    PORTD=0b00001000;
			    continue;
		    }
		    if (PINB==0b00000110)
		    {
			    PORTD=0b00010000;
			    continue;
		    }
			 if(PINB==0b00001001)
			 {
				 PORTD=0b00100000;
				 continue;
			 }
			 if (PINB==0b00001010)
			 {
				 PORTD=0b01000000;
				 continue;
			 }
			  
			  PORTB = 0b00000000;
			
	   }
}
scccorp вне форума Ответить с цитированием
Старый 11.10.2017, 10:29   #42
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Код мне смотреть лениво, тем боле на Си для МК не пишу (не потому, что не знаю Си - знаю - а просто не хочу). Я про логику работы. Если неясно само задание, то и не может быть правильной реализации.
digitalis вне форума Ответить с цитированием
Старый 11.10.2017, 11:40   #43
scccorp
Пользователь
 
Регистрация: 05.10.2017
Сообщений: 44
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
Код мне смотреть лениво, тем боле на Си для МК не пишу (не потому, что не знаю Си - знаю - а просто не хочу). Я про логику работы. Если неясно само задание, то и не может быть правильной реализации.
ну само задание я описал в самом начале.
scccorp вне форума Ответить с цитированием
Старый 11.10.2017, 11:46   #44
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Вот так короче получается:

Код:
switch(PINB)
{
	case 2: PORTD=8;break;
	case 4: PORTD=1;break;
	case 6: PORTD=16;break;
	case 9: PORTD=32;break;
	case 12: PORTD=4;break;
	case 10: PORTD=64;break;
}

А чтобы дребезг убрать то сравнивайте новое значение пина с предыдущим. Так как вы с интервалом в 100 мс проверяете если значения предыдущего и текущего равны значит это действительно устойчивое положение.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.10.2017 в 11:48.
WorldMaster вне форума Ответить с цитированием
Старый 11.10.2017, 12:03   #45
scccorp
Пользователь
 
Регистрация: 05.10.2017
Сообщений: 44
По умолчанию

все отлично работает как надо, всем огромное спасибо) теперь ещё один вопросик, нужно сделать так чтобы когда первый раз нажимаешь кнопку диод включается второй раз нажимаешь выключается. как описать саму задержку?
scccorp вне форума Ответить с цитированием
Старый 11.10.2017, 12:05   #46
scccorp
Пользователь
 
Регистрация: 05.10.2017
Сообщений: 44
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Вот так короче получается:

Код:
switch(PINB)
{
	case 2: PORTD=8;break;
	case 4: PORTD=1;break;
	case 6: PORTD=16;break;
	case 9: PORTD=32;break;
	case 12: PORTD=4;break;
	case 10: PORTD=64;break;
}

А чтобы дребезг убрать то сравнивайте новое значение пина с предыдущим. Так как вы с интервалом в 100 мс проверяете если значения предыдущего и текущего равны значит это действительно устойчивое положение.
ну у меня вышло так
Код:
#include <avr/io.h>
#include <util/delay.h>



int main(void)
{
	DDRD=0xFF;
	PORTD=0b00000000;
	DDRB=0b10000000;
	PORTB=0b00011111;
   while (1) 
       {		
		  _delay_ms(100);   
		   if(PINB==0b00000100)
		   {
			 PORTD=0b00000001;	
			 continue;
		   }
		   else
		   {
		   PORTD=0x00;
		   }
		   if (PINB==0b00001100)
		   {
			   PORTD=0b00000010;
			   continue;
		   }
		    if(PINB==0b00000010)
		    {
			    PORTD=0b00000100;
			    continue;
		    }
		    if (PINB==0b00000110)
		    {
			    PORTD=0b00001000;
			    continue;
		    }
			 if(PINB==0b00001001)
			 {
				 PORTD=0b00010000;
				 continue;
			 }
			 if (PINB==0b00001010)
			 {
				 PORTD=0b001000000;
				 continue;
			 }
			  
			  PORTB = 0b00000000;
			
	   }
}
scccorp вне форума Ответить с цитированием
Старый 11.10.2017, 15:34   #47
scccorp
Пользователь
 
Регистрация: 05.10.2017
Сообщений: 44
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Вот так короче получается:

Код:
switch(PINB)
{
	case 2: PORTD=8;break;
	case 4: PORTD=1;break;
	case 6: PORTD=16;break;
	case 9: PORTD=32;break;
	case 12: PORTD=4;break;
	case 10: PORTD=64;break;
}

А чтобы дребезг убрать то сравнивайте новое значение пина с предыдущим. Так как вы с интервалом в 100 мс проверяете если значения предыдущего и текущего равны значит это действительно устойчивое положение.
подскажи как сделать что-бы кнопка работала в режиме переключателя?
scccorp вне форума Ответить с цитированием
Старый 11.10.2017, 16:47   #48
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

В каждый case можно было бы вставить if приблизно так:
Код:
case 2: if PORTD==8 PORTD=0 ; else PORTD=8;break;
но это не годится: все время нажатой кнопки диод то потухнет, то загорится. Поэтому нужно в switch заходить по изменению состояния входного порта: завести переменную, хранящую предыдущее состояние кнопок, и если новое совпадает с предыдущим, ничего не делать.
Код:
  if PINB != PINB_last
    { PINB_last = PINB ;
       switch  (PINB)
          {
         case 2: if PORTD==8 PORTD=0 ; else PORTD=8;break;
          .......
          }
     }
Я не знаю, как в этой версии Си обозначается "не равно" : так != или |=
Прригодился ответ - жми на весы

Последний раз редактировалось digitalis; 11.10.2017 в 16:58.
digitalis вне форума Ответить с цитированием
Старый 11.10.2017, 20:11   #49
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение

Я не знаю, как в этой версии Си обозначается "не равно" : так != или |=
огого ... В любой версии Си != означает неравно а |= означает это оператор присвоения битового "или"

а вместо этого:
Код:
 if PORTD==8 PORTD=0 ; else PORTD=8;
можно сразу к биту обращаться.

Код:
 RD7 !=RD7
Ну или как там у вас запись в биты производиться. Суть в том что обращаться к нужному индексу бита. Только внимательно читайте даташит, а то если есть защелки LAT то запись надо в них производить.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.

Последний раз редактировалось WorldMaster; 11.10.2017 в 20:42.
WorldMaster вне форума Ответить с цитированием
Старый 12.10.2017, 10:36   #50
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,546
По умолчанию

Да, чувствуется, что давно я не писа'л на Си, а для МК - вообще никогда. ..
В некоторых более новых версиях Мега есть такая фича: пишешь по адресу PINX, который вроде бы только для чтения, при этом инвертируются биты, соответствующие '1', в PORTX ! Но это не во всех Мегах, да и то написать это на асме - запросто, а вот компилятор может выругаться: "ты что, дурень, PINВ - это же для чтения!"
а инвертнуть бит можно еще и так: PORTD ^= (1<<RD7), где RD7 - номер бита.
Только ТСу этот наш разговор, видимо, уже не интересен.

Последний раз редактировалось digitalis; 12.10.2017 в 10:46.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Порты Novichek_1996 Помощь студентам 3 22.04.2014 19:55
Не могу открыть порты. aszaszasz Помощь студентам 0 26.05.2010 14:27
Порты Троян Помощь студентам 1 12.02.2010 14:55
порты Rabitka Безопасность, Шифрование 0 16.10.2009 16:09
COM Порты Skazi21101 Помощь студентам 0 02.11.2008 12:24