- Вложения
-
- REAL.rar
- (75 КБ) 199 скачиваний
Atmega 8: генерация произвольных временных интервалов
Доброго времени суток, уважаемые! Не могу понять почему не работает программа генератора случайных временных интервалов. Программирую в CodevisionAVR. Суть задачи в следующем: настроил прерывания таймера 1 атмеги на 1 с, по прерыванию увеличиваю переменную. При помощи команды rand генерирую целое число от 0 до 10. По идее контроллер должен сложить сгенерированное число с нужным мне временным интервалом(20 секунд) и сравнить с содержимым переменной в таймере,если таймер досчитал до 20+rand() то должен загореться светодиод. Вот только на практике что-то все не так. Прилагаю файлы проекта в Codevision и в Proteus. Помогите советом плиз, это мой первый проект,буду очень признателен за помощь 
- Реклама
- Сообщения: 828
- Зарегистрирован: Пн мар 16, 2009 21:40:57
Вы в PROTEUS "шагали" по проге ? Должно же видно быть что происходит не так как вы ожидали.
Для этого симляторы и есть что бы примерно показать процессы внутри микроконтроллера или схемы.
Для этого симляторы и есть что бы примерно показать процессы внутри микроконтроллера или схемы.
- Сообщения: 84
- Зарегистрирован: Вт ноя 25, 2008 18:56:41
В протеусе шагал, светодиод загарается, только загарается всегда через одинаковые промежутки времени. Такое ощущение что я просто не до конца понял как работает функция rand. Она генерирует всегда одно и то же число.
while (1)
{
// организация промежутка времени
srand(9);
i=rand()%11; // генерируется число от 0 до 10
if (sec==(10+i))
{
PORTB.1=0;
delay_ms(900);
PORTB.1=1;
sec=0;
}
while (1)
{
// организация промежутка времени
srand(9);
i=rand()%11; // генерируется число от 0 до 10
if (sec==(10+i))
{
PORTB.1=0;
delay_ms(900);
PORTB.1=1;
sec=0;
}
Пока таймер считает цикл while будет постоянно выполняться, т.е. rand всегда будет выдавать новые числа? Как можно еще реализовать генерацию случайных отрезков времени?
- Реклама
- Сообщения: 84
- Зарегистрирован: Вт ноя 25, 2008 18:56:41
Эффект тот же. Таймер отсчитывает 10 секунд как и положено+ 2с сгенерированные рандомом.Только этот рандом всегда генерирует 2 секунды.Либо сгенерировал один раз и дальше значение не изменяется:(. Пробовал вынести генерацию чисел за функцию While,пока все так же.OBIVAN писал(а):допишите строчку ограничения интервала сек. If(sec>30)sec=0;
label:
srand(9);
i=rand()%11; // генерируется число от 0 до 10
while (1)
{
if (sec==(10+i))
{
PORTB.1=0;
delay_ms(900);
PORTB.1=1;
sec=0;
goto label;
}
if(sec>30)sec=0;
Может быть для получения произвольных промежутков времени стоит использовать массив из произвольных чисел забитых ручками? Только как реализовать их перебор по кругу?
- Сообщения: 84
- Зарегистрирован: Вт ноя 25, 2008 18:56:41
А можно как-нибудь реализовать произвольную задержку по времени используя таймер, а не функцию delay? Не хотелось бы просто занимать вычислительные мощности контроллера
Типа святое - именно так и нужно делать.
Нормально заработал следующий вариант:
i=5; // задаю начальное значение переменной
srand(sec+(rand()));
while (1)
{
if (sec==(i)) // Если счетчик равен сгенерированному числу i +зедержке в 5с,то зажечь светодиод
{
i=0;
PORTB.1=0;
delay_ms(900);
PORTB.1=1;
sec=0;
i=rand()%11;
}
}
Правда получается псевдо случайные промежутки времени. После сброса МК выдаст те же самые интервалы. Спасибо всем за помощь
i=5; // задаю начальное значение переменной
srand(sec+(rand()));
while (1)
{
if (sec==(i)) // Если счетчик равен сгенерированному числу i +зедержке в 5с,то зажечь светодиод
{
i=0;
PORTB.1=0;
delay_ms(900);
PORTB.1=1;
sec=0;
i=rand()%11;
}
}
Правда получается псевдо случайные промежутки времени. После сброса МК выдаст те же самые интервалы. Спасибо всем за помощь
для того чтоб этого не было перед rand() поставь srand(инт семечко).
Там где семечко - число с которого будет происходить рандомизация... другими словами - записывайте туда какое то число типа счетчика таймера - то есть то, что изначально случайно
Там где семечко - число с которого будет происходить рандомизация... другими словами - записывайте туда какое то число типа счетчика таймера - то есть то, что изначально случайно


