Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 1
Регистрация: 26.08.2009
Сообщений: 21
1

Мигалка на 3х группах светодиодах на Atmega8. Как использовать случайную величину?

18.06.2016, 10:39. Показов 1970. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Рабочий код-мигалка на 3х группах светодиодах на Atmega8.В ПРОТЕУСе он работает. Вопрос,как использовать случайную величину 100+rand()%1000 для _delay_ms(). Мои попытки успехом не увенчались. Что делать, куда копать...Заранее большое спасибо!
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*  Atmega 8  */
 
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
 
 
void preset(){
 
DDRB = 0xFF;    //0xFF=0b11111111, PORTB-OUT
PORTB = 0x00;   //0x00 = 0b00000000, Default PORTB - OFF
DDRC = 0b1111111;   //0xFF=0b1111111, PORTC-OUT
PORTC = 0x00;   //0x00 = 0b00000000, Default PORTC - OFF
DDRD = 0xFF;    //0xFF=0b11111111, PORTD-OUT
PORTD = 0x00;   //0x00 = 0b00000000, Default PORTD - OFF
}
 
int main(void)
{
 
preset();
while (1) {
 
{
//Подать сигнал
PORTB = 0xFF; 
//Выдержать паузу
_delay_ms ();
//Убрать сигнал
PORTB = 0x00; 
//Выдержать паузу
_delay_ms ();
}
{
//Подать сигнал
PORTC = 0b1111111;
//Выдержать паузу
_delay_ms ();
//Убрать сигнал
PORTC = 0x00;
//Выдержать паузу
_delay_ms ();
}
{
//Подать сигнал
PORTD = 0xFF;
//Выдержать паузу
_delay_ms ();
//Убрать сигнал
PORTD = 0x00;
//Выдержать паузу
_delay_ms ();
}
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.06.2016, 10:39
Ответы с готовыми решениями:

Как добавить случайную величину к сигналу?
Здравствуйте! я хочу добавить случайную величину (нормальное распределение ) к сигналу на...

Случайную величину Х умножили на k. Как от этого изменяются ее характеристики
Случайную величину Х умножили на k. Как от этого изменяются ее характеристики: 1) математическое...

Имеется 20 точек с одинаковым X и разными Y. Как для них найти центрированную случайную величину?
Имеется 20 точек с одинаковым X и разными Y. Как для них найти центрированную случайную величину?...

Смоделируйте случайную величину
Здравствуйте! Вот такая задача: случайную величину с показательным распределением с параметром...

Найти случайную величину X
Случайная величина X задана плотностью распределения.Найти: a)Значение коэффициента A; б)функцию...

15
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
18.06.2016, 11:01 2
fern, для выделения кода существуют теги
выделяешь код, жмешь кнопочку, сверху над окном текста, С для Си, ASM для ассемблера
и будет тебе щастье

Добавлено через 2 минуты
Цитата Сообщение от fern Посмотреть сообщение
Вопрос,как использовать случайную величину 100+rand()%1000 для _delay_ms().
Цитата Сообщение от fern Посмотреть сообщение
C
1
_delay_ms ();
покажи реализацию или хотя бы объявление функции _delay_ms, сдается мне там аргумент должен быть, время на сколько задерживать
0
R0
17 / 17 / 13
Регистрация: 06.08.2015
Сообщений: 73
18.06.2016, 18:51 3
Цитата Сообщение от fern Посмотреть сообщение
<stdlib.h>
в этомо файле подключена библиотека
C
1
rand()
C
1
_delay_ms (100+rand()%1000);
вроде без параметра функция _delay_ms() не работает.
1
1176 / 653 / 111
Регистрация: 15.05.2012
Сообщений: 4,015
20.06.2016, 06:57 4
С параметром-константой? Не помню.
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.06.2016, 07:25 5
В большинстве компиляторов для AVR _delay_ms() НЕ ФУНКЦИЯ А МАКРОС! и не может в качестве аргумента получать переменную, а только константу
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
20.06.2016, 07:29 6
Цитата Сообщение от Витальич Посмотреть сообщение
В большинстве компиляторов для AVR _delay_ms() НЕ ФУНКЦИЯ А МАКРОС!
вот для этого я и прошу
Цитата Сообщение от ValeryS Посмотреть сообщение
покажи реализацию или хотя бы объявление функции _delay_ms,
0
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
20.06.2016, 07:50 7
C
1
2
3
4
void x_delay(unsigned int i)
{ 
  while (--i) nop();
}
Внимание! "nop()" для вашего компилятора может выглядеть иначе
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
20.06.2016, 08:35 8
Цитата Сообщение от Витальич Посмотреть сообщение
Внимание! "nop()" для вашего компилятора может выглядеть иначе
ежли не включать оптимизацию то можно и без него обойтись


