Страница 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
скажу Вам, не спорьте, если не знаете. без оптимизации Ваш вариант будет дольше моего.