Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
mega2411
0 / 0 / 0
Регистрация: 26.05.2012
Сообщений: 207
1

Реле времени на attiny2313

15.04.2019, 11:57. Просмотров 176. Ответов 3
Метки нет (Все метки)

Доброго времени суток, помогите с такой проблемой. пишу программу для автоматического управления вытяжкой для МК в Atmel Studio. проект приложен к теме. проблема в том, что не могу реализовать работу по времени. подключен датчик dht11.
настройка таймера на работу
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
#define MS_DIVIDER 4
#define CTC_MATCH_OVERFLOW ((F_CPU / 1000) / (8 * MS_DIVIDER))
 
volatile unsigned long timer1_ticks; 
 
//обработчик прерывания
ISR (TIMER1_COMPA_vect)
{
    timer1_ticks++;
}
 
void timer1_ticks_init()
{
    // настройка таймера
    // CTC режим, делим частоту кварца на 8
    TCCR1B |= (1 << WGM12) | (1 << CS11);
    
    //устанавливаем значение для модуля сравнения
    OCR1AH = (uint8_t)(CTC_MATCH_OVERFLOW >> 8);
    OCR1AL = (uint8_t) CTC_MATCH_OVERFLOW;
 
    // Разрешить прерывание таймера
    TIMSK |= (1 << OCIE1A);
}
/*  TIMSK |= (1 << TOIE1);
    TCCR1B |= (1 << CS12) | (1 << CS10);
    SREG |= (1 << 7); */
 
unsigned long ticks()
{
    unsigned long ticks_return;
 
    //должно быть атомарно, чтобы значение ticks_return было корректным 
    //во время внезапного возникновения прерывания 
    ATOMIC_BLOCK(ATOMIC_FORCEON)
    {
        ticks_return = timer1_ticks;
    }
 
    return ticks_return;
}
само тело программы
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
long time_since = ticks();
  USART_Init();
  while (1)
  {
    dht_read();
    //ave.push(h);
    if (!(PIN_B & (1 << BUT_PIN)))
    {
      _delay_ms(50);
      OUT_ON;
    }
    else
    {
      _delay_ms(50);
      OUT_OFF;
    }
    if (h >= H_min)
    {
        OUT_ON;
        if (time_since - previousMillis > (RAB_INTERVAL * 10000))
        {
          previousMillis = time_since;
          OUT_ON;
        }
        else
        {
          if (time_since - previousMillis > (STOP_INTERVAL * 10000))
          {
            previousMillis = time_since;
            OUT_OFF;
          }
        }
    }
    else
    {
        OUT_OFF;
    }
}
}
0
Вложения
Тип файла: zip wet2.zip (36.3 Кб, 3 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2019, 11:57
Ответы с готовыми решениями:

Attiny2313. Реле времени
Здравствуйте. Подскажите как реализовать выключение после нажатия кнопки TIMER, мк должен отсчитать...

Управление реле с пульта на ATtiny2313
Всем привет. Ребят подскажите, где можно взять или хотя бы примерный код для управления реле с...

Не работает реле времени NM4021
Купил набор от МастерКит: NM4021 - Таймер 1...99 минут на микроконтроллере. Все собрал , ничего не...

Делаю реле времени для пускового конденсатора на тини13 не получается
Добрый день все участникам... В общем делаю реле времени для отключения пускового конденсатора...

Реле времени
Нужна помощь в создании реле времени. Использую микроконтроллер ESP 12F (NodeMCU). Нужно что бы...

3
Max Dark
шКодер самоучка
1992 / 1760 / 869
Регистрация: 09.10.2013
Сообщений: 3,887
Записей в блоге: 6
Завершенные тесты: 2
16.04.2019, 09:01 2
mega2411, опишите словами желаемый алгоритм работы.
0
pyzhman
809 / 499 / 70
Регистрация: 15.05.2012
Сообщений: 2,826
16.04.2019, 11:01 3
Цитата Сообщение от mega2411 Посмотреть сообщение
по времени
По UTC или как?
0
Max Dark
шКодер самоучка
1992 / 1760 / 869
Регистрация: 09.10.2013
Сообщений: 3,887
Записей в блоге: 6
Завершенные тесты: 2
17.04.2019, 01:51 4
mega2411, примерно так
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
int main(void)
{
    // состояние кнопок
    uint_fast8_t
        btn_current = 0, // текущее
        btn_prev    = 0, // предыдущее
        btn_pressed = 0; // сменившие состояние
 
    // режим работы, стартуем в автомате
    bool auto_mode = true;
 
    // показания датчика выше нормы
    bool value_fail = false;
 
    // настроить пины
    io_init();
    // настроить сеть
    // usart_init(BAUDRATE);
    // настроить таймер
    sysclock_init();
    // запустить опрос датчика через 1 секунду
    task_set_timeout(TASK_SENSOR_UPDATE, 1 * SECOND);
 
    // пуск таймера
    enable_interrupts();
 
    do {
        // опросить кнопки
        btn_current = BTN_INP;
        btn_current &= (BTN_MANUAL | BTN_SWITCH);
 
        // отловим событие нажатия
        //FIXME: нужна защита от дребезга контактов
        btn_pressed = btn_current & (~btn_prev);
        btn_prev = btn_current;
 
        // нажата кнопка выбора режима
        if (btn_pressed & BTN_MANUAL)
        {
            // переключить режим: авто <-> ручное
            auto_mode = ! auto_mode;
            // переходим на ручное
            if (!auto_mode)
            {
                // отменить таймер реле
                task_cancel(TASK_RELAY);
                // выход реле оставляем в том же состоянии
                // relay_off();
            }
        }
        
        // опрос датчика 1 раз в секунду
        if (task_is_done(TASK_SENSOR_UPDATE))
        {
            // опросить датчик
            //TODO: реакция на ошибку связи с датчиком
            dht11_read(&sensor);
            // отправить данные
            // usart_send
            // повторить опрос
            task_set_timeout(TASK_SENSOR_UPDATE, 1 * SECOND);
        }
 
        // работа реле
        if (auto_mode)
        {
            // автомат:
            // если показания датчика превышает порог,
            value_fail = sensor.data[0] >= 200;
            if (value_fail)
            {
                // то проветривать пока не нормализуется
                {
                    // цикл ожидания окончен?
                    if (task_is_done(TASK_RELAY))
                    {
                        // переключим состояние реле
                        relay_toggle();
                        // обновим цикл
                        if (relay_is_on())
                            task_set_timeout(TASK_RELAY, 5 * MINUTE);
                        else
                            task_set_timeout(TASK_RELAY, 2 * MINUTE);
                    }
                }
            }
            else
            {
                // показания в норме, выключим реле
                relay_off();
                task_cancel(TASK_RELAY);
            }
        } 
        else
        {
            // ручное управление: открыть <-> закрыть по нажатию кнопки
            if (btn_pressed & BTN_SWITCH)
            {
                relay_toggle();
            }
        }
    }
    while(true);
}
Только учтите, что это всего лишь черновой набросок
0
Вложения
Тип файла: 7z tinix.7z (28.0 Кб, 1 просмотров)
17.04.2019, 01:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.04.2019, 01:51

Реле времени
Помогите спроектировать простое цифровое устройство &quot;Реле времени от 0 до 9 секунд с дискретностью...

Задача на реле времени
Работаю в ОВиК, поступила задча собрать из имеющегося, помогите, как можно решить задачу эту? ...

Как обойти реле времени?
Ситуация: старый немецкий станок. На нем 4 привода. Кнопкой пуск включаются все 4 , но из них 1...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru