Страница 1 из 2

управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 05:37:28
Braimik
День добрый. В процессе программирование на c++ у меня возникли проблему не могу никак заставить программму делать что мне надо, а именно что каждая кнопка включала тот или иной светодиод , а не любая кнопка и не все светодиоды.
Спойлер#include <mega2560.h>

void main(void) {


PORTB=0xFF;
DDRB=0xFF;

PORTD=0x00;
DDRD=0x00;


while (1)
{
while (PIND.0==1) {}
if (PINB.0==1)
{ PORTB.0=0;
}
else
{ PORTB.0=1;
}
while (PIND.0==0) {}
};
}
надеюсь на вашу помощь. Заранее спасибо

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 07:00:52
ploop
C++? Под AVR? Лихо вы завернули :)))

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 07:09:37
Braimik
ploop писал(а):Лихо вы завернули :)))
Да с++ и Маи. Всмысле лихо завернул? Слишком сложно иди что перепробовал по разному писать код смысл тот же этот код на одну кнопку а так их 12. И надо все это заставить работать . Даже если код на одну кнопку при подключении еще кнопок они тоже включают диод м выключают.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 07:57:02
ARV
Braimik писал(а):Да с++ и Маи.
я готов бесплатно сделать за вас любую программу по вашему курсу обучения, если вы приведете мне скан страницы книги по С++, где бы давалось объяснение такого финта, как у вас в программе: PIND.0. то есть уточняю: после точки стоит не идентификатор, а цифровая константа.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 08:47:48
ploop
Braimik писал(а):Всмысле лихо завернул?
В том смысле, что C (Си) и C++ грубо говоря разные языки, хоть и с одинаковым синтаксисом. Последний требует больших аппаратных ресурсов (так как заточен на ООП), и в таких архитектурах, как AVR8 не используется.

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

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 09:20:29
Kavka
Braimik писал(а):не могу никак заставить программму делать что мне надо
Не мудрено при таком потоке сознания
Braimik писал(а):Слишком сложно иди что перепробовал по разному писать код смысл тот же этот код на одну кнопку а так их 12.
:)) :)) :))

Программу надо не заставлять, а создавать её так, чтобы она делала то что надо. Чтобы создавать, надо понимать что делаешь.
Судя по приведённому коду, как вам уже заметили другие, понимания у вас мало.
Если реально вопросы есть, то ознакомьтесь, чтобы не было непонимания сарказма, иронии и юмора со стороны форумчан по отношению к вам.
Если вопрос из разряда "сделайте за меня задание", то есть отдельная тема (подскажите кто знает).

Начните с постановки задачи - какие ножки МК опрашиваются и на каких ножках МК находятся светодиоды, при каких условиях светодиод зажигается/гасится (горит/не_горит).

ploop, судя по "#include <mega2560.h>" светодиодами "помигать" можно и на C++ :)

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 09:25:16
ARV
для статических экземпляров самописных классов оверхед С++ очень невелик и вполне может быть приемлемым даже для atmega8. а динамические экземпляры классов по-моему тут мало кто понимает, для чего вообще нужны :)))

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 09:33:16
Braimik
Kavka, мне нужно чтобы при нажатии на pd0 загорелся и горел светодиод на pb0 и т.д. до pd7 и pb7. Признаюсь в неопытности печатанья кода. По учебнику Белова смотрел там написано только для одного светодиода хорошо так и у меня получилось а если их несколько тогда как? Всем спасибо

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 10:23:31
ploop
ARV писал(а):для статических экземпляров самописных классов оверхед С++ очень невелик и вполне может быть приемлемым даже для atmega8
Да я в курсе, но предлагаете написать ТСу класс зажигания светодиода? :)))
А так, умельцы на AVR8 и линукс запускали.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 10:42:14
ARV
ploop писал(а):Да я в курсе, но предлагаете написать ТСу класс зажигания светодиода? :)))
а почему бы и нет? с методами void set_state(bool on) и bool get_state(void) :)))

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 11:42:42
Kavka
Braimik писал(а):Kavka, мне нужно чтобы при нажатии на pd0 загорелся и горел светодиод на pb0 и т.д. до pd7 и pb7. Признаюсь в неопытности печатанья кода.
Честно признались - хорошо.
Какой опыт программирования у вас? На каких языках? Какого рода программы писали? Это чтобы понять степень вашей "новичковости".

