Страница 271 из 421

Re: CodeVision AVR в вопросах и ответах

Добавлено: Сб авг 10, 2013 21:11:02
vitalik_1984
Ну да только это не включить, а именно выключить цифровой вход. Вы ведь используете АНАЛОГОВЫЙ. Для того, чтобы цифровой вход не влиял на показания аналогового и придуманы эти галки.
Потрудились бы взять словарик и перевести- disable это деактивировать.
Аналоговый вход может получать значения от 0 до 255 при 8 битах точности и от 0 до 1024 при 10 битах точности.
А цифровой это 0 и 1 зачем вам это, если вы используете аналоговые сигналы?
Теперь понятно?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс авг 11, 2013 07:37:48
Aмstroн
Всё более чем. Спасибо.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вс авг 11, 2013 14:06:28
unalex
0867532 писал(а):как это ужать???
а если так?

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

#define CALLFUNCX(number) x##number()
#define CALLFUNCY(number) y##number()

void update(void)
{
	CALLFUNCX(x);
	CALLFUNCY(y);
}
не проверял

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн авг 12, 2013 18:16:30
Импульс
Здравствуйте!
Подскажите пожалуйста ,как поправить прошивку где кнопка №1.
при нажатии один раз,
светодиод моргал через паузы 500ms(постояно)
при нажатии второй раз
выключался.
Здесь получилось 8* триггеров* раз on два off но два триггера надо задействовать для моргания.
Есть в протеусе проект.
Спойлер#include <tiny2313.h>
#include <delay.h>
void main(void)
{
PORTA=0x07;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTD=0x3F;
DDRD=0x40;

while (1)
{if (PIND.0==0) // ==== №1 кнопка поворотники (если нажата на корпус то вкл...
{
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7;
delay_ms(500);
PORTB ^= 1<<7; //как только дошло до конца выключилось

}



{if (PIND.1==0) // ==== №2кнопка ближний свет
{
PORTB ^= 1<<6; // раз нажали вкл раз нажали выкл
delay_ms(100);
}



{if (PINA.1==0) // ==== №3 кнопка дальний свет
{
PORTB ^= 1<<5;
delay_ms(100);
}

{if (PINA.0==0) // ==== №4кнопка
{

PORTB ^= 1<<4;
delay_ms(100);

}


{if (PIND.2==0) // ==== №5кнопка аварийка
{
PORTB ^= 1<<3;
delay_ms(100);

PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);
PORTB ^= 1<<3;
delay_ms(300);


}


{if (PIND.3==0) // ==== №6кнопка
{
PORTB ^= 1<<2;
delay_ms(100);
}



{if (PIND.4==0) // ==== №7кнопка
{
PORTB ^= 1<<1;
delay_ms(100);
}

{if (PIND.5==0) // ==== последняя кнопка
{
PORTB ^= 1<<0;
delay_ms(100);
}



}
}
}
}
}
}
}
}
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн авг 12, 2013 20:11:46
unalex
Импульс писал(а):Подскажите пожалуйста ,как поправить прошивку где кнопка №1.
опиши потробнее ТЗ, что должно происходить при нажатии каждой кнопки(что загорается, как долго и т.п.)
и желательно выложи схему в виде картинки
код надо полностью переделывать

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

#include <tiny2313.h>
#include <delay.h>

void main(void)
{
	PORTA=0x07;
	DDRA=0x00;
	PORTB=0x00;
	DDRB=0xFF;
	PORTD=0x3F;
	DDRD=0x40;
	
	unsigned char flag = 0;
	
	//для кнопки без фиксации
	// первое короткое нажатие - мигаем
	// второе - не мигаем
	//можно реагировать на отжатие кнопки, но я упростил
	
	
	while (1)
	{
		if(PIND.0 == 0)			//Если нажата кнопка 1
		{
			delay_ms(50);	//Антидребезговая задержка
			if(PIND.0 == 0)		//Если еще нажата
			{
				flag = 1;	//Запомнить состояние, будем мигать
			}
		}
		
		//тут код для других кнопок
		
		if(flag == 1)		//Тут будем мигать
		{
			PORTB ^= 1 << 7;
			delay_ms(500);
			if(PIND.0 == 0)		//Если кнопка нажата второй раз
			{
				flag = 0;	//Сброс, больше не мигаем
			}
		}
	}
}

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн авг 12, 2013 21:01:47
Импульс
Как бы не хотелось всю программу переделывать :cry:
Не могу пока зделать для кнопки, функцию повтора куска программы-зациклить его.
И простой алгоритм преодаления дребезга.
Т.З.
Вообщем в машине будет !!!
Буду управлять поворотниками,дальним ближним светом фар ,аварийкой ,светом в салоне.
Схемотехника пока ждёт,или реле или п/п(полевики или транзисторы),самый мощный потребитель это HEllA фары передние (не ксенон).
Но если в первую очередь вкл например поворотники ,то пока они не отморгают ни чего другого не вкл(тоже головная проблема).
Тоже самое с аварийкой.
Как сделать чтоб при вкл поворотников или аварийки можно всё другое включать свет фар ?
Не отговаривайте пожалуйста меня даже если в машину не поставлю всё равно урок будет отличный !
Спасибо за содействие!

Re: CodeVision AVR в вопросах и ответах

