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

Помогите разобраться с программой.

Добавлено: Вт янв 13, 2015 16:50:28
amirus
Всем доброго времени суток. Помогите пожалуйста, или подскажите как реализовать следующее. Программа при нажатии на кнопки зажигает, а последующее тушит светодиоды на портах PB0 и PB1. Как сделать чтобы при подачи питания оба светодиода зажглись и потухли на пример через пару секунд и перешла в ожидание нажатия кнопок? Заранее благодарен.
Спойлер#include<avr/io.h>
#define F_CPU 128000UL
#include<util/delay.h>

//void _delay_ms
void wait(int time)
{
volatile int i;

for(i=0; i<time; i++);
}
int main(void)
{
char k1state, k2state;

DDRB |= 1<<0|1<<1;
PORTB |= 1<<0|1<<1;

DDRB &= ~(1<<4|1<<5);
PORTB |= (1<<4|1<<5);

while(1)
/////////////////////////////////////////////////
{
if(PINB&(1<<4))
{
if(k1state==0) k1state = 1;
wait(100);
}
else
{
if(k1state)
{
wait(100);
k1state = 0;
wait(100);
PORTB^=(1<<0);
}

////////////////////////////////////////////////
}
if(PINB&(1<<5))
{
if(k2state==0) k2state = 1;
wait(100);
}
else
{
if(k2state)
{
wait(100);
k2state = 0;
PORTB^=(1<<1);
wait(100);
}
}

wait(100);

};
}

Re: Помогите разобраться с программой.

Добавлено: Вт янв 13, 2015 20:24:46
YS
Как сделать чтобы при подачи питания оба светодиода зажглись и потухли на пример через пару секунд и перешла в ожидание нажатия кнопок?
Т.е., алгоритм получается такой:

1. При подаче питания оба светодиода загораются на 2 с., после чего гаснут.
2. Далее нажатие кнопки включает оба светодиода, повторное тушит, и так далее.

Так?

Re: Помогите разобраться с программой.

Добавлено: Ср янв 14, 2015 13:17:56
amirus
Доброго времени суток. Все верно, после включения, загораются оба светодиода. Далее алгоритм верный, только не оба светодиода, а по отдельности, каждый светодиод управляется своей кнопкой. В архиве файл протеуса и прошивка, можно посмотреть как работает.

Re: Помогите разобраться с программой.

Добавлено: Ср янв 14, 2015 20:04:22
YS
В архиве файл протеуса и прошивка
Так тема еще актуальна или нет, если прошивка уже есть?

Re: Помогите разобраться с программой.

Добавлено: Ср янв 14, 2015 21:17:03
Mishany
вообще то перед циклом While пишется разовый код/алгоритм/функция после выполнения уходим в цикл опроса кнопок

Re: Помогите разобраться с программой.

Добавлено: Ср янв 14, 2015 21:51:46
rxstart1
Нажимаешь на кнопку зажигаешь диоды и обнуляешь счетчик таймера, а там хоть по совпадению, хоть по переполнению делай. Как счетчик достиг значения=2сек. диоды туши. Программа линейна и никуда возвращаться не надо.

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 08:59:43
amirus
Всем доброго времени. Тема еще актуальна. Не могу решить проверку светодиодов зажиганием. Если пишу разовым кодом, у меня светодиоды просто моргают.

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 09:44:20
Mishany
а ваша писанина засекречена? алгоритм подсказал, а то что не работает надо код смотреть....

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 09:57:16
amirus
Нет конечно :) Вы правильно написали, "писанина" . Она в спойлере в первом посте.

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 13:59:10
Mishany
это что?

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

 DDRB |= 1<<0|1<<1;
 PORTB |= 1<<0|1<<1;
 
 DDRB &= ~(1<<4|1<<5);
 PORTB |= (1<<4|1<<5);
DDRB устанавливает еденицей вывод мк на выход, по умолчанию выводы мк работают на вход.

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

DDRB =(1<<0)|(1<<1); //0 и 1 порт на выход, остальные вход...
вообщем убираем эту запись и пишем:

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

DDRB |=(1<<0)|(1<<1); //0 и 1 порт на выход, остальные вход...
POPTB |=(1<<0)|(1<<1); //выводим на порт 0 и 1 еденицу
wait(100); //подбираем нужную задержку в скобках
POPTB &=~(1<<0)|(1<<1); //выводим на порт 0 и 1 ноль
wait(100); //подбираем нужную задержку в скобках
// и далее...
int main(void)
{
 char  k1state, k2state;
...........
и добавить перед последней скобкой return 0;

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 17:37:57
rxstart1
Во первых зачем функция wait
используй библиотеку <delay.h>, там есть функция delay_ms(<задержка в миллисекундах>);
во вторых основная функция ничего не возвращает, поэтому правильно писать void main(void)
и самое главное, твой код здесь не при чем. Проверь, на работу с какой частотой настроен твой компилятор, она должна совпадать с частотой установленной в твоем коде и оптимизация должна быть минимальной, оптимизировать надо по скорости.
для твоего случая частоты в 1МГц за глаза хватит, не думаю, что на rc цепочке мк корректно раскрутит 12 МГц, без внешнего источника тактования.

Re: Помогите разобраться с программой.

Добавлено: Чт янв 15, 2015 21:03:40
Mishany
судя по настройке там уже 128 кГц, для лампочек и кнопок стабилизация частоты не имеет смысла.
можно и делай использовать можно и своей функцией, тут кому как удобнее, да и не в задержке собственно проблема.
А вообще делай при возможности лучше заменять, сам стараюсь по минимуму ее использовать

Re: Помогите разобраться с программой.

Добавлено: Пт янв 16, 2015 10:11:29
amirus
Спасибо за советы, попробую, расскажу что получилось.