Уточню. Т.е. надо, чтобы светодиод горел пока удерживается соответствующая кнопка (при отпускании гаснет)?

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 13:00:24
WiseLord
Зачем мудрить, ведь всё гораздо проще:

Код: Выделить всё

while (1) {
	if (PIND.0 == 1)
		PORTB.0 = 0;
	else
		PORTB.0 = 1;
}
Аналогично и для других пар (PIND.1-PORTB.1, и тд.). Пока соотв. кнопка на PIND нажата, соотв. порт на PORTB будет включен, при отжатии - выключен. (Вроде именно это требовалось).

А лучше писать без привязки к Codevision (это же его дурацкий синтаксис, так?):

Код: Выделить всё

while (1) {
	if (PIND & (1<<5) == (1<<5);
		PORTB &= ~(1<<5);
	else
		PORTB |= (1<<5);
}
Пример для 5-й кнопки.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 13:35:05
ibiza11
а лучше написать так:

Код: Выделить всё

void main(void){
   DDRD = 0;
   PORTD = 0xFF;
   DDRB = 0xFF;
   PORTB = 0;
   for(;;){
      PORTB = ~PIND;
   }
}
У меня все!

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 13:44:07
ARV
а так:

Код: Выделить всё

void main(void){
   for(PORTB=DDRD=~(PORTD=DDRB=0xFF);;) PORTB =~PIND;
}
:)))

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 13:54:20
WiseLord
ARV писал(а):а так:
:) А можно вообще кнопки на светодиоды подключить, а сэкономленный МК на другое нужное дело пустить.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 13:54:29
ibiza11
Я не стремился записать все в цикл, но если надо, тогда уж так:

Код: Выделить всё

void main(void){
   for(DDRD = PORTB = 0, DDRB = PORTD = 0xFF;;PORTB = ~PIND);
}

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 14:04:45
WiseLord
А так будет ещё быстрее (из-за volatile-ности портов):

Код: Выделить всё

for(DDRD = 0, PORTB = 0, DDRB = 0xFF, PORTD = 0xFF;;PORTB = ~PIND);
Кстати, порты нулям можно, по идее, не приравнивать:

Код: Выделить всё

for(DDRB = 0xFF, PORTD = 0xFF;;PORTB = ~PIND);

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 14:14:46
ibiza11
ну-ну :)))
Спойлер
WiseLord писал(а):А так будет ещё быстрее (из-за volatile-ности портов):

Код: Выделить всё

//   25    for(DDRD = PORTB = 0, DDRB = PORTD = 0xFF;;PORTB = ~PIND);
        LDI     R16, 0
        OUT     0x18, R16
        OUT     0x11, R16
        LDI     R16, 255
        OUT     0x12, R16
        OUT     0x17, R16
??main_0:
        IN      R16, 0x10
        COM     R16
        OUT     0x18, R16
        RJMP    ??main_0


//   26    for(DDRD = 0, PORTB = 0, DDRB = 0xFF, PORTD = 0xFF;;PORTB = ~PIND);
        LDI     R16, 0
        OUT     0x11, R16
        OUT     0x18, R16
        LDI     R16, 255
        OUT     0x17, R16
        OUT     0x12, R16
??main_0:
        IN      R16, 0x10
        COM     R16
        OUT     0x18, R16
        RJMP    ??main_0

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 14:59:22
WiseLord
Оптимизатор поработал, наверное.
Без него (DDRD = PORTB = 0) отрабатывалось бы дольше.
0 записался в порт B, из порта P считалось в переменную, которая бы затем записалась бы в порт D.

Имхо.

Re: управление несколькими светодиодами

Добавлено: Ср июл 02, 2014 15:11:22
ibiza11
скажу Вам, не спорьте, если не знаете. без оптимизации Ваш вариант будет дольше моего.