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

Добавлено: Сб авг 11, 2007 01:10:49
Negor
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);
Вот вырезка из справки... я не спорю, может и не прав... но в чём?

Добавлено: Сб авг 11, 2007 09:43:35
Krik99
Ммммммммммммм...
А чё в мою программу никак нельзя встроить паузу на таймерах??? :(

Добавлено: Сб авг 11, 2007 10:55:48
Mr.Moss
А я думаю что не стоит с самого начала усложнять прогу массивами, пусть сначала так какесть она заработает.
Единственная поправка, можно создать подпрограмму задержки и когда нужно ссылаться на нее.
Вообще конечно так делают в ассемблере, я просто не заню так ли это в Си, поправьте меня если я не прав.

Добавлено: Сб авг 11, 2007 12:57:57
Negor
Krik99 писал(а): А чё в мою программу никак нельзя встроить паузу на таймерах???
В приведённую тобой программу не целесообразно встраивать задержку на таймерах... если ты хочеш оставить именно её, то попробуй на дэлеях...
Mr.Moss писал(а): А я думаю что не стоит с самого начала усложнять прогу массивами, пусть сначала так какесть она заработает.
Не спорю. хотя с моей точки зрения - массив сложен в ассемблере(а уж тем более реализация многомерных массивов). В Си таких сложностей нет. Но это моё IMHO 8)

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

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, Но если тебе, так сказать, для самоутверждения надо сделать свою задержку на таймерах то вот примерный алгоритм:
тебе надо расчитать и на строить таймер на счёт в одну сек.(или сколько там) и запустить таймер. И ждать пока не установится флаг переполнения. После этого остановить таймер и продолжить программу. Примерно так :roll:

Добавлено: Сб авг 11, 2007 14:23:44
tych
Negor писал(а):может и не прав... но в чём?
в НАНО секундах.

Добавлено: Сб авг 11, 2007 14:53:12
Krik99
Вот сегодня закончил писать свою программу и вместо паузы использовал _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;

  }
}

Добавлено: Сб авг 11, 2007 15:29:26
Negor
Krik99 писал(а): его недостатком остаётся чтобы переключить эфект надо подержать с секунды 2 кнопку.
Всё правильно... Ведь опрос кнопки будет только после прохода всеё программы мигания... можеш попробовать сделать опрос кнопки по таймеру... Конечно переключение будет опять после прохода всего цикла мигания, но держать кнопку так долго уже не надо будет Но в таком случае тебе придётся позаботится об устранении дребезга контактов.

Добавлено: Сб авг 11, 2007 17:52:21
tych
Как у вас пауза

_delay_ms(2); //Тут пишем ПАУЗУ в 1 сек.

Связа на с ОДНОЙ секундой ?

Добавлено: Сб авг 11, 2007 17:52:58
tych
Советую подредактировать название топика

прЕрывания

Верное замечание. :) мышонок

Добавлено: Сб авг 11, 2007 22:36:10
Krik99
Да я так и подумал. Да следуйщим моим проектом будет охранная систем скоро выложу исходники и есле чо исправите? Ок?! :?

Добавлено: Вс авг 12, 2007 05:23:58
Мышонок
Krik99 писал(а):скоро выложу исходники и есле чо исправите? Ок?! :?
Работу за других тут никто не делает. :evil: Пройдите в "Из лап в лапы"! :evil:

Подсказать и помочь - да. Но "Разработайте мне", "Исправьте мне" и т.п. - милости просим в указанный раздел Форума.

Добавлено: Вс авг 12, 2007 12:34:40
Negor
2Krik99Жздесь народ не злой, не подумай. Пойми правильно - ты выкладываеш листинг своей программы, у тебя что-то не работает, и ты предлагаеш исправить свои ошибки. Так вот перед тем как что либо исправитьь надо знать алгоритм, т.е. знать что автор хотел чтоб программа делала, потом определить что программа реально делает... Вобщем геморроя полно. А что если автор не правильно реализовал свой алгоритм? Форумчанам переписывать прогу? Вобщем из своей техникумовской жизни я помню что нет ничего хуже, чем разбиратся в чужой программе а потом ещё и пытатся переделать её так чтоб работало, ещё и чтоб правильно. Если автор темы хочет попробовоть как это, пусть попробует разобратся в программах из "Обучалки".

Добавлено: Пн авг 13, 2007 16:54:21
Mozart
я тормоз ну и что... человек осваивает "прИрывания" плохо пишет по-русски ну не все буквы знает... а вы ему какие-то алгоритмы втираете... вы хотите всё сделать на прерываниях и желательно в винавр... так вот название прерываний можно посмотреть в "iom8.h", к примеру.. а в WinAVR они задаются так:

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

SIGNAL(SIG_ADC){
//пишем пишем и ещё раз пишем
}
вот мы и задали "прИрывание"... вот вопрос как это всё её работает?? так вот ответ на поверхности... механизм работы в даташите...
p.s. сам недавно научился читать... столько вещей интересных... рекомендую...

удачи вам в ваших начинаниях...

Добавлено: Вт авг 14, 2007 15:01:41
Krik99
Да а какой коэфициэнт диления надо ставить для таймера чтобы он срабатывал через 30сек??? Я знаю что для гдето 5сек. TCCR0=0x05; // 1/1024 а для 30 сек?

Добавлено: Вт авг 14, 2007 15:27:08
Serega
А самому пащетать не судьба? ;) Арифметика, третий класс.

Добавлено: Вт авг 14, 2007 17:26:14
Mozart
а он не может :) в справочнике ищет слово "диления", а там такого нету...

Добавлено: Вт авг 14, 2007 20:00:09
Мышонок
Кстати, секунда сокращённо пишется "с", а не "сек". :)

Добавлено: Ср авг 15, 2007 16:09:34
Negor
Вот так расчитываю я
МК 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с. достаточно выставить пределитель. По крайеней мере от встроенного генератора - точно. чаще всего таймер считает до значения меньше своей разрядности.