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

Обсуждаем контроллеры компании Atmel.
Braimik
Родился
Сообщения: 6
Зарегистрирован: Ср июл 02, 2014 05:01:16

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

Сообщение 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) {}
};
}
надеюсь на вашу помощь. Заранее спасибо
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

C++? Под AVR? Лихо вы завернули :)))
Реклама
Braimik
Родился
Сообщения: 6
Зарегистрирован: Ср июл 02, 2014 05:01:16

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

Сообщение Braimik »

ploop писал(а):Лихо вы завернули :)))
Да с++ и Маи. Всмысле лихо завернул? Слишком сложно иди что перепробовал по разному писать код смысл тот же этот код на одну кнопку а так их 12. И надо все это заставить работать . Даже если код на одну кнопку при подключении еще кнопок они тоже включают диод м выключают.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

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

Вы выхватили кусок кода из интернетов, не разобравшись, на чём это написано и под какой компилятор.
Реклама
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Braimik писал(а):не могу никак заставить программму делать что мне надо
Не мудрено при таком потоке сознания
Braimik писал(а):Слишком сложно иди что перепробовал по разному писать код смысл тот же этот код на одну кнопку а так их 12.
:)) :)) :))

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

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

ploop, судя по "#include <mega2560.h>" светодиодами "помигать" можно и на C++ :)
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Braimik
Родился
Сообщения: 6
Зарегистрирован: Ср июл 02, 2014 05:01:16

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

Сообщение Braimik »

Kavka, мне нужно чтобы при нажатии на pd0 загорелся и горел светодиод на pb0 и т.д. до pd7 и pb7. Признаюсь в неопытности печатанья кода. По учебнику Белова смотрел там написано только для одного светодиода хорошо так и у меня получилось а если их несколько тогда как? Всем спасибо
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

ARV писал(а):для статических экземпляров самописных классов оверхед С++ очень невелик и вполне может быть приемлемым даже для atmega8
Да я в курсе, но предлагаете написать ТСу класс зажигания светодиода? :)))
А так, умельцы на AVR8 и линукс запускали.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

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

Мой уютный бложик... заходите!
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

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

Уточню. Т.е. надо, чтобы светодиод горел пока удерживается соответствующая кнопка (при отпускании гаснет)?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение 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-й кнопки.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

а лучше написать так:

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

void main(void){
   DDRD = 0;
   PORTD = 0xFF;
   DDRB = 0xFF;
   PORTB = 0;
   for(;;){
      PORTB = ~PIND;
   }
}
У меня все!
Ставим плюсы: )
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18670
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

а так:

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

void main(void){
   for(PORTB=DDRD=~(PORTD=DDRB=0xFF);;) PORTB =~PIND;
}
:)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

ARV писал(а):а так:
:) А можно вообще кнопки на светодиоды подключить, а сэкономленный МК на другое нужное дело пустить.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

Я не стремился записать все в цикл, но если надо, тогда уж так:

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

void main(void){
   for(DDRD = PORTB = 0, DDRB = PORTD = 0xFF;;PORTB = ~PIND);
}
Ставим плюсы: )
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

А так будет ещё быстрее (из-за volatile-ности портов):

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

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

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

for(DDRB = 0xFF, PORTD = 0xFF;;PORTB = ~PIND);
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение 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
Ставим плюсы: )
Аватара пользователя
WiseLord
Друг Кота
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск
Контактная информация:

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

Сообщение WiseLord »

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

Имхо.
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

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

Сообщение ibiza11 »

скажу Вам, не спорьте, если не знаете. без оптимизации Ваш вариант будет дольше моего.
Ставим плюсы: )
Ответить

Вернуться в «AVR»