Страница 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
Импульс
Как бы не хотелось всю программу переделывать
Не могу пока зделать для кнопки, функцию повтора куска программы-зациклить его.
И простой алгоритм преодаления дребезга.
Т.З.
Вообщем в машине будет !!!
Буду управлять поворотниками,дальним ближним светом фар ,аварийкой ,светом в салоне.
Схемотехника пока ждёт,или реле или п/п(полевики или транзисторы),самый мощный потребитель это 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;
не , не хорошая программа получилась, постояно поворотники моргают не реагируя на нажатие кнопок...
Надо переделывать

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() в чем выгода?
Да, кстати, я тоже не понял зачем тут макрос нужен и каким боком его приставлять.

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, перед конфигурацией портов
не стоит ее делать глобальной, это не есть гуд