C
1
2
3
4
void x_delay(unsigned int i)
{ 
  while (--i) ;
}
хотя и не все оптимизаторы выкидывают пустые циклы, зависит от компилятора и уровня оптимизации
Но это совсем другая история....
1
2 / 2 / 1
Регистрация: 26.08.2009
Сообщений: 21
23.06.2016, 00:24  [ТС] 9
Лучший ответ Сообщение было отмечено ValeryS как решение

Решение

Всем большое спасибо за ответы.Задача решена.Вот полностью рабочий код для 3х групп светодиодов с использованием _delau_ms() в AtmelStudio.Кому интересно можете посмотреть и проверить ...

Atmega 8 */

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#define F_CPU 8000000
#define __DELAY_BACKWARD_COMPATIBLE__
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <time.h>
 
void preset(){
    
    DDRB = 0xFF; //0xFF=0b00000001, PORTB-OUT
    PORTB = 0x00; //0x00 = 0b00000000, Default PORTB - OFF
    DDRC = 0b1111111; //0xFF=0b00000001, PORTC-OUT
    PORTC = 0x00; //0x00 = 0b00000000, Default PORTC - OFF
    DDRD = 0xFF; //0xFF=0b00000001, PORTD-OUT
    PORTD = 0x00; //0x00 = 0b00000000, Default PORTD - OFF
    
}
 
 
int main(void)
{
    
    srand(time(NULL));
    preset();
    
    while (1) {
        
    {
        volatile unsigned int c=100+rand()%500;
        volatile unsigned int d=100+rand()%300;
        //Подать сигнал
        PORTB = 0xFF; 
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTB = 0x00; 
        //Выдержать паузу
        _delay_ms (d);
    }
     
    {
        volatile unsigned int c=100+rand()%500;
        volatile unsigned int d=100+rand()%500;
        //Подать сигнал
        PORTC = 0b1111111;
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTC = 0x00;
        //Выдержать паузу
        _delay_ms (d);
    }
    
    {
        volatile unsigned int c=100+rand()%300;
        volatile unsigned int d=100+rand()%500;
        //Подать сигнал
        PORTD = 0xFF;
        //Выдержать паузу
        _delay_ms (c);
        PORTD = 0x00;
        //Выдержать паузу
        _delay_ms (d);
    }
    }
}
2
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.06.2016, 05:42 10
Цитата Сообщение от fern Посмотреть сообщение
PORTC = 0b1111111;
Цитата Сообщение от fern Посмотреть сообщение
PORTC = 0x00;
ты уж выбери один стиль, или двоичный или шестнадцатеричный
рекомендую шестнадцатеричный, поскольку стандартный Си не поддерживает двоичного представления констант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int main(void)
{
    
    srand(time(NULL));
    preset();
    
    while (1) {
        
    {
        volatile unsigned int c=100+rand()%500;
        volatile unsigned int d=100+rand()%300;
        //Подать сигнал
        PORTB = 0xFF; 
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTB = 0x00; 
        //Выдержать паузу
        _delay_ms (d);
    }
     
    {
        volatile unsigned int c=100+rand()%500;
        volatile unsigned int d=100+rand()%500;
        //Подать сигнал
        PORTC = 0b1111111;
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTC = 0x00;
        //Выдержать паузу
        _delay_ms (d);
    }
    
    {
        volatile unsigned int c=100+rand()%300;
        volatile unsigned int d=100+rand()%500;
        //Подать сигнал
        PORTD = 0xFF;
        //Выдержать паузу
        _delay_ms (c);
        PORTD = 0x00;
        //Выдержать паузу
        _delay_ms (d);
    }
    }
}
теперь тоже самое но по фен-шую
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int main(void)
{
        volatile unsigned int c;
        volatile unsigned int d;
    
    srand(time(NULL));
    preset();
    
    while (1)
   {
       c=100+rand()%500;
       d=100+rand()%300;
        //Подать сигнал
        PORTB = 0xFF; 
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTB = 0x00; 
        //Выдержать паузу
        _delay_ms (d);
 
        c=100+rand()%500;
        d=100+rand()%500;
        //Подать сигнал
        PORTC = 0xFF;
        //Выдержать паузу
        _delay_ms (c);
        //Убрать сигнал
        PORTC = 0x00;
        //Выдержать паузу
        _delay_ms (d);
       
        c=100+rand()%300;
        d=100+rand()%500;
        //Подать сигнал
        PORTD = 0xFF;
        //Выдержать паузу
        _delay_ms (c);
        PORTD = 0x00;
        //Выдержать паузу
        _delay_ms (d);
   
    }
}
3
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
23.06.2016, 19:06 11
Цитата Сообщение от ValeryS Посмотреть сообщение
srand(time(NULL));
а это точно будет давать случайный разброс?
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
23.06.2016, 21:03 12
Цитата Сообщение от Voland_ Посмотреть сообщение
а это точно будет давать случайный разброс?
по стандарту должна
time(NULL) должна вернуть текущее время
но вот как с этим обстоит дело в АВРках?
в качестве генератора случайных чиселможно использовать АЦПуху, ножка в воздухе, ловит помехи, ну и берем младшие разряды АЦП
1
1976 / 1275 / 130
Регистрация: 04.01.2010
Сообщений: 4,607
23.06.2016, 22:10 13
Цитата Сообщение от ValeryS Посмотреть сообщение
ну и берем младшие разряды АЦП
вот-вот, поддерживаю.
0
15 / 15 / 2
Регистрация: 08.02.2013
Сообщений: 198
27.06.2016, 12:19 14
Цитата Сообщение от ValeryS Посмотреть сообщение
ножка в воздухе, ловит помехи

