Обсуждаем контроллеры компании Atmel.
Ответить

ATMEGA8A. Две кнопки, два реле. На катушках реле меандр. ???

Ср ноя 02, 2022 17:21:40

Возникла необходимость перепрошить контроллер газировального аппарата. Старая слетела. Опыт программирования AVR минимален. Поизучал немного, и взялся. И сразу затыка. Написал на СИ прг.- две кнопки управляют двумя реле (через оптопары). При проверке осциллографом на катушках реле (или на входах оптопары) МЕАНДР. Это вместо высокого уровня.
Seturator.txt
(730 байт) Скачиваний: 59

Изображение

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 19:22:36

А что должно быть? К этому сумбуру как-бы исходника надо бы приложить свою хотелку. Я так понимаю: нажали одну кнопку - сработало реле, налило воды. А выключать? Вроде должно по таймеру? Где он? Где задержка?
Типичная ошибка новичка: "Я написал фигню, а она не робить. Почему?" А как должна? Где расписан алгоритм?

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 19:39:36

Наверное, микроконтроллер постоянно ресетится по ватчдогу или ещё какой-то причине

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 19:41:00

Спойлер
Код:
//==================
#define KEY_1_PIN  PIND
#define KEY_1      0

#define KEY_2_PIN  PIND
#define KEY_2      1

#define OUT_1_PORT PORTC
#define OUT_1_DDR  DDRC
#define OUT_1      0

#define OUT_2_PORT PORTC
#define OUT_2_DDR  DDRC
#define OUT_2      1
//==================

//==================
#define set_bit(reg, bit)  reg |= (1<<(bit))    // Установка бита.
#define clr_bit(reg, bit)   reg &= (~(1<<(bit))) // Сброс бита.
#define switch_bit(reg, bit)  reg ^= (1<<(bit)) // Переключение бита.
//----------
#define check_bit(reg, bit) (reg & (1<<bit))    // Проверка бита.
//==================

//==================
#define check_key_1() (!(check_bit (KEY_1_PIN, KEY_1))) // Low level
#define check_key_2() (!(check_bit (KEY_2_PIN, KEY_2))) // Low level
//==================

//==================
#define __out_1_on()  clr_bit (OUT_1_PORT, OUT_1) // Low level
#define __out_1_off() set_bit (OUT_1_PORT, OUT_1) // High level

#define __out_2_on()  clr_bit (OUT_2_PORT, OUT_2) // Low level
#define __out_2_off() set_bit (OUT_2_PORT, OUT_2) // High level
//==================

//==================
void out_1_on (void);
void out_1_off (void);

void out_2_on (void);
void out_2_off (void);
//==================

//==================
void out_1_on (void)
{
   __out_1_on ();
}

void out_1_off (void)
{
   __out_1_off ();
}

void out_2_on (void)
{
   __out_2_on ();
}

void out_2_off (void)
{
   __out_2_off ();
}
//==================

int main(void)
{
// IO init
   set_bit (OUT_1_PORT, OUT_1); // Логика управления отрицательная,
   set_bit (OUT_2_PORT, OUT_2); // то есть, активный логический 0. Поэтому сразу выставляем 1.

// Важно. Если логика отрицательная, порты выставлять в 1 в первую очередь. Если сначала выставить DDRx, то нижние ключи выдадут кратковременный 0. Поэтому, сначала PORTx. Так верхние ключи сразу выдадут 1.

   set_bit (OUT_1_DDR, OUT_1); // Out_1. Выход.
   set_bit (OUT_2_DDR, OUT_2); // Out_2. Выход.
   
   while (1)
   {
      if (check_key_1 ()) // проверка кн. "газ вода
         out_1_on ();     // вкл. клапан "газ.вода"
      else
         out_1_off ();    // выкл. клапан "газ.вода"

      if (check_key_2 ()) // проверка кн. "хол. вода"
         out_1_on ();     // вкл. клапан "хол.вода"            
      else
         out_1_off ();     // выкл. клапан "хол.вода"            
   }
}
Последний раз редактировалось Demiurg Ср ноя 02, 2022 22:44:30, всего редактировалось 4 раз(а).

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 19:44:52

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

Добавлено after 54 seconds:
Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр. ???
вот у Demiurg выключение однозначное.

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 21:23:59

Вы проверяете две кнопки, но включаете одну и туже катушку. Когда кнопка первая нажата то реле включается, а при проверке на вторую кнопку - -выключается. У вас опечатка банальная из-за копипаста

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 21:51:35

Тогда зачем второе реле, если на первом 2 кнопки - это ПУСК и СТОП ? И вообще - нафиг тут МК? Одного таймера - больше чем достаточно.
Что-то тут недоговорено. Вспоминаю соотв. эпизод из "Особенностей национальной рыбалки" :)

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 22:12:19

alex1126 Нет. ТС не разобрался с битовыми операциями.
Код:
    PORTC^=(1<<PC0);                   // вкл. клапан "газ.вода" // Инверсия. XOR
    }
        else
        {
        PORTC|=(1<<PC0);                   // выкл. клапан "газ.вода"

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Ср ноя 02, 2022 22:35:48

ааааа, я не тот исходник смотрел :) но в нем тоже ошибка :)

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Чт ноя 17, 2022 20:57:25

Возникла необходимость перепрошить контроллер газировального аппарата. Старая слетела. Опыт программирования AVR минимален. Поизучал немного, и взялся. И сразу затыка. Написал на СИ прг.- две кнопки управляют двумя реле (через оптопары). При проверке осциллографом на катушках реле (или на входах оптопары) МЕАНДР. Это вместо высокого уровня.
Seturator.txt

Изображение

Принципиальную схему и блок-схему алгоритма работы предоставьте, чтобы можно было вам помочь.

Re: ATMEGA8A. Две кнопки, два реле. На катушках реле меандр.

Чт ноя 17, 2022 21:09:23

Уже решено. Тс применял неправильные битовые операции.
Ответить