Добавлено: Пн авг 12, 2013 21:07:26
Импульс
выругался на перемеенную
unsigned char flag = 0;------------must declare first in block(долно заявится сначала в блоке)
поставил до главной функции
Спойлер#include <tiny2313.h>
#include <delay.h>
unsigned char flag = 0;void main(void)
void main(void)
{
PORTA=0x07;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
PORTD=0x3F;
DDRD=0x40;
не , не хорошая программа получилась, постояно поворотники моргают не реагируя на нажатие кнопок...
Надо переделывать :dont_know:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 09:15:28
0867532
а что ты хотел? ты на кнопки ничего не повесил. только ddr задал
нормально опиши чего ты хочешь.
например так: есть 3 кнопки.
кнопка#1: что должно происходить по её нажатию.
кнопка#2: что должно происходить по её нажатию.
и.т.д.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 09:20:28
Импульс
Да помоему написано уже давно...

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 10:36:14
urry
Импульс, выражения внутри программы типа delay_ms(500); - вообще не должно быть.

Заведи таймер на миллисекунду в прерывании, в мейне его обрабатывай и делай анализ клавиатуры.
По изменению режима - выставь счетчик на 500 - и по нему мигай, чем хочется.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 16:28:01
unalex
urry писал(а):Импульс, выражения внутри программы типа delay_ms(500); - вообще не должно быть.

Заведи таймер на миллисекунду в прерывании, в мейне его обрабатывай и делай анализ клавиатуры.
По изменению режима - выставь счетчик на 500 - и по нему мигай, чем хочется.

эта программа некритична по времени исполнения и задержкам, так что можно обойтись без прерываний и таймеров

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 16:30:40
unalex
Импульс писал(а):Да помоему написано уже давно...
не увидел
распиши подробнее

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 16:37:05
Аlex
unalex писал(а):эта программа некритична по времени исполнения и задержкам, так что можно обойтись без прерываний и таймеров
Дело не в критичности, а в проблеме
Как сделать чтоб при вкл поворотников или аварийки можно всё другое включать свет фар ?
, которую человек не может решить. И понятно почему - он глупо зацикливает программу на длительное время, когда в это время, процессор может заниматься другими более нужными делами.
Как вариант - распараллеливать процессы, а все задержки считать в прерывании таймера, с установкой соответствующих флагов.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 17:32:00
urry
Угу. Я специально не написал код, чтобы человек сам разобрался.
Тема - многозадачные процессы - ему еще понадобится. Пусть помучится пока.

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 19:48:31
vitalik_1984
unalex писал(а):
0867532 писал(а):как это ужать???
а если так?

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

#define CALLFUNCX(number) x##number()
#define CALLFUNCY(number) y##number()

void update(void)
{
	CALLFUNCX(x);
	CALLFUNCY(y);
}
не проверял
А что разве совать в макрос переменную это хороший тон?
Как же будет работать ваш код? Чувствую ничего из этого не получится.
И ваша функция обновления не более чем фикция.
Для использования вашего макроса нужно будет писать CALLFUNCY(2) вместо y2() в чем выгода?

Re: CodeVision AVR в вопросах и ответах

Добавлено: Вт авг 13, 2013 20:51:05
Аlex
vitalik_1984 писал(а):Для использования вашего макроса нужно будет писать CALLFUNCY(2) вместо y2() в чем выгода?
Да, кстати, я тоже не понял зачем тут макрос нужен и каким боком его приставлять. :roll:

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 14, 2013 07:27:48
Импульс
urry писал(а):Угу. Я специально не написал код, чтобы человек сам разобрался.
Тема - многозадачные процессы - ему еще понадобится. Пусть помучится пока.
А как лучше будет тайммер настроить, на прерывание или переполнение .
Думаю что таймер будет крутить бесконечный цикл поворотников и аварийки,тем самым не нагромождая процессор.
Но поворотники и аварийка раздельно должны включатся и не мешать другим кнопкам вкл.(свет фар ,салона,габаритов).

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 14, 2013 10:02:43
urry
Прерыванием по переполнению. :)
Очень легко считать требуемое значение таймера
Например, на вход 1 таймера поступает 8 мег, нужно снять с него 1 килогерц (1 мс период)

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

#define F_IN 8000000
#define F_OUT 1000
#define TM1_C 65536 - (F_IN/F_OUT)

interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT1+=TM1_C;
// выставляем флаг, что прошла миллисекунда

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 14, 2013 12:07:45
unalex
vitalik_1984 писал(а): А что разве совать в макрос переменную это хороший тон?
Как же будет работать ваш код? Чувствую ничего из этого не получится.
И ваша функция обновления не более чем фикция.
Для использования вашего макроса нужно будет писать CALLFUNCY(2) вместо y2() в чем выгода?
1 нормальный тон
2 будет работать, не чувствуйте, а проверяйте
3 аргументируйте, в чем фикция
3 посмотрите код на предыдущей странице, вся эта простыня заменяется двумя строчками, которые я написал

Re: CodeVision AVR в вопросах и ответах

Добавлено: Ср авг 14, 2013 12:14:52
unalex
Импульс писал(а):unsigned char flag = 0;------------must declare first in block(долно заявится сначала в блоке)
перемещать ее нужно в начало блока сразу после main, перед конфигурацией портов
не стоит ее делать глобальной, это не есть гуд