Вот вырезка из справки... я не спорю, может и не прав... но в чём?CodeVision Help писал(а):
void delay_us(unsigned int n)
generates a delay of n useconds. n must be a constant expression.
void delay_ms(unsigned int n)
generates a delay of n milliseconds.
/* 100us delay */
delay_us(100);
/* 10ms delay */
delay_ms(10);
ПрЕрывания в WinAVR...
There is only 10 kind of people: those who understands binary code and those who dont!!!
- Реклама
Ммммммммммммм...
А чё в мою программу никак нельзя встроить паузу на таймерах???
А чё в мою программу никак нельзя встроить паузу на таймерах???
- Сообщения: 68
- Зарегистрирован: Вт июл 24, 2007 23:34:23
А я думаю что не стоит с самого начала усложнять прогу массивами, пусть сначала так какесть она заработает.
Единственная поправка, можно создать подпрограмму задержки и когда нужно ссылаться на нее.
Вообще конечно так делают в ассемблере, я просто не заню так ли это в Си, поправьте меня если я не прав.
Единственная поправка, можно создать подпрограмму задержки и когда нужно ссылаться на нее.
Вообще конечно так делают в ассемблере, я просто не заню так ли это в Си, поправьте меня если я не прав.
В приведённую тобой программу не целесообразно встраивать задержку на таймерах... если ты хочеш оставить именно её, то попробуй на дэлеях...Krik99 писал(а): А чё в мою программу никак нельзя встроить паузу на таймерах???
Не спорю. хотя с моей точки зрения - массив сложен в ассемблере(а уж тем более реализация многомерных массивов). В Си таких сложностей нет. Но это моё IMHOMr.Moss писал(а): А я думаю что не стоит с самого начала усложнять прогу массивами, пусть сначала так какесть она заработает.
Код: Выделить всё
unsigned char mode[8][8]={{129,66,36,24,24,36,66,129},
{129,195,231,255,255,231,195,129},
{1,2,4,8,16,32,64,128},
{128,64,32,16,8,4,2,1},
{129,24,66,36,36,66,24,129},
{160,80,40,20,10,5,2,1},
{5,10,20,40,80,160,64,128},
{136,68,34,17,17,34,68,136}};
Я писал выше про процедуры задержки. В КодВижн(не знаю как в других) есть спец. библиотека для задержек.Mr.Moss писал(а): Единственная поправка, можно создать подпрограмму задержки и когда нужно ссылаться на нее.
Вообще конечно так делают в ассемблере, я просто не заню так ли это в Си, поправьте меня если я не прав.
Krik99, Но если тебе, так сказать, для самоутверждения надо сделать свою задержку на таймерах то вот примерный алгоритм:
тебе надо расчитать и на строить таймер на счёт в одну сек.(или сколько там) и запустить таймер. И ждать пока не установится флаг переполнения. После этого остановить таймер и продолжить программу. Примерно так
There is only 10 kind of people: those who understands binary code and those who dont!!!
в НАНО секундах.Negor писал(а):может и не прав... но в чём?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
- Реклама
Вот сегодня закончил писать свою программу и вместо паузы использовал _delay_ms(); его недостатком остаётся чтобы переключить эфект надо подержать с секунды 2 кнопку.
Вот код:
Вот код:
Код: Выделить всё
#include <avr>
#include <avr>
void ind (unsigned char pr)
{
switch(pr)
{
case 0: //Эфект бегущий огонь.
PORTB=0xEF; //Зажигаем первый канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xDF; //Зажигаем второй канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0xBF; //Зажигаем третий канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x7F; //Зажигаем четвёртый канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
break;
case 1: //Эфект мирцания.
PORTB=0x1F; //Зажигаем второй, третий и четвёртый канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x5F; //Зажигаем первый и третий канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x0F; //Зажигаем все каналы герлянды.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
break;
case 2: //Эфект бегущая тень.
PORTB=0x1F; //Зажигаем второй и четвёртый канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x2F; //Зажигаем первый, третий и четвёртый канал герлянд.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x4F; //Зажигаем первый, второй каналы герлянды.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
PORTB=0x8F; //Зажигаем первый, второй каналы герлянды.
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
break;
}
return;
}
int main(void)
{
unsigned char a;
DDRC = 0x00; PORTC = 0xFF;
DDRB = 0xFF; PORTB = 0xFF;
DDRD = 0xFF; PORTD = 0xFF;
while(1)
{
ind(a);
if(bit_is_clear(PINC,PC0)) a++;
if(a>2) a=0;
}
}
Всё правильно... Ведь опрос кнопки будет только после прохода всеё программы мигания... можеш попробовать сделать опрос кнопки по таймеру... Конечно переключение будет опять после прохода всего цикла мигания, но держать кнопку так долго уже не надо будет Но в таком случае тебе придётся позаботится об устранении дребезга контактов.Krik99 писал(а): его недостатком остаётся чтобы переключить эфект надо подержать с секунды 2 кнопку.
There is only 10 kind of people: those who understands binary code and those who dont!!!
Как у вас пауза
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
Связа на с ОДНОЙ секундой ?
_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.
Связа на с ОДНОЙ секундой ?
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Советую подредактировать название топика
прЕрывания
Верное замечание.
мышонок
прЕрывания
Верное замечание.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Да я так и подумал. Да следуйщим моим проектом будет охранная систем скоро выложу исходники и есле чо исправите? Ок?! 
Работу за других тут никто не делает.Krik99 писал(а):скоро выложу исходники и есле чо исправите? Ок?!
Подсказать и помочь - да. Но "Разработайте мне", "Исправьте мне" и т.п. - милости просим в указанный раздел Форума.
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
2Krik99Жздесь народ не злой, не подумай. Пойми правильно - ты выкладываеш листинг своей программы, у тебя что-то не работает, и ты предлагаеш исправить свои ошибки. Так вот перед тем как что либо исправитьь надо знать алгоритм, т.е. знать что автор хотел чтоб программа делала, потом определить что программа реально делает... Вобщем геморроя полно. А что если автор не правильно реализовал свой алгоритм? Форумчанам переписывать прогу? Вобщем из своей техникумовской жизни я помню что нет ничего хуже, чем разбиратся в чужой программе а потом ещё и пытатся переделать её так чтоб работало, ещё и чтоб правильно. Если автор темы хочет попробовоть как это, пусть попробует разобратся в программах из "Обучалки".
There is only 10 kind of people: those who understands binary code and those who dont!!!
я тормоз ну и что... человек осваивает "прИрывания" плохо пишет по-русски ну не все буквы знает... а вы ему какие-то алгоритмы втираете... вы хотите всё сделать на прерываниях и желательно в винавр... так вот название прерываний можно посмотреть в "iom8.h", к примеру.. а в WinAVR они задаются так:
вот мы и задали "прИрывание"... вот вопрос как это всё её работает?? так вот ответ на поверхности... механизм работы в даташите...
p.s. сам недавно научился читать... столько вещей интересных... рекомендую...
удачи вам в ваших начинаниях...
Код: Выделить всё
SIGNAL(SIG_ADC){
//пишем пишем и ещё раз пишем
}
p.s. сам недавно научился читать... столько вещей интересных... рекомендую...
удачи вам в ваших начинаниях...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Да а какой коэфициэнт диления надо ставить для таймера чтобы он срабатывал через 30сек??? Я знаю что для гдето 5сек. TCCR0=0x05; // 1/1024 а для 30 сек?
а он не может
в справочнике ищет слово "диления", а там такого нету...
если после прочитанной книги что-то в голове осталось, радуйся. Голова работает на тебя!!!
Кстати, секунда сокращённо пишется "с", а не "сек". 
Память очень интересная штука: бывает так, что запомнишь одно, а вспомнишь другое...
Вот так расчитываю я
я расчитывал таймер для выода секунд.
Хочу также добавить что почти не бываtn случаев когда для переполнения таймера 1с. достаточно выставить пределитель. По крайеней мере от встроенного генератора - точно. чаще всего таймер считает до значения меньше своей разрядности.
ЗдесьМК ATTiny2313 работает от внутр. RC-генератора.
Fuse выставлены на 4 МГц (В сост. лог "1" наход. CKSEL1).
Я расскажу как я рассуждал.
Итак частота МК 4 Мгц=4000000 тактов в сек.
Без пределителя один счёт 16 разр. таймера за
=> 1/4000000=0,00000025 сек.
при делителе 256 один счёт таймера
=> 0,00000025*256=0,000064 в сек.
значит счётов для переполнения в одну сек.
=> 1/0,000064=15625.
значит для переполнения в одну секунду необходимо занести в счётчик таймера
=>65536-15625 = 49111 <=> 0xC2F7 т.е. так
Код:
TCNT1H=С2;
TCNT1L=F7;
и затем запустить таймер установив соотвю пределитель:
Код:
TCCR1B=(1<<CS12);
также при каждом переполнении необходимо обновлять значение TCNT1.
я расчитывал таймер для выода секунд.
Хочу также добавить что почти не бываtn случаев когда для переполнения таймера 1с. достаточно выставить пределитель. По крайеней мере от встроенного генератора - точно. чаще всего таймер считает до значения меньше своей разрядности.
There is only 10 kind of people: those who understands binary code and those who dont!!!