Не по теме:

он и без помех не пойми че выдает в младших разрядах

0
0 / 0 / 0
Регистрация: 20.09.2016
Сообщений: 1
20.09.2016, 01:40 15
А как можно применить эти функции чтобы каждый диод на PORTB мигал случайным образом?
0
Витальич
20.09.2016, 07:20     Мигалка на 3х группах светодиодах на Atmega8. Как использовать случайную величину?
  #16
 Комментарий модератора 
lego1, Создайте свою тему! Правило форума, пункт 4.4 На каждый вопрос создавайте по одной теме.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2016, 07:20

Найти случайную бернуллевскую величину
Здравствуйте! Задача состоит в том, чтобы составить алгоритм, с помощью которого из случайной...

Описать двумерную дискретную случайную величину
пожалуйста,нужна программа которая будет описывать двумерную дискретную случайную величину, т.е....

Смоделировать случайную величину с нормальным законом распределения
(Помогите,пожалуйста ,написать программу на языке си,очень нужно,если не сложно,то с...

Смоделировать случайную величину с нормальным законом распределения
(Помогите,пожалуйста ,написать программу на языке си,очень нужно,если не сложно,то с...

Сгенерировать случайную величину для непрерывного распределения
Задано распределение P(x=j)=0.15 для j=1,2,3,4,5 и P(x=j)=0.05 для j=6,7,8,9,10. Нужно в матлабе...

Функция на VBA, возвращающая случайную величину по нормальному распределению
Посоветуйте способ преобразования равномерно распределённой случайной величины (стандартная